彩图转灰度图算法

今天试了下一个前辈的ndk彩图转灰度图的算法,有点小瑕疵,于是就剖析了下这个算法。


核心代码如下


int alpha = 0xFF << 24;
	for (int i = 0; i < h; i++) {
		for (int j = 0; j < w; j++) {
			// 获得像素的颜色
			int color = cbuf[w * i + j];
			int red = ((color & 0x00FF0000) >> 16);
			int green = ((color & 0x0000FF00) >> 8);
			int blue = color & 0x000000FF;
			//color = (red + green + blue) / 3;
			color = (red*299 + green*587 + blue*114) / 1000;
			color = alpha | (color << 16) | (color << 8) | color;
			cbuf[w * i + j] = color;
		}
	}


先说颜色的组成,这里我们分析的颜色由ARGB组成,分别是透明度、红、绿和蓝。此处由一个int表示,其中四个字节依次存alpha、red、green、blue,每个都是占一个字节。
先是 int alpha = 0xFF << 24;左移之后为0xff000000


int red = ((color & 0x00FF0000) >> 16);
int green = ((color & 0x0000FF00) >> 8);
int blue = color & 0x000000FF;
是分别取颜色值中的红绿蓝,做移位操作是要变成0x0000ab的形式方面求灰色值。

灰色值的rgb成分是一样的,即r=g=b,代码中注释的就是所说的瑕疵,这个算法没考虑颜色亮度,也就是说纯的red和纯的green以及纯的blue转灰色之后颜色值一样,这显然不合理。Y = 0.299R+0.587G+0.114B是一个比较标准的求灰色值的公司,算上了不同颜色的亮度。

之后color=alpha|(color<<16)|(color<<8)|color将取得的各个颜色值分量按格式设置到color里面去。最终效果还可以。


效果如下,用color = (red + green + blue) / 3;将会得到一个全灰色的图,而不是有亮度区别的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值