0
我有一個小問題,渲染一個對象離屏創建一個位圖,並在imageview中顯示它。它不會正確地拍攝Alpha通道。ImageView不使用位圖的alphachannel
它工作正常,當我將位圖保存爲PNG並加載它。但是當我直接將它加載到imageview中時,我會看到一個白色背景,這是沒有Alpha通道的實際背景色。
這裏是從我的EGL表面導出位圖的代碼:
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;
}
而且這裏設置ImageView的(R是包含先前的功能類)的代碼:
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);
第三要澄清我的預乘。阿爾法是考慮到了錯誤的方式:
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)));
}
}
很抱歉的長期職位。
你看過'glReadPixels'後的原始字節嗎?你能看到正確的alpha值嗎?此外,你是否爲你的EGL環境啓用了alpha通道?你確定字節順序是否正確,當你從'glReadPixels'接收到* RGBA *數據,但是用* ARGB *字節順序創建一個位圖時? – IsaacKleiner
我確實在egl配置中啓用了alpha通道。對象的顏色是正確的(實際測試藍色,紅色,綠色)。此外,如果我通過bm.compress(Bitmap.CompressFormat.PNG,100,new FileOutputStream(new File(path)))將位圖保存爲png,它有正確的着色和alpha通道。 – xeed
我剛查過。白色,應該是半透明的值是0. so(0,0,0,0)。這應該表示這些值是預乘。當我將alphachannel設置爲255時,圖像是黑色的。所以它似乎是一個android顯示問題,因爲它不呈現實際的黑色值,而是顯示白色值。 – xeed