【问题标题】:How to save GLSurfaceView to texture/buffer/bitmap如何将 GLSurfaceView 保存到纹理/缓冲区/位图
【发布时间】:2012-12-26 17:11:59
【问题描述】:

我正在使用 GLSurfaceView 开发适用于 Android 的应用程序。有一刻我必须在那一刻用它的图像替换我的 GLSurfaceView。问题是,如何获得正确的图像?我使用了这段代码:

    v.setDrawingCacheEnabled(true);
    v.measure(View.MeasureSpec.makeMeasureSpec(500, View.MeasureSpec.AT_MOST),
            View.MeasureSpec.makeMeasureSpec(500, View.MeasureSpec.AT_MOST));
    v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());

    v.buildDrawingCache(true);
    Bitmap b = Bitmap.createBitmap(v.getDrawingCache());
    v.setDrawingCacheEnabled(false); // clear drawing cache
    return b;

但它总是返回黑色位图。

也许我们可以制作 Bitmap 以外的东西(也可以放置到 GLSurfaceView)?

【问题讨论】:

    标签: java android opengl-es bitmap


    【解决方案1】:

    我认为它不适用于GLSurfaceView。帧缓冲区可能位于 GPU 内部,而 CPU 无法直接访问它。

    您可以使用framebuffer object 将图像渲染为纹理,然后使用glReadPixels 将数据下载到缓冲区并将缓冲区转换为Bitmap

    【讨论】:

    • 您好 Thomas,感谢您的回答。你能建议任何示例代码或链接..
    • @Thomas 我正在做同样的事情来保存位图。但我只想获得位图部分,即 GLSurfaceView 的其他部分。该怎么做?
    • 如果它与此处提出的不同,请为此打开一个新问题。
    【解决方案2】:

    将 GLSurfaceView 保存到位图。它的工作正确。

    MyRenderer Class :
    
    @Override
    public void onDrawFrame(GL10 gl) {
    
    
    try {
        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() ;
    }
    

    【讨论】:

    • 请编辑您的答案并格式化代码以使其可读
    • @harikrishnan 您的代码可以很好地将 GLSurfaceView 保存为位图。但我想只保存我在该表面视图上显示的位图。
    猜你喜欢
    • 1970-01-01
    • 2014-12-05
    • 2016-09-26
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多