终于可以解压jpeg的格式了.
在网上找了一堆方法,现在来总结一下,用的第三方库libjpeg.
首先要装载库文件libjpeg,我已经用dev-cpp的make制好了一个.a的库文件, 和.lib一样的用.还有几个头文件都需要.
然后就是调函数,(照抄网上的):
//插入头文件
//网上说这是C写的库,如果调用不了库函数,在编译器选项中选择好库文件就行了
extern "C"
{
#include "jpeglib.h"
}
/**************************************************
读取jpeg
**************************************************/
PAINTSTRUCT ps;
HDC hdc=BeginPaint(hwnd,&ps);
/span>HDC ui_hdc_jpg=CreateCompatibleDC(hdc);//创建一个兼容的画架
//1、声明并初始化解压缩对象,同时制定错误信息管理器
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
//打开图像文件
FILE *f = fopen("pic2.jpg","rb");
jpeg_stdio_src(&cinfo, f);
//在wm_paint消息下使用画布
//读取信息头
jpeg_read_header(&cinfo, TRUE);
short jpgwidth=cinfo.image_width;
short jpgheight=cinfo.image_height;
short jpg_components=cinfo.num_components;
//创建一个位图句柄,以便在上面画点
HBITMAP himage3=(HBITMAP)LoadImage(hinstance,"pic1.bmp",IMAGE_BITMAP,jpgwidth,jpgheight,LR_LOADFROMFILE);
//根据信息头设定缓冲区的大小
BYTE* data = new BYTE [jpgwidth*jpgheight*jpg_components];
//开始解压缩
jpeg_start_decompress(&cinfo);
//开始读取压缩信息
JSAMPROW row_pointer[1];
while (cinfo.output_scanline < jpgheight)
{
unsigned int index=(jpgheight-cinfo.output_scanline-1)*jpgwidth*jpg_components;
//unsigned int index=(cinfo.output_scanline)*jpgwidth*jpg_components;
row_pointer[0]=&data[index];
jpeg_read_scanlines(&cinfo,row_pointer ,1);
}
jpeg_finish_decompress(&cinfo);
//释放资源 ,关闭文件
jpeg_destroy_decompress(&cinfo);
fclose(f);
///
SelectObject(ui_hdc_jpg,himage3);
//一个一个地往画架上画点
for(int row=0;row<jpgheight;row++)
{
for(int col=0;col<jpgwidth;col++)
{
long rowcol_translate=row*(jpgwidth*jpg_components)+col*jpg_components;
unsigned char r=data[rowcol_translate];
unsigned char g=data[rowcol_translate+1];
unsigned char b=data[rowcol_translate+2];
COLORREF rgb=RGB(r,g,b);
//先出来的是最底下的像素 ,所有要从下往上画点才行
SetPixel(ui_hdc_jpg,col,jpgheight-row-1,rgb);
}
}
//贴在画布上
BitBlt(hdc,0,0,jpgwidth,jpgheight,ui_hdc_jpg,0,0,SRCCOPY);
//释放资源
DeleteDC(ui_hdc_jpg);
EndPaint(hwnd,&ps);