这十天都在做将二进制文件压缩成jpeg图片并保存到本地的事,从二进制文件的读取、文件头信息的提取,到libjpeg库的使用。事情虽小,但涉及到的知识却很多,有必要记录一番。
TIMG二进制文件
TIMG文件以二进制数据形式存储,二进制形式读取,文件空间有文件头+图像数据块组成。文件头包含了文件的基本信息,如:文件名,图片宽度,高度,是否包含tip图数据等等。TIMG文件中使用结构体的方式定义了文件的基本信息,结构体变量名st_head
利用结构体中的数据提取图像数据块。
文件的读取和文件头的提取
C++使用fstream流的方法读取文件,其中ifstram将文件从硬盘读到内存,ofstream将文件从内存读到硬盘。二进制文件的读使用到read(char * buffer,streamsize size)//从文件中读取size个字符到buffer中。这里size设置成sizeof(st_head),buffer为st_head定义的一个结构体变量S,文件头的信息就存储到S中。
Libjpeg库的使用
jpeg是一种图片格式,具体内容十分复杂,不过可以使用libjpeg进行jpeg图像的压缩。libjpeg库是开源代码,在VS上使用需要用到vs的command,命令语句nmake生成相应的lib,具体可看源码中的install.txt。jpeg图像的压缩要求数据块是以RGBRGB的形式排列的矩阵数组。图片的width和height是压缩图像的重要参数。
while(cinfo.next_scanline < cinfo.image_height)
{
row_pointer[0] = &src_data[cinfo.next_scanline * row_stride];
jpeg_write_scanlines(&cinfo,row_pointer,1);
}
row_stride = image_width * 3,next_scanline是一个自增的变量,每写一行就加1。src_data是读取出来的数据块,cinfo.next_scanline * row_stride
表示jpeg图片每行数据要写入的元素个数和起始地址。