本着我为人人,人人为我的精神,把搞了两天的libjpeg.lib关于jpeg文件的读写代码贴出来,在从源码编译生成jpeg.lib源码
下载地址:http://www.infai.org/jpeg/我下载的是jpegsr09a.zip
,编译平台采用的是VS2010,编译生成我们需要的lib库。
编译参考博客列出如下:
得到我们需要的lib库,之后就好办了,vs2010新建一个项目。上面列出的博客有测试程序,不够完整,于是我改写了自己的jpeg图片的读写。
源代码如下:
#include "stdafx.h"
#include
#include "jpeglib.h"
#include "cdjpeg.h"
#include "jerror.h"
#include "jversion.h"
#include "jinclude.h"
#include "cderror.h"
using namespace std;
void writeJpegImage(char *file ,JSAMPLE *data,int width,int height
,int quality);
void readJpegImage(char *fileName ,unsigned char *bmpBuffer ,int
&width ,int &height);
void readJpegImage(char *fileName ,JSAMPLE *bmpBuffer ,int
&width ,int &height)
{
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
JSAMPARRAY buffer=NULL;
JSAMPLE *bufferList=NULL;
FILE *inFile=NULL;
int
row_stride; cinfo.err=jpeg_std_error(&jerr);
if ((inFile = fopen(fileName, "rb")) == NULL)
{
fprintf(stderr, "can't open
%s\n", fileName);
return ;
}
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, inFile);
jpeg_read_header(&cinfo, TRUE);
jpeg_start_decompress(&cinfo);
width =cinfo.output_width;
height =cinfo.output_height;
row_stride = cinfo.output_width *
cinfo.output_components;
//*bmpBuffer=(unsigned char
*)malloc((height)*width*sizeof(unsigned char));
int start=0;
buffer = (*cinfo.mem->alloc_sarray)
((j_common_ptr) &cinfo,
JPOOL_IMAGE, row_stride, 1);
while (cinfo.output_scanline <
cinfo.output_height) {
(void)
jpeg_read_scanlines(&cinfo, buffer, 1);
start=row_stride*cinfo.output_scanline;
for(int i=0;i
{
bmpBuffer[start+i]=buffer[0][i];
} }
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
fclose(inFile);
return ;
}
void writeJpegImage(char *file ,JSAMPLE *data,int width,int
height ,int quality)
{
jpeg_compress_struct jpeg;
jpeg_error_mgr jerr;
jpeg.err = jpeg_std_error(&jerr);
jpeg_create_compress(&jpeg);
FILE* pFile = fopen( file,"wb" );
if( !pFile )
return ;
jpeg_stdio_dest(&jpeg, pFile);
jpeg.image_width = width;
jpeg.image_height = height;
jpeg.input_components =
1;
jpeg.in_color_space = JCS_GRAYSCALE;
jpeg_set_defaults(&jpeg);
jpeg_set_quality(&jpeg, quality, TRUE
);
jpeg_start_compress(&jpeg, TRUE);
int row_stride = width ;
JSAMPROW row_pointer[1];
while (jpeg.next_scanline <
jpeg.image_height) {
row_pointer[0] = &data[jpeg.next_scanline * row_stride];
jpeg_write_scanlines(&jpeg, row_pointer, 1);
}
jpeg_finish_compress(&jpeg);
jpeg_destroy_compress(&jpeg);
fclose( pFile );
pFile = NULL;
return ;
}
int _tmain(int argc, _TCHAR* argv[])
{
char *filename="12.jpg";
int width=0;
int height=0;
unsigned char *bmpBuffer=(unsigned char
*)malloc(1080*960*sizeof(unsigned char));
readJpegImage(filename,bmpBuffer,width,height);
writeJpegImage("6.jpg",bmpBuffer,width,height,80);
//free(bmpBuffer);
bmpBuffer=NULL;
return 1;
}
可能遇到的问题:
1.参数个数不匹配。解决方法:在libjpeg.h头文件中加入jconfig.h和jmoreconfig.h头文件,注意他们的顺序,由于jconfig和jmoreconfig中有boolean和宏定义,顺序反了会提示boolean有重定义。
2.简单解释下JSAMPLE,JSAMPROW,JSAMPARRAY;从下面的定义我们可以看出
typedef unsigned char JSAMPLE;
typedef JSAMPLE FAR *JSAMPROW;
typedef JSAMPROW *JSAMPARRAY;
JSAMPLE就是无符号字符型 定义一个变量就是个字符等价于=====unsigned char temp;
JSAMPROW就是一个字符型指针 定义一个变量就等价于=========unsigned char *temp
JSAMPARRAY是一个二维的字符型指针,定义一个变量就等价于一个二维数组===unsigned char
**temp
3.参考博客论文列举如下 方便大家参看,又不懂的地方可以留言,看到会回复。