Android 利用NDK 将ARGB 转换成RGB

在项目中需要将ARGB_8888的图片转换为RGB,为提高效率使用NDK的C++代码实现。在转换过程中遇到透明像素显示为白色的问题,原因是Android的Porter Duff模式。通过将ARGB转换并覆盖到白色背景上,解决了透明像素显示为黑色的错误,但可能导致部分颜色变白。
摘要由CSDN通过智能技术生成

今天在项目中遇到一个问题,就是需要把一张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的公式如下:

                           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值