前一篇博客中涉及到了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