1

我正在使用 OpenGL ES2.0 开发像 android 中的桌面一样的 autocad 应用程序。我在 GLSurfaceview 中绘制了一些对象,例如线条、圆和线性尺寸标注等。在 GLSurfaceview 上绘制对象之后。我是 GLSurfaceview 的捕获屏幕并进行 PDF 文件转换。然后,打开pdf文件,有些对象丢失了......

这是我的输出 First-image : my Original output , Second-image : PDF File output ...

原始输出

PDF 文件输出

我的代码:

笔记:在此代码中,当我单击按钮时,它会将屏幕截图作为图像并保存在 sdcard 位置。我在 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