rgb数据转yuv数据代码示例

       前一篇博客中涉及到了yuv数据转rgb数据,相关运算代码是很基本的,实际在应用时效率是比较低的,可以采用指令集方式或者使用汇编方式编写相关代码,以提高运行效率,降低cpu消耗,关于优化方面网络上也有很多资源,大家可以自行查阅。这篇博客主要是分享一下rgb转yuv数据代码,虽然实际使用场景不是很多,因为大多数情况下,yuv转rgb数据应用较多,如摄像头采集数据或者视频解码数据都是yuv格式的,然后在显示图像时,需要做一次yuv转rgb操作。但随着工作内容不断扩展,说不定什么时候就会用到rgb转yuv,下面是相关转换代码:

int size = width * height;
src_ydata = new byte[size];
src_udata = new byte[size >> 2];
src_vdata = new byte[size >> 2];
					
int[] rgb_data = new int[size];
// 从打开的图像中提取rgb数据
newBitmap.getPixels(rgb_data, 0, width, 0, 0, width, height);

// rgb转yuv
int index = 0, uIndex = 0, vIndex = 0;
int r = 0, g = 0, b = 0;
int y = 0, u = 0, v = 0;
for (int i = 0; i < height; i++)
{
	for (int j = 0; j < width; j++)
	{
		index = i * width + j;
		r = (rgb_data[index] & 0x00FF0000) >> 16;
		g = (rgb_data[index] & 0x0000FF00) >> 8;
		b = (rgb_data[index] & 0x000000FF);
							
		// y分量
		y = (int)(( 66 * r + 129 * g +  25 * b + 128) >> 8) + 16;				            
		src_ydata[index] = (byte)Math.min(255, Math.max(0, y));
				            
		if ((i % 2 == 0) && (j % 2 == 0))
		{
			// u分量
		    u = (int)((-38 * r -  74 * g + 112 * b + 128) >> 8) + 128;
			if (u > 255)
			{
				u = 255;
			}
				                
			if (u < 0)
			{
				u = 0;
			}
			src_udata[uIndex++] = (byte)u;
		}
		else
		{
			if (j % 2 == 0)
			{
				// v分量
				v = (int)((112 * r -  94 * g -  18 * b + 128) >> 8) + 128;
				if (v > 255)
				{
				    v = 255;
				}
				                    
				if (v < 0)
				{
				    v = 0;
				}
				src_vdata[vIndex++] = (byte)v;
			}
		}
	}// for
}// for





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值