在网上找了一下,没有现成的JAVA代码,参考了一下相关的C语言转换程序,自己动手了。
/**
* 与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();
}
}
}
分享到:
相关推荐
先利用ffmpeg对接收到的yuv视频流解码(不含接收和解码过程),然后转为bmp格式。
我在用鱼眼摄像头拍照后想要预览或者处理时遇到了困难:因为摄像头拍照后的格式是YUV格式的(具体而言YUYV或YUV422)无法预览,网上虽然下到了能读的工具,但是无法保存。本工具提供了批量读入和批量转换的功能,...
把bmp格式图片转换为yuv格式视频,共享资源
标题提到的"Jpg图片和Bmp图片转为YUV数据"就是将常见的JPEG和BMP格式的图像转换为YUV色彩空间的过程。这一过程通常在视频编码、图像压缩以及硬件解码等场景中应用广泛,因为YUV格式对存储和传输资源的需求相对较低。...
基于V4L2的视频采集,能够采集YUV,JPEG,BMP格式的图片,编译前请先阅读README
使用这样的工具,用户可以方便地将他们的BMP图像转换为适合视频处理的YUV格式,从而节省存储空间或优化处理效率。 总结来说,BMP到YUV的转换是数字图像处理中的一个基本操作,它涉及到颜色空间的变换和数据的压缩。...
*将RGB转换为YUV420P * *码术 codemanship *http://blog.csdn.net/codemanship *微信公众号: codemanship *本程序实现了RGB像素数据转换为YUV像素数据 *是最简单的FFmpeg视频编码方面的教程。 *通过学习本例子可以...
在计算机视觉和数字视频处理领域,图像转换是常见的任务之一,比如将BMP图像转换成YUV格式。这里我们详细探讨这个过程以及相关的知识点。 首先,我们要了解BMP(Bitmap)和YUV这两种图像格式。BMP是Windows操作系统...
标题中的“fpscamera_nv12_ubuntu20151209_1659抓YUYV的图像并转为BMP格式.7z”揭示了这个压缩包的内容,它是一个专用于在Ubuntu操作系统上捕捉YUYV格式图像,并将其转换成BMP格式的工具或代码库。YUYV是一种常见的...
因此,在转换过程中,需要将YUV数据转换为RGB,以符合bmp格式的要求。 4. **bmp文件结构**:bmp文件格式有固定的头部信息,包括位图文件头、位图信息头等,定义了图像的宽度、高度、位深度等参数。在生成bmp文件时...
在实际应用中,可能会对这些值进行缩放,使其适应特定的YUV格式,如YUV4:2:0或YUV4:2:2等。 `utility.py`可能包含了辅助函数,如读取和写入图像文件,或者处理图像数据的预处理和后处理步骤。在Python中,PIL...
3. 转换数据:将RAW数据转换为BMP所需的RGB格式,可能需要进行色彩空间转换,如从YUV转为RGB。 4. 填充位图结构:根据BMP文件格式,将转换后的像素数据填充到位图类的像素数组中。 5. 写入文件:创建BMP文件,并将...
在计算机图形学中,BMP(Bitmap)是一种常见的位图图像格式,用于存储像素数据。在Windows操作系统中,BMP文件被广泛使用。RGB(Red, Green, Blue)是颜色模型的一种,它通过红、绿、蓝三种颜色的组合来表示几乎所有...
3. 将计算得到的RGB值写入新的图像文件,如BMP格式,注意保持正确的像素顺序。 在MATLAB中,可以使用imread和imwrite函数读取和写入图像,以及rgb2yuv和yuv2rgb函数进行颜色空间转换。具体代码实现时,需要特别注意...
Camera onPreview中byte[] 转换为Bitmap 在录像时设置了YV12要保存图片时 YV12或者NV12时要转换时所用的工具的优化
5. **写入16位BMP图像**:完成上述步骤后,将16位的像素数据按照BMP文件格式的要求重新组织并写入文件头信息,生成新的16位BMP图像。 6. **性能优化**:在实际编程实现中,还需要考虑算法的效率和内存占用,可能...
使用CUDA,将NV12格式的缓冲区编码为JPEG。代码可以编译,并直接运行。代码是https://blog.csdn.net/mikedai/article/details/79084092,进行了接口、对齐、编译功能。
描述中提到的“BMP图像源代码”意味着我们将处理的是Windows操作系统下的位图(BMP)格式,这是一种无损的图像存储格式。同时,提到了“需要采集卡库”,这暗示可能涉及硬件视频输入和特定的API接口。 在视频转图像...
2. **图像处理**:包括图像的格式转换,比如从YUV格式转为RGB,以及对图像的压缩算法的理解,如JPEG压缩。 3. **C++编程**:软件是用VC编写,所以需要掌握C++语言基础,包括文件操作、内存管理、IO流、多线程等。 ...
在处理这些图像时,我们有时需要将来自不同来源的图片数据转换成Unity可识别的格式,例如从Bitmap格式转换为Texture2D。Bitmap是一种常见的图像格式,广泛应用于Windows操作系统和许多图像处理软件中。然而,Unity3D...