1

OpenGL ES2.0 を使用して、Android のデスクトップのような autocad アプリのように開発しています。線、円、直線寸法などの GLSurfaceview でいくつかのオブジェクトが描画されます。GLSurfaceview でオブジェクトを描画した後。GLSurfaceviewの画面をキャプチャーしてPDFファイル変換しています。次に、pdf ファイルを開くと、一部のオブジェクトが欠落しています....

これは私の出力です 最初の画像:私の元の出力、2番目の画像:PDFファイル出力...

元の出力

PDFファイル出力

私のコード:

注:このコードでは、ボタンをクリックすると、スクリーンショットが画像として取得され、SD カードの場所に保存されます。ondraw メソッドの if 条件でブール条件を使用しました。なぜなら、レンダラー クラス、ondraw メソッドがいつでも呼び出されているからです。とにかく、このコードはブール条件なしで実行され、メモリ カードに多くの画像が保存されたので、このブール条件を入れました。

MainActivity クラス:

protected boolean printOptionEnable = false;

saveImageButton.setOnClickListener( new OnClickListener() {

   @Override
   public void onClick(View v) {
      Log.v("hari", "pan button clicked");
      isSaveClick = true;
      myRenderer.printOptionEnable = isSaveClick;
   }
} );

MyRenderer クラス:

int width_surface , height_surface ;
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
   Log.i("JO", "onSurfaceChanged");
   // Adjust the viewport based on geometry changes,
   // such as screen rotation
   GLES20.glViewport(0, 0, width, height);

   float ratio = (float) width / height;

   width_surface =  width ;
   height_surface = height ;
}

//---------------------------------------------------------------------

@Override
public void onDrawFrame(GL10 gl) {

   try {
      if ( printOptionEnable )  {
         printOptionEnable = false ;
         Log.i("hari", "printOptionEnable if condition:"+printOptionEnable);
         int w = width_surface ;
         int h = height_surface  ;

         Log.i("hari", "w:"+w+"-----h:"+h);

         int b[]=new int[(int) (w*h)];
         int bt[]=new int[(int) (w*h)];
         IntBuffer buffer=IntBuffer.wrap(b);
         buffer.position(0);
         GLES20.glReadPixels(0, 0, w, h,GLES20.GL_RGBA,GLES20.GL_UNSIGNED_BYTE, buffer);
         for(int i=0; i<h; i++)
         {
            //remember, that OpenGL bitmap is incompatible with Android bitmap
            //and so, some correction need.        
            for(int j=0; j<w; j++)
            {
               int pix=b[i*w+j];
               int pb=(pix>>16)&0xff;
               int pr=(pix<<16)&0x00ff0000;
               int pix1=(pix&0xff00ff00) | pr | pb;
               bt[(h-i-1)*w+j]=pix1;
            }
         }           
         Bitmap inBitmap = null ;
         if ( inBitmap == null || !inBitmap.isMutable() ||
              inBitmap.getWidth() != w || inBitmap.getHeight() != h) {
            inBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
         }
         //Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
         inBitmap.copyPixelsFromBuffer(buffer);
         //return inBitmap ;
         // return Bitmap.createBitmap(bt, w, h, Bitmap.Config.ARGB_8888);
         inBitmap = Bitmap.createBitmap(bt, w, h, Bitmap.Config.ARGB_8888);

         ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
         inBitmap.compress(CompressFormat.JPEG, 90, bos); 
         byte[] bitmapdata = bos.toByteArray();
         ByteArrayInputStream fis = new ByteArrayInputStream(bitmapdata);

         final Calendar c=Calendar.getInstance();
         long mytimestamp=c.getTimeInMillis();
         String timeStamp=String.valueOf(mytimestamp);
         String myfile="hari"+timeStamp+".jpeg";

         dir_image=new File(Environment.getExternalStorageDirectory()+File.separator+
           "printerscreenshots"+File.separator+"image");
         dir_image.mkdirs();

         try {
            File tmpFile = new File(dir_image,myfile); 
            FileOutputStream fos = new FileOutputStream(tmpFile);

            byte[] buf = new byte[1024];
            int len;
            while ((len = fis.read(buf)) > 0) {
               fos.write(buf, 0, len);
            }
            fis.close();
            fos.close();
         } catch (FileNotFoundException e) {
            e.printStackTrace();
         } catch (IOException e) {
            e.printStackTrace();
         }

         Log.v("hari", "screenshots:"+dir_image.toString());
      }
   } catch(Exception e) {
      e.printStackTrace() ;
   }
}

誰か助けてください..

事前に感謝

4

0 に答える 0