FFmpeg开发实战(五):bmp转换为jpeg格式图像

本文介绍将BMP格式图像转换为JPEG格式图像的方法,包含详细代码与图像示例。先阐述BMP结构,说明其存储方式及像素分量顺序调整;接着提及用ffmpeg的libswscale库进行BGR24到YUV420P的转换;最后将YUV420视频数据转为JPEG图像,还给出测试用例图和源码下载链接。


本文介绍了将bmp格式图像转换为jpeg格式图像的方法,附有详细的代码和图像示例。

1. bmp结构

bmp图片由文件头和像素两部分组成,其中文件头又包括位图文件信息和位图结构信息,文件头两部分信息的结构如下所示。

typedef  struct  tagBITMAPFILEHEADER
{
   
   
	unsigned short int  bfType;       //位图文件的类型,必须为BM 
	unsigned long       bfSize;       //文件大小,以字节为单位
	unsigned short int  bfReserverd1; //位图文件保留字,必须为0 
	unsigned short int  bfReserverd2; //位图文件保留字,必须为0 
	unsigned long       bfbfOffBits;  //位图文件头到数据的偏移量,以字节为单位
}BITMAPFILEHEADER;
typedef  struct  tagBITMAPINFOHEADER
{
   
   
	long biSize;                        //该结构大小,字节为单位
	long  biWidth;                     //图形宽度以象素为单位
	long  biHeight;                     //图形高度以象素为单位
	short int  biPlanes;               //目标设备的级别,必须为1 
	short int  biBitcount;             //颜色深度,每个象素所需要的位数
	short int  biCompression;        //位图的压缩类型
	long  biSizeImage;              //位图的大小,以字节为单位
	long  biXPelsPermeter;       //位图水平分辨率,每米像素数
	long  biYPelsPermeter;       //位图垂直分辨率,每米像素数
	long  biClrUsed;            //位图实际使用的颜色表中的颜色数
	long  biClrImportant;       //位图显示过程中重要的颜色数
}BITMAPINFOHEADER;

BMP采用的是小端(Little Endian)存储方式。这种存储方式中“RGB24”格式的像素的分量存储的先后顺序为B、G、R。由于RGB24格式存储的顺序是R、G、B,所以需要将“R”和“B”顺序作一个调换再进行存储。

2. bgr24转yuv420p

参考文献:ffmpeg rgb与yuv的转换
ffmpeg里的libswscale库用于图像数据格式的转换.

AVFrame 类型对象用于描述非压缩的音视频数据信息, 此对象本身不提供存储音视频数据的缓冲区,只用于记录数据格式,图像分辨率,数据缓冲区地址等信息.

typedef struct AVFrame {
   
   
    #define AV_NUM_DATA_POINTERS 8
    uint8_t *data[AV_NUM_DATA_POINTERS]; //此指针数组是用于存放数据缓冲区地址,因有可能是平面的数据,所有用了多个指针变量存放不同分量的数据缓冲区
    int linesize[AV_NUM_DATA_POINTERS]; //存放每个缓冲区的一行数据的字节数
    ...
}AVFrame

所用的函数说明:

AVFrame *av_frame_alloc(void); //用于动态创建一个AVFrame对象
 
//因AVFrame本身不提供存储数据的缓冲区,所以需要创建出数据缓冲区后再使用下面函数配置AVFrame对象
int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4],
                         const uint8_t *src,
                         enum AVPixelFormat pix_fmt, int width, int height, int align);
 
struct SwsContext; //此类型对象用于描述原数据格式及目标格式, 原分辨率及目标分辨率等.
 
// sws_getContext函数根据指
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

i胡说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值