2017-02-11 55 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

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