博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对bmp文件内存压缩 与 解压缩
阅读量:4700 次
发布时间:2019-06-09

本文共 3055 字,大约阅读时间需要 10 分钟。

对24位bmp位图文件进行jpg的压缩

传出的参数:outdata 压缩后数据内存指针 nSize 压缩后数据的大小

传入参数:bmp文件的内存数据 以及文件信息

需要 jconfig.h jmorecfg.h jpeglib.h libjpeg.lib 文件支持

void BmptoJpg(BYTE* &outdata,int &nSize,BITMAP m_bmpBit1,BYTE* m_pBmpData1,BITMAPINFO BitmapInfo)  //返回压缩后jpg数据,数据的大小

{
  
 int nAdjust24;
 UINT dwRead=0;
  BYTE* pData24;
 nAdjust24 = BitmapInfo.bmiHeader.biWidth*3%4;
 if (nAdjust24) nAdjust24 = 4-nAdjust24;
  pData24 = new BYTE[(BitmapInfo.bmiHeader.biWidth*3+nAdjust24)*BitmapInfo.bmiHeader.biHeight];
  for (int j=0;j<BitmapInfo.bmiHeader.biHeight;j++){
   for (int i = 0;i<BitmapInfo.bmiHeader.biWidth;i++)
   {
    BYTE red = m_pBmpData1[j*(BitmapInfo.bmiHeader.biWidth*3+nAdjust24)+i*3];
    m_pBmpData1[j*(BitmapInfo.bmiHeader.biWidth*3+nAdjust24)+i*3] =m_pBmpData1[j*(BitmapInfo.bmiHeader.biWidth*3+nAdjust24)+i*3+2];
    m_pBmpData1[j*(BitmapInfo.bmiHeader.biWidth*3+nAdjust24)+i*3+2] = red;
   }
  }
 struct jpeg_compress_struct jcs;
 struct jpeg_error_mgr jem;
 jcs.err = jpeg_std_error(&jem);

 jpeg_create_compress(&jcs);

 jpeg_stdio_dest(&jcs,(char*)outdata,&nSize);

 jcs.image_width = BitmapInfo.bmiHeader.biWidth;    // 为图的宽和高,单位为像素
 jcs.image_height = BitmapInfo.bmiHeader.biHeight;
 jcs.input_components = 3;   // 1,表示灰度图, 如果是彩色位图,则为3
 jcs.in_color_space = JCS_RGB;

 jpeg_set_defaults(&jcs); 

 jpeg_set_quality (&jcs, 60, true);

 jpeg_start_compress(&jcs, TRUE);

 JSAMPROW row_pointer[1];   // 一行位图

 int row_stride;      // 每一行的字节数

 row_stride = jcs.image_width*3;  // 如果不是索引图,此处需要乘以3

 // 对每一行进行压缩

 while (jcs.next_scanline < jcs.image_height) {
     row_pointer[0] = & m_pBmpData1[(jcs.image_height-jcs.next_scanline-1) * (row_stride+nAdjust24)];
     jpeg_write_scanlines(&jcs, row_pointer, 1);
 }

 jpeg_finish_compress(&jcs);

 jpeg_destroy_compress(&jcs);

 delete [] pData24;

}

 

void JpgtoBmp(BYTE *indata,int nSize,int size,BYTE* &data)  //size为生成bmp文件分配的内存大小,后面已更正了RGB序列,但还存在RGB逆序的错误,使生成的文件                                                                                     //颜色不对,还需改进

{
    BITMAPFILEHEADER bfh;  // bmp文件头
 BITMAPINFOHEADER bih;  // bmp头信息
 RGBQUAD rq[256];   // 调色板
 int nAdjust; // 用于字节对齐
 int nComponent = 0;

 // 声明解压缩对象及错误信息管理器

 struct jpeg_decompress_struct cinfo;
 struct jpeg_error_mgr jerr;

 cinfo.err = jpeg_std_error(&jerr);

 jpeg_create_decompress(&cinfo);
 jpeg_stdio_src(&cinfo,(char*) indata,nSize);
 jpeg_read_header(&cinfo, TRUE);
 nAdjust = cinfo.image_width*cinfo.num_components%4;
 if (nAdjust) nAdjust = 4-nAdjust;
 data = new BYTE[size]; 
 jpeg_start_decompress(&cinfo);
 JSAMPROW row_pointer[1];
 while (cinfo.output_scanline < cinfo.output_height)
 {
  row_pointer[0] = &data[(cinfo.output_height - cinfo.output_scanline-1)*(cinfo.image_width*cinfo.num_components+nAdjust)];
  jpeg_read_scanlines(&cinfo,row_pointer ,
     1);
 }
 jpeg_finish_decompress(&cinfo);
 jpeg_destroy_decompress(&cinfo);

 for (int j=0;j<bih.biHeight;j++)

  for (int i = 0;i<bih.biWidth;i++)
  {
   BYTE red = data[j*(cinfo.image_width*cinfo.num_components+nAdjust)+i*3];
   data[j*(cinfo.image_width*cinfo.num_components+nAdjust)+i*3] = data[j*(cinfo.image_width*cinfo.num_components+nAdjust)+i*3+2];
   data[j*(cinfo.image_width*cinfo.num_components+nAdjust)+i*3+2] = red;
  }
 
}

转载于:https://www.cnblogs.com/xiaoluyiqing/archive/2012/03/14/2396206.html

你可能感兴趣的文章
rpc服务和http服务的区别
查看>>
tomcat服务器
查看>>
redis
查看>>
springmvc笔记
查看>>
tp根据用户id修改其信息
查看>>
修改用户信息
查看>>
安装最新版的jenkins
查看>>
idea中的springboot项目如何不用重新编译,自动热部署
查看>>
idea打开了多个项目,多idea窗口相互切换的快捷键
查看>>
Swift5升级遇到的AVCapturexxxDelegate的坑,写法换了
查看>>
Mac查看及清理QQ、微信本地下载的文档、图片、视频等
查看>>
redux的简单使用
查看>>
HDU - 4417 Super Mario(分块+二分)
查看>>
Manacher 算法
查看>>
Glider Gym - 101911B(二分+前缀和)
查看>>
Greedy Pirate Gym - 101810M (lca)
查看>>
线性基(模板)
查看>>
bzoj-1030: [JSOI2007]文本生成器(ac自动机+dp)
查看>>
Bus Planning(状压DP)
查看>>
HDU 1828 Picture(线段树:扫描线 面积并)
查看>>