/**
* 与YUV格式转换相关,提供:将YUV422转为BMP格式
*/
public class YuvHelper {
public static int yuvToR(int y,int u,int v){
if(y<0) y = (y&0x7f)|0x80;
if(u<0) u = (u&0x7f)|0x80;
if(v<0) v = (v&0x7f)|0x80;
return Math.round((1.164f * (y -16f) + 1.596f * (v - 128f)));
}
public static int yuvToG(int y,int u,int v){
if(y<0) y = (y&0x7f)|0x80;
if(u<0) u = (u&0x7f)|0x80;
if(v<0) v = (v&0x7f)|0x80;
return Math.round((1.164f * (y -16f) - 0.813f * (v - 128f) - 0.393f * (u - 128f)));
}
public static int yuvToB(int y,int u,int v){
if(y<0) y = (y&0x7f)|0x80;
if(u<0) u = (u&0x7f)|0x80;
if(v<0) v = (v&0x7f)|0x80;
return Math.round(1.164f * (y -16f) + 2.018f * (u - 128f));
}
/**
* RGB修正
* @param rgb
* @return
*/
public static byte revise(int rgb){
if( rgb > 255) return (byte)255;
if( rgb < 0) return 0;
return (byte)rgb;
}
/**
* 将整数转换为双字,返回值存储在一个 4 字节数组中
* @param parValue
* @return
*/
public static byte[] intToDWord(int parValue) {
byte retValue[] = new byte[4];
retValue[0] = (byte) (parValue & 0x00FF);
retValue[1] = (byte) ((parValue>>8) & 0x000000FF);
retValue[2] = (byte) ((parValue>>16) & 0x000000FF);
retValue[3] = (byte) ((parValue>>24) & 0x000000FF);
return retValue;
}
/**
* 将整数转换为单字,返回值 存储在一个双字节数组中
* @param parValue
* @return
*/
public static byte[] intToWord(int parValue) {
byte retValue[] = new byte[2];
retValue[0] = (byte) (parValue & 0x00FF);
retValue[1] = (byte) ((parValue>>8) & 0x00FF);
return retValue;
}
/**
* 将yuv文件转换为bmp格式的数据
* @param yuvFileBytes
* @param width
* @param height
* @return
* @throws Exception
*/
public static byte[][] convertYuv422ToRgb(byte[] yuvFileBytes,int width,int height) throws Exception{
byte[][] rgbBuf = new byte[height][width*3];
byte[][] yuv444Data = new byte[3][width];
for(int line =0; line < height; line ++){
for(int pixel=0; pixel < width/2; pixel++){
//将422格式的数据转换为444格式的数据
int from = line*width*2;
yuv444Data[0][pixel*2] = yuvFileBytes[from+pixel*4 + 1];
yuv444Data[1][pixel*2] = yuvFileBytes[from+pixel*4];
yuv444Data[2][pixel*2] = yuvFileBytes[from+pixel*4 + 2];
yuv444Data[0][pixel*2+1] = yuvFileBytes[from+pixel*4 + 3];
yuv444Data[1][pixel*2+1] = yuvFileBytes[from+pixel*4];
yuv444Data[2][pixel*2+1] = yuvFileBytes[from+pixel*4 + 2];
}
for(int pixel = 0; pixel < width; pixel++){
///将444格式的数据根据公式转换为RGB
int r = yuvToR(yuv444Data[0][pixel], yuv444Data[1][pixel], yuv444Data[2][pixel]);
int g = yuvToG(yuv444Data[0][pixel], yuv444Data[1][pixel], yuv444Data[2][pixel]);
int b = yuvToB(yuv444Data[0][pixel], yuv444Data[1][pixel], yuv444Data[2][pixel]);
rgbBuf[line][pixel*3+2] = revise(r);
rgbBuf[line][pixel*3+1] = revise(g);
rgbBuf[line][pixel*3] = revise(b);
}
}
return rgbBuf;
}
/**
* 将RGB转为BMP
* @param rgbBuf
* @param width
* @param height
* @return
* @throws Exception
*/
public static byte[] convertRgb2Bmp(byte[][] rgbBuf,int width, int height) throws Exception{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try{
bos.write(new byte[]{ 'B', 'M' });
bos.write(intToDWord(width*height*3 + 0x36));
bos.write(intToDWord(0));
//bos.write(intToWord(0));
bos.write(intToDWord(0x36));
bos.write(intToDWord(0x28));
bos.write(intToDWord(width));
bos.write(intToDWord(height));
bos.write(intToWord(1));
bos.write(intToWord(24));
bos.write(intToDWord(0));
bos.write(intToDWord(width*height*3));
bos.write(intToDWord(0));
bos.write(intToDWord(0));
bos.write(intToDWord(0));
bos.write(intToDWord(0));
int len = rgbBuf.length;
for(int i=len-1;i>=0;i--){
bos.write(rgbBuf[i]);
}
bos.flush();
}catch(Exception ex){
ex.printStackTrace();
throw ex;
}finally{
bos.close();
}
return bos.toByteArray();
}
public static void main(String[] args) {
try {
int width = 720,height = 288;
byte[][] rgbBuf = YuvHelper.convertYuv422ToRgb(FileHelper.getBytes("E:/test/aaa.yuv"), width, height);
byte[] bmp = YuvHelper.convertRgb2Bmp(rgbBuf, width, height);
FileHelper.writeFile(bmp, "E:/test/aaa.bmp");
} catch (Exception e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
linux摄像头程序含yuv422转rgb565程序(在程序里面),网上搜的yuv422转rgb24 自己修改了下 程序没整理 比较乱
本话题聚焦于一个具体的FPGA设计案例:将YUV422格式的视频数据转换为RGB888格式,这是一种常见的颜色空间转换。下面将详细解释这个过程以及涉及的技术知识点。 首先,YUV422是一种常见的颜色编码格式,主要用于存储...
实现了YUV422转RGB的过程,希望对大家有帮助。
本篇文章将深入探讨如何将YUV422格式的图像转换为8位RGB灰度图像,这是一个在视频处理、图像编码与解码等场景中常见的需求。 ### YUV422格式简介 YUV422是一种常见的彩色图像格式,其中“Y”代表亮度信号,“U”和...
TI YUV422到RGB565的转换是图像处理中的一个重要环节,尤其是在嵌入式系统和移动设备中,由于资源限制,这种颜色空间的转换经常被用于节省存储空间和带宽。在这个过程中,我们需要了解YUV色彩空间和RGB色彩空间的...
yuv422解码成rgb格式。文档有二个函数,直接调用Yuv422_toRGB(unsigned char *yuv, unsigned char *rgb, unsigned int width, unsigned int height)就可以解码。
本文将深入探讨“uyvy422”(YUV422)到“RGB888”之间的转换,同时提供了一个完整的测试源码供读者实践和学习。 “uyvy422”是一种常用的半像素格式的YUV色彩空间,广泛应用于视频编码中,它以每两个像素共享一个...
在数字视频处理领域,颜色空间转换是至关重要的一步,它涉及到不同颜色模型之间的转换,例如从YUV转换到RGB。YUV色彩空间主要用于电视和视频信号传输,因为它能有效地利用带宽,而RGB(红绿蓝)是显示器上常用的色彩...
YUV422 到 RGB24 格式转换算法 在图像处理和显示领域中, YUV422 是一种常见的图像格式,它的特点是每个像素点由两个字节表示,其中一个字节表示 Y 分量,另一个字节表示 UV 分量交叉存储。然而,在 LCD 显示器上,...
标题中的“422_to_444.zip_422转444_yuv422 to yuv444_yuv422 yuv444 fpga_yuv42”指的是一个关于将YUV422颜色空间转换为YUV444颜色空间的FPGA实现项目。这个压缩包可能包含了相关的文档和源代码,帮助开发者理解并...
C/C++ 源码,图像RGB格式转换为YUV420格式和图像YUV420sp格式转换为YUV422,亲测有效,已经得到验证过
嵌入式系统开发经常需要将输出的YUV422数据转为RGB格式数据,这是一个很好的转换函数。
这里我们关注的是从YUV色彩空间转换到RGB色彩空间的过程,这在多媒体处理、图像编辑和视频处理中非常常见。MATLAB作为一种强大的数值计算和可视化工具,提供了丰富的函数库来支持这种转换。下面,我们将详细讨论YUV...
在这个YUV422转JPEG的程序中,开发者首先需要加载YUV422数据,然后使用libjpeg库提供的函数来设置编码参数,如质量等级、色彩空间等。接着,将YUV422数据转换为JPEG库理解的格式,然后调用编码函数生成JPEG图像文件...
YUV420、YUV422、RGB24转换
RGB到YUV422颜色空间转换是图像处理和视频编码中的常见操作,尤其是在数字视频系统和计算机图形学中。这个“RGB2YUV.rar”压缩包包含了一个用于实现这一转换的源码工程,旨在提供一个高效、直观且易于理解的解决方案...
这个"RGB2YUV.rar_bmp YUV422_rgb yuv422_rgb2yuv"压缩包文件包含了关于如何将RGB图像转换为YUV422格式的相关资源。以下是关于这一主题的详细知识: 1. **RGB与YUV颜色空间**: - **RGB**(Red, Green, Blue)是一...
RGB到YUV422转换在视频处理和图像编码领域是一项基本操作,它涉及到颜色空间的转换。在本文中,我们将深入探讨这个过程,以及如何使用VC++(Visual C++)编写小程序来实现这一转换。 RGB(红绿蓝)是数字图像中最...