2017-02-11 100 views
0

首先,我將所有像素設置爲零alpha通道。android bitmap getPixels在0處返回0 alpha像素

bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
Canvas c = new Canvas(bitmap); 
// draw somethings in the bitmap... 

bitmap.getPixels(pixs, 0, w, 0, 0, w, h); 
for(int i=0;i<pixs.length;i++) { 
    pixs[i] = pixs[i] & (0x00ffffff); 
} 

接下來我將這些像素放入位圖,然後再次調用getPixels。

bitmap.setPixels(pixs, 0, w, 0, 0, w, h); 
bitmap.getPixels(pixs, 0, w, 0, 0, w, h); 

最終結果pixs補0。

爲什麼呢?爲什麼位圖會丟失rgb值?

回答

0

最後我發現一些奇怪的android系統/圖形/ Bitmap.cpp,當位圖是premultiplied,它將使用FromColor_D32來填充像素爲位圖,其中將做預首先乘以所有像素。所以FromColor_D32_Raw是我想要的。

static FromColorProc ChooseFromColorProc(const SkBitmap& bitmap) { 
    switch (bitmap.colorType()) { 
     case kN32_SkColorType: 
      return bitmap.alphaType() == kPremul_SkAlphaType ? FromColor_D32 : FromColor_D32_Raw; 
     case kARGB_4444_SkColorType: 
      return bitmap.alphaType() == kPremul_SkAlphaType ? FromColor_D4444 : 
        FromColor_D4444_Raw; 
     case kRGB_565_SkColorType: 
      return FromColor_D565; 
     case kAlpha_8_SkColorType: 
      return FromColor_DA8; 
     default: 
      break; 
    } 
    return NULL; 
} 

解決方法是在調用setPixels之前添加以下內容。

bitmap.setPremultiplied(false); 

但它也會使位圖無法通過畫布繪製。

0

因爲當你初始化一個位圖,如果你想設置一個默認顏色的所有像素都被初始化爲0。0 &什麼= 0

,這是反正一個可怕的低效的方式。設置畫布繪製該位圖和使用drawColor

+0

對不起,我的不完整的描述... –