ImageView 不使用位图的 alphachannel

ImageView not using alphachannel of bitmap

我在将对象渲染到屏幕外以创建其位图并将其显示在图像视图中时遇到一点问题。它没有正确拍摄 alpha 通道。

当我将位图保存为 png 并加载它时,它工作正常。但是当我直接将它加载到图像视图中时,我会看到白色背景,这是没有 alpha 通道的实际背景颜色。

这里是从我的 EGL Surface 导出位图的代码:

public Bitmap exportBitmap() {
    ByteBuffer buffer = ByteBuffer.allocateDirect(w*h*4);
    GLES20.glReadPixels(0, 0, w, h, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buffer);
    Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    bitmap.copyPixelsFromBuffer(buffer);
    Log.i("Render","Terminating");
    EGL14.eglMakeCurrent(oldDisplay, oldDrawSurface, oldReadSurface, oldCtx);
    EGL14.eglDestroySurface(eglDisplay, eglSurface);
    EGL14.eglDestroyContext(eglDisplay, eglCtx);
    EGL14.eglTerminate(eglDisplay);
    return bitmap;
}

这里是设置图像视图的代码(r 是 class 包含前面的函数):

Bitmap bm;
bm = r.exportBitmap();
ImageView infoView = (ImageView)findViewById(R.id.part_icon);
infoView.setImageBitmap(bm);

我是否必须在 ImageView 上设置一些标志或在位图的配置中设置一些东西?

我将添加一些代码示例和图像来阐明问题: 首先是我希望它的工作方式:

bm = renderer.exportBitmap();

第二种工作方式,保存为 png 解决方法:

bm = renderer.exportBitmap();

//PNG To Bitmap
String path = Environment.getExternalStorageDirectory()+"/"+getName()+".png";
bm.compress(CompressFormat.PNG, 100, new FileOutputStream(new File(path)));
bm = BitmapFactory.decodeFile(path);

第三次澄清我的预乘。 Alpha 被错误的考虑方式:

        bm = renderer.exportBitmap();
        for(int x=bm.getWidth()-50; x<bm.getWidth(); x++) {
            for(int y=bm.getHeight()-50; y<bm.getHeight(); y++) {
                int px = bm.getPixel(x,y);
                bm.setPixel(x, y, 
                        Color.argb(255,
                        Color.red(px),
                        Color.green(px),
                        Color.blue(px)));
            }
        }  

抱歉这么久 post。

我已经更改了 exportBitmap() 函数。基本上我读取像素并再次写入它们。这正在解决问题。我真的不知道为什么。如果有人可以向我解释,那就太好了。为这些位图数据创建一个新的整数数组并不是那么干净。

public Bitmap exportBitmap() {
    ByteBuffer buffer = ByteBuffer.allocateDirect(w*h*4);
    GLES20.glReadPixels(0, 0, w, h, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buffer);
    Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    bitmap.copyPixelsFromBuffer(buffer);

    //This is the modification
    int[] pixels = new int[w*h];
    bitmap.getPixels(pixels, 0, w,0, 0,w, h);
    bitmap.setPixels(pixels, 0, w,0, 0,w, h);

    EGL14.eglMakeCurrent(oldDisplay, oldDrawSurface, oldReadSurface, oldCtx);
    EGL14.eglDestroySurface(eglDisplay, eglSurface);
    EGL14.eglDestroyContext(eglDisplay, eglCtx);
    EGL14.eglTerminate(eglDisplay);
    return bitmap;
}