今天用了ijg jpeglib感觉很爽哈。不过由于是用别人的代码,只会压缩图像到硬盘上,却不知道压缩到内存中。同样的问题是知道怎么从硬盘中解压缩图像文件,却不知道怎么解压缩到内存中。
希望大家帮忙,毕竟很多时候不需要使用物理文件!void CjpegthumbnailDlg::OnBnClickedButton1()
{
//创建内存DC,并将创建好的dib选入,往里面写入屏幕的内容
CDC dc;
dc.CreateCompatibleDC(NULL);
RGBTRIPLE* pData;
HBITMAP hDIB = Create24bitsDIB(1024,768,&pData);
dc.SelectObject(hDIB);
DeleteObject(hDIB); CDC* pDCScr = CDC::FromHandle(::GetDC(NULL));
dc.BitBlt(0,0,1024,768,pDCScr,0,0,SRCCOPY); //压缩图像到c:\compressed.jpg下
struct jpeg_compress_struct jcs;//申请并初始化jpeg压缩图像
struct jpeg_error_mgr jem;//指定错误处理器
jcs.err = jpeg_std_error(&jem);
jpeg_create_compress(&jcs);//初始化压缩结构 FILE* fp = fopen("c:\\compressed.jpg","wb");
jpeg_stdio_dest(&jcs,fp); jcs.image_width = 1024;//设置压缩参数
jcs.image_height = 768;
jcs.input_components = 3;//rgb时为3,灰阶图为1
jcs.in_color_space = JCS_RGB;//jcs_grayscale表示灰阶图,jcs_rgb表示颜色空间采用rgb jpeg_set_defaults(&jcs);//采用默认设置
jpeg_set_quality(&jcs,80,true);//设置图像质量 jpeg_start_compress(&jcs,TRUE);//开始压缩 JSAMPROW row_pointer;//行数据指针,开始逐行压缩,也可一次性压缩
int row_stride = ((1024 * 3 + 3) / 4) * 4;//每一行的字节数 for (int l_i = 0; l_i < 768; ++l_i)
{
row_pointer = (JSAMPROW)pData + l_i * row_stride;
for (int l_j = 0; l_j < 1024; ++l_j)//NOTE:rgb要颠倒过来
{
BYTE tmp = ((RGBTRIPLE*)row_pointer)[l_j].rgbtBlue;
((RGBTRIPLE*)row_pointer)[l_j].rgbtBlue = ((RGBTRIPLE*)row_pointer)[l_j].rgbtRed;
((RGBTRIPLE*)row_pointer)[l_j].rgbtRed = tmp;
}
jpeg_write_scanlines(&jcs,&row_pointer,1);
} jpeg_finish_compress(&jcs);

jpeg_destroy_compress(&jcs);//释放压缩对象 fclose(fp);
}void CjpegthumbnailDlg::OnBnClickedButton2()
{
//将c:\\compressed.jpg解压缩到dc中
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr; cinfo.err = jpeg_std_error(&jerr);//指定错误处理器
jpeg_create_decompress(&cinfo); FILE* fp = fopen("c:\\compressed.jpg","rb");//打开jpg文件指定为要解压缩的文件
if (NULL == fp)
{
return;
}
jpeg_stdio_src(&cinfo,fp); jpeg_read_header(&cinfo,TRUE);//读取图像信息  RGBTRIPLE* pData = NULL;
HBITMAP hDIB = Create24bitsDIB(cinfo.image_width,cinfo.image_height,&pData);//根据图像信息创建一个24位dib jpeg_start_decompress(&cinfo);//开始解压缩
JSAMPROW row_pointer;
int bytesperrow = ((cinfo.image_width * 3 + 3) / 4) * 4; for (int l_i = 0; l_i < cinfo.image_height; ++l_i)
{
row_pointer = (JSAMPROW)pData + l_i * bytesperrow;
jpeg_read_scanlines(&cinfo,&row_pointer,1);
for (int l_j = 0; l_j < cinfo.image_width; ++l_j)//NOTE:反转rgb三元组
{
BYTE tmp = ((RGBTRIPLE*)row_pointer)[l_j].rgbtRed;
((RGBTRIPLE*)row_pointer)[l_j].rgbtRed = ((RGBTRIPLE*)row_pointer)[l_j].rgbtBlue;
((RGBTRIPLE*)row_pointer)[l_j].rgbtBlue = tmp;
}
} //将图像输出到窗口中
CDC dc;
dc.CreateCompatibleDC(NULL);
dc.SelectObject(hDIB);
DeleteObject(hDIB); this->GetDC()->BitBlt(0,0,cinfo.image_width,cinfo.image_height,&dc,0,0,SRCCOPY); jpeg_finish_decompress(&cinfo);//结束解压缩
jpeg_destroy_decompress(&cinfo);//释放解压缩对象
}