`
dzxiang
  • 浏览: 35939 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

将YUV422转为BMP格式

    博客分类:
  • Java
 
阅读更多
在网上找了一下,没有现成的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();
		}		
	}
}
0
0
分享到:
评论

相关推荐

    利用ffmpeg将yuv转为bmp格式

    先利用ffmpeg对接收到的yuv视频流解码(不含接收和解码过程),然后转为bmp格式。

    YUYV或YUV422图片格式转png、jpg、jpeg、bmp的小工具

    我在用鱼眼摄像头拍照后想要预览或者处理时遇到了困难:因为摄像头拍照后的格式是YUV格式的(具体而言YUYV或YUV422)无法预览,网上虽然下到了能读的工具,但是无法保存。本工具提供了批量读入和批量转换的功能,...

    把bmp格式转为yuv

    把bmp格式图片转换为yuv格式视频,共享资源

    基于V4L2的视频采集,能够采集YUV,JPEG,BMP格式的图片

    基于V4L2的视频采集,能够采集YUV,JPEG,BMP格式的图片,编译前请先阅读README

    BMP文件转为YUV

    使用这样的工具,用户可以方便地将他们的BMP图像转换为适合视频处理的YUV格式,从而节省存储空间或优化处理效率。 总结来说,BMP到YUV的转换是数字图像处理中的一个基本操作,它涉及到颜色空间的变换和数据的压缩。...

    Jpg图片和Bmp图片转为YUV数据

    标题提到的"Jpg图片和Bmp图片转为YUV数据"就是将常见的JPEG和BMP格式的图像转换为YUV色彩空间的过程。这一过程通常在视频编码、图像压缩以及硬件解码等场景中应用广泛,因为YUV格式对存储和传输资源的需求相对较低。...

    使用FFmpeg将RGB格式图片或视频转换为YUV格式

    *将RGB转换为YUV420P * *码术 codemanship *http://blog.csdn.net/codemanship *微信公众号: codemanship *本程序实现了RGB像素数据转换为YUV像素数据 *是最简单的FFmpeg视频编码方面的教程。 *通过学习本例子可以...

    bmp图像转为yuv图像

    在计算机视觉和数字视频处理领域,图像转换是常见的任务之一,比如将BMP图像转换成YUV格式。这里我们详细探讨这个过程以及相关的知识点。 首先,我们要了解BMP(Bitmap)和YUV这两种图像格式。BMP是Windows操作系统...

    fpscamera_nv12_ubuntu20151209_1659抓YUYV的图像并转为BMP格式.7z

    标题中的“fpscamera_nv12_ubuntu20151209_1659抓YUYV的图像并转为BMP格式.7z”揭示了这个压缩包的内容,它是一个专用于在Ubuntu操作系统上捕捉YUYV格式图像,并将其转换成BMP格式的工具或代码库。YUYV是一种常见的...

    python实现yuv转RGB图片程序

    在实际应用中,可能会对这些值进行缩放,使其适应特定的YUV格式,如YUV4:2:0或YUV4:2:2等。 `utility.py`可能包含了辅助函数,如读取和写入图像文件,或者处理图像数据的预处理和后处理步骤。在Python中,PIL...

    将avi文件转为bmp图片

    因此,在转换过程中,需要将YUV数据转换为RGB,以符合bmp格式的要求。 4. **bmp文件结构**:bmp文件格式有固定的头部信息,包括位图文件头、位图信息头等,定义了图像的宽度、高度、位深度等参数。在生成bmp文件时...

    将raw的数据转换为bmp图像

    3. 转换数据:将RAW数据转换为BMP所需的RGB格式,可能需要进行色彩空间转换,如从YUV转为RGB。 4. 填充位图结构:根据BMP文件格式,将转换后的像素数据填充到位图类的像素数组中。 5. 写入文件:创建BMP文件,并将...

    BMP图片转RGB数组

    在计算机图形学中,BMP(Bitmap)是一种常见的位图图像格式,用于存储像素数据。在Windows操作系统中,BMP文件被广泛使用。RGB(Red, Green, Blue)是颜色模型的一种,它通过红、绿、蓝三种颜色的组合来表示几乎所有...

    rgb 和 yuv_nv12 数据相互转换

    3. 将计算得到的RGB值写入新的图像文件,如BMP格式,注意保持正确的像素顺序。 在MATLAB中,可以使用imread和imwrite函数读取和写入图像,以及rgb2yuv和yuv2rgb函数进行颜色空间转换。具体代码实现时,需要特别注意...

    Yv12 nv21 yuv420 转换为Bitmap

    Camera onPreview中byte[] 转换为Bitmap 在录像时设置了YV12要保存图片时 YV12或者NV12时要转换时所用的工具的优化

    BMP图片24位深度转16位深度

    5. **写入16位BMP图像**:完成上述步骤后,将16位的像素数据按照BMP文件格式的要求重新组织并写入文件头信息,生成新的16位BMP图像。 6. **性能优化**:在实际编程实现中,还需要考虑算法的效率和内存占用,可能...

    使用CUDA将NV12格式转换为JPEG的代码

    使用CUDA,将NV12格式的缓冲区编码为JPEG。代码可以编译,并直接运行。代码是https://blog.csdn.net/mikedai/article/details/79084092,进行了接口、对齐、编译功能。

    视频转为图像

    描述中提到的“BMP图像源代码”意味着我们将处理的是Windows操作系统下的位图(BMP)格式,这是一种无损的图像存储格式。同时,提到了“需要采集卡库”,这暗示可能涉及硬件视频输入和特定的API接口。 在视频转图像...

    aa.zip_图片为.jpg格式

    2. **图像处理**:包括图像的格式转换,比如从YUV格式转为RGB,以及对图像的压缩算法的理解,如JPEG压缩。 3. **C++编程**:软件是用VC编写,所以需要掌握C++语言基础,包括文件操作、内存管理、IO流、多线程等。 ...

    Bitmap图像转换为H264

    1. **图像解析**:首先,我们需要读取BMP文件,解析其头信息,包括图像宽度、高度、位深度等,然后将像素数据按照RGB或RGBA格式存储到内存中。 2. **色彩空间转换**:通常,BMP图像使用RGB色彩空间,而H264编码器...

Global site tag (gtag.js) - Google Analytics