今天在项目中遇到一个问题,就是需要把一张ARGB_8888的图片转换成RGB图片。为了减少时间消耗,我把这部分工作转移到ndk中,用C++实现:
AndroidBitmapInfo bitmapInfo;
void* bitmapPixels = NULL;
bool ret = false;
//Get info
if (AndroidBitmap_getInfo(env, bitmap, &bitmapInfo) < 0) {
return NULL;
}
// Lock image
if (AndroidBitmap_lockPixels(env, bitmap, &bitmapPixels) < 0) {
return NULL;
}
//Operations on bitmap pixels
...
//Unlock bitmap
if ((AndroidBitmap_unlockPixels(env, bitmap)) < 0 ) {
return NULL;
}
其中遇到了一个非常诡异的的事情,就是当我把每个像素值都设置成0x4f4f4f4f时,在屏幕上显示竟为透明!
挠头良久后,发现我的问题所在:
然来,Android的skia库把ARGB_8888显示到屏幕时,将目标bitmap与背景缓存做了个Porter Duff 的(A over B)模式。A over B的公式如下: