本文介绍了将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函数根据指

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

被折叠的 条评论
为什么被折叠?



