终于可以解压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);
分享到:
相关推荐
一个Jpeg压缩和解压的类,把开源的Jpeg压缩解压代码做了一个封装,很好用。
通过VC++语言,使用基于离散余弦变换的技术,实现jpeg的图像压缩与解压。
JPEG_JPEG2000 压缩解压源码
JPEG图像压缩和解压MATLAB程序,使用了DCT2、线性量化编码、zigzag变换和游程编码理论
利用JPEG2000标准进行图像压缩和图像解压的Matlab程序
非常不错的jpeg压缩/解压代码,可以实现常用的JPEG压缩/解
JPEG是用于灰度图与真彩图的静态图像压缩的国际标准,它采用的是以DCT(Discrete Cosine ...本章先简介JPEG和JPEG 2000系列标准,然后讲解DCT和JPEG的具体编码方法,最后给出JPEG的文件格式,重点是JPEG的编码算法。
Jpeg图像解压,可以参考其中的几个文件
JPEG压缩编码系统源代码
JPEG解压软件,包含PC端的测试程序,程序结构比较清晰
symbian的实例代码,适合初学者学习,是JPEG解压实例
JPEG2000图像压缩、解压,MATLAB下的所有源代码。
jpeg压缩解压编码,涉及变换量化的所有过程
本软件是一个通用的解压JPEG文件的源码,您可以从中学到JPEG解压原理,由于使用Delphi写成,所以很严谨。 它实现了JPEG解码的全部过程!
使用CUDA8.0封装的JPEG压缩接口,其中实现了JPEG的CPU和GPU两种方式压缩,其中GPU的压缩效率还需要优化,不过实现方法可以借鉴。
包括 JPEG 压缩 ,解压 代码 compress.m,decompress.m,img2jpg.m,jpg2img.m四个matlab程序
C++,dcmtk,gdcm实现dicom图像解压缩,信息读取,支持jpeg,jpeg2000,jpeg-ls等多种压缩格式,支持有损解压和无损解压
JPEG-LS是图像无损压缩的算法,较低的复杂度。基本原理可以查找一些其他的论文。
自己用matlab写的灰度图像压缩解压程序 jpegencoder可以打开图像压缩后存储为c.jpg(只限于灰度图像) jpegdecoder只适用于把jpegencoder的c.jpg解压,还不可以对任意图像解压,有待以后完善 作者 ar_dong