android位图getPixels在零alpha像素处返回0

时间:2017-02-11 15:58:19

标签: android bitmap pixels

首先,我将所有像素设置为零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值?

2 个答案:

答案 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);

但它也会使得无法通过画布绘制位图。