首先,我将所有像素设置为零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 :(得分:0)
因为初始化位图时,所有像素都被初始化为0。0&amp;任何事情= 0.
如果你想设置默认颜色,那么无论如何这都是一种非常低效的方式。设置画布以绘制到该位图并使用drawColor
答案 1 :(得分:0)
最后我发现在android / graphics / 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);
但它也会使得无法通过画布绘制位图。