源码如下:

// ConsoleApplication1.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h> #define XSIZE 1920
#define YSIZE 1080 #define RGB_SIZE XSIZE * YSIZE * 3
typedef unsigned char byte; double YUV2RGB_CONVERT_MATRIX[3][3] = { { 1, 0, 1.4022 }, { 1, -0.3456, -0.7145 }, { 1, 1.771, 0 } }; void ConvertYUV2RGB(unsigned char *yuvFrame, unsigned char *rgbFrame, int width, int height)
{
int uIndex = width * height;
int vIndex = uIndex + ((width * height) >> 2);
int gIndex = width * height;
int bIndex = gIndex * 2;
int temp, x, y; for (y = 0; y < height; y++)
{
for (x = 0; x < width; x++)
{
// R分量
temp = (int)(yuvFrame[y * width + x] + (yuvFrame[vIndex + (y / 2) * (width / 2) + x / 2] - 128) * YUV2RGB_CONVERT_MATRIX[0][2]);
rgbFrame[y * width + x] = (byte)(temp < 0 ? 0 : (temp > 255 ? 255 : temp));
// G分量
temp = (int)(yuvFrame[y * width + x] + (yuvFrame[uIndex + (y / 2) * (width / 2) + x / 2] - 128) * YUV2RGB_CONVERT_MATRIX[1][1] + (yuvFrame[vIndex + (y / 2) * (width / 2) + x / 2] - 128) * YUV2RGB_CONVERT_MATRIX[1][2]);
rgbFrame[gIndex + y * width + x] = (byte)(temp < 0 ? 0 : (temp > 255 ? 255 : temp));
// B分量
temp = (int)(yuvFrame[y * width + x] + (yuvFrame[uIndex + (y / 2) * (width / 2) + x / 2] - 128) * YUV2RGB_CONVERT_MATRIX[2][1]);
rgbFrame[bIndex + y * width + x] = (byte)(temp < 0 ? 0 : (temp > 255 ? 255 : temp));
}
}
} int main(){
int i, j, y, x;
long width, height;
unsigned char *data;
unsigned char *image; //用于存放读取的yuv数据
unsigned char *image_bmp; FILE *fp_r; width = XSIZE;
height = YSIZE;
long int bytePerLine = width * 3; //申请空间
image = (unsigned char *)malloc(width * height * 3 / 2);
image_bmp = (unsigned char *)malloc(width * height * 3);
data = (unsigned char*)malloc(bytePerLine * height); if ((NULL == image) || (image_bmp == NULL) || (data == NULL))
{
printf("faied to malloc the image\n");
return -1;
} /********读取yuv 文件***********/
fp_r = fopen("test.yuv", "rb"); //打开yuv 文件
if (NULL == fp_r)
{
printf("failed to open the fp_r\n");
return -1;
} fread(image, sizeof(unsigned char), XSIZE * YSIZE * 3 / 2, fp_r);
fclose(fp_r); for (i = 0; i<width *height * 3; i++)
*(image_bmp + i) = 255; //写bmp图片
int gIndex = width * height;
int bIndex = gIndex * 2; unsigned char header[54] = {
0x42, 0x4d, //WORD bfType----------- [0,1]
0, 0, 0, 0, //DWORD bfSize----------- [2,3,4,5]
0, 0, //WORD bfReserved1------ [6,7]
0, 0, //WORD bfReserved2------ [8,9]
54, 0, 0, 0, //WORD bfOffBits-------- [10,11,12,13] 40, 0, 0, 0, //DWORD biSize----------- [14,15,16,17]
0, 0, 0, 0, //LONG biWidth---------- [18,19,20,21]
0, 0, 0, 0, //LONG biHeight--------- [22,23,24,25]
1, 0, //WORD biplanes--------- [26,27]
24, 0, //WORD biCount---------- [28,29]
0, 0, 0, 0, //DWORD biCompression---- [30,31,32,33]
0, 0, 0, 0, //DWORD biSizeImage------ [34,35,36,37]
0, 0, 0, 0, //LONG biXPelsPerMeter-- [38,39,40,41]
0, 0, 0, 0, //LONG biYPelsPerMeter-- [42,43,44,45]
0, 0, 0, 0, //DWORD biClrUsed-------- [46,47,48,49]
0, 0, 0, 0 //DWORD biClrImportant--- [50,51,52,53]
};
long file_size = (long)width * (long)height * 3 + 54;
header[2] = (unsigned char)(file_size & 0x000000ff);
header[3] = (file_size >> 8) & 0x000000ff;
header[4] = (file_size >> 16) & 0x000000ff;
header[5] = (file_size >> 24) & 0x000000ff; header[18] = width & 0x000000ff;
header[19] = (width >> 8) & 0x000000ff;
header[20] = (width >> 16) & 0x000000ff;
header[21] = (width >> 24) & 0x000000ff; header[22] = height & 0x000000ff;
header[23] = (height >> 8) & 0x000000ff;
header[24] = (height >> 16) & 0x000000ff;
header[25] = (height >> 24) & 0x000000ff; char filename[6] = "1.bmp"; ConvertYUV2RGB(image, image_bmp, width, height); for (y = height - 1, j = 0; y >= 0; y--, j++)
{
for (x = 0, i = 0; x < width; x++)
{
data[y * bytePerLine + i++] = image_bmp[bIndex + j * width + x];
// B data[y * bytePerLine + i++] = image_bmp[gIndex + j * width + x];
// G data[y * bytePerLine + i++] = image_bmp[j * width + x];
// R
}
}
//sprintf(filename, "%d.bmp",1); FILE *fp_w;
if (!(fp_w = fopen(filename, "wb")))
return -1; fwrite(header, sizeof(unsigned char), 54, fp_w); fwrite(data, sizeof(unsigned char), XSIZE * YSIZE * 3, fp_w); fclose(fp_w);
free(image);
return(0);
}

yuv420 转换成 bmp的更多相关文章

  1. 音视频入门-03-RGB转成BMP图片

    * 音视频入门文章目录 * BMP 文件格式解析 BMP 文件由文件头.位图信息头.颜色信息和图形数据四部分组成. 位图文件头(14个字节) 位图信息头(40个字节) 颜色信息 图形数据 文件头与信息 ...

  2. 通过FFmpeg将多媒体文件解码后保存成Bmp图像(YUV420 RGB32)

    /* g++ -o test test.cpp -lavformat -lavcodec -lavutil -lz -lm -lpthread -lswscale */ #include <st ...

  3. 实现同时将一批.bmp文件转换成.mat格式

    %% 功能:实现同时对一批.bmp文件的转换成.mat格式PicFormat = {'*.bmp','Bitmap image (*.bmp)';... '*.jpg','JPEG image (*. ...

  4. 15个最好的PDF转word的在线转换器,将PDF文件转换成doc文件

    PDF是一种文件格式,包含文本,图像,数据等,这是独立于操作系统的文件类型.它是一个开放的标准,压缩,另一方面DOC文件和矢量图形是由微软文字处理文件.该文件格式将纯文本格式转换为格式化文档.它支持几 ...

  5. webp怎么打开 webp怎么转换成jpg

    webp怎么打开 webp怎么转换成jpg   2 3 4 5 6 7 分步阅读 在使用google服务的时候(比如 google play),我们会发现保存的图都是webp格式. 那webp是什么东 ...

  6. Android网络图片转换成bitmap保存到本地指定文件夹

    下列代码,请求网络图片转换为bitmap,然后保存到指定文件夹,微信,QQ分享,要求缩略图不大于32kb 压缩图片代码,使用了Glide来进行图片压缩处理 Glide.get(ShopDetailsA ...

  7. data:image/png;base64 上传图像将图片转换成base64格式

    大家可能注意到了,网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJ ...

  8. delphi将图片转换成Base64编码函数

    {************************************************************************** 名称: BaseImage 参数: fn: TF ...

  9. android将drawable下的图片转换成bitmap

    将drawable下的图片转换成bitmap 1. Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.xx ...

随机推荐

  1. 【java】@SuppressWarnings

    作用:用于抑制编译器产生警告信息. 示例1——抑制单类型的警告: 示例2——抑制多类型的警告: 示例3——抑制所有类型的警告: 三.注解目标 通过 @SuppressWarnings 的源码可知,其注 ...

  2. JS判断是否是ioS或者Android

    每个客户端都带有自身的UA标识,通过JavaScript,可以获取客户端标识,我们可以获取浏览器的userAgent,用正则来判断手机是ios(苹果)还是Android(安卓)客户端. 项目实例:ht ...

  3. 洛谷 P1156 垃圾陷阱 题解

    题目传送门 dp+排序+01背包 就完事了??? 貌似就是这样的 代码: //dp 排序 01背包 #include<iostream> #include<cstdio> #i ...

  4. 前端Vue项目——初始化及导航栏

    一.项目初始化 创建webpack模板项目如下所示: MacBook-Pro:PycharmProjects hqs$ vue init webpack luffy_project ? Project ...

  5. CF717A Festival Organization(第一类斯特林数,斐波那契数列)

    题目大意:求 $\sum\limits_{n=l}^{r}\dbinom{f_n}{k}\bmod 10^9+7$.其中 $f_n$ 是长度为 $n$ 的 $01$ 序列中,没有连续两个或超过两个 $ ...

  6. Spring Cloud Gateway 之 AddRequestHeader GatewayFilter Factory

    今天我们来学习下GatewayFilter Factory,中文解释就是过滤器工厂. 官方文档对GatewayFilter Factory的介绍: Route filters allow the mo ...

  7. vue+elementui搭建后台管理界面(1登录)

    1 node环境安装 从 node官网下载安装包 2 vue-cli npm install vue-cli -g 3 新建项目 vue init webpack vue-project 可保持默认, ...

  8. 深入学习 esp8266 wifimanager源码解析(打造专属自己的web配网)

    QQ技术互动交流群:ESP8266&32 物联网开发 群号622368884,不喜勿喷 单片机菜鸟博哥CSDN 1.前言 废话少说,本篇博文的目的就是深入学习 WifiManager 这个gi ...

  9. logstash output时区差8个小时

    logstash版本6.3.2,解决方式如下,不需要修改源码: input { redis { host => "127.0.0.1" port => " p ...

  10. C#程序只允许运行一个实例的解决方案

    最近在做winform的程序中,需要只能打开一个程序,如果已经存在,则激活该程序的窗口,并显示在最前端.在网上google了一哈,找到了很多的解决方案.这里我整理了3种方案,并经过了测试,现和朋友们分 ...