2015-01-15 41 views
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(); 

No Alpha

其次它的工作方式,與保存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); 

PNG Workaround

第三要澄清我的預乘。阿爾法是考慮到了錯誤的方式:

 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))); 
      } 
     } 

Image with black rectangle

很抱歉的長期職位。

+0

你看過'glReadPixels'後的原始字節嗎?你能看到正確的alpha值嗎?此外,你是否爲你的EGL環境啓用了alpha通道?你確定字節順序是否正確,當你從'glReadPixels'接收到* RGBA *數據,但是用* ARGB *字節順序創建一個位圖時? – IsaacKleiner

+0

我確實在egl配置中啓用了alpha通道。對象的顏色是正確的(實際測試藍色,紅色,綠色)。此外,如果我通過bm.compress(Bitmap.CompressFormat.PNG,100,new FileOutputStream(new File(path)))將位圖保存爲png,它有正確的着色和alpha通道。 – xeed

+0

我剛查過。白色,應該是半透明的值是0. so(0,0,0,0)。這應該表示這些值是預乘。當我將alphachannel設置爲255時,圖像是黑色的。所以它似乎是一個android顯示問題,因爲它不呈現實際的黑色值,而是顯示白色值。 – xeed

回答

0

我改變了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; 
}