对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

对bmp文件内存压缩 与 解压缩相关推荐

  1. Linux命令(9)—— 文件的压缩与解压缩

    .gz..bz2..zip文件均可以在linux操作系统下进行解压缩和压缩 tar命令 适用于 .gz..bz2类型文件 tar命令有很多选项 选项 作用 -c 创建出你要打包的文件 -j 压缩或解压 ...

  2. Linux下文件的压缩、解压缩、打包以及提取

    文章目录 Linux下文件的压缩.解压缩.打包以及提取 一.单个文件的解压缩 1.压缩文件: 2.文件的压缩 3.压缩文件的查看: 4.文件的解压:gunzip [选项] 文件名 二.多个文件的打包和 ...

  3. 哈夫曼树实现文件的压缩与解压缩

    利用哈夫曼树实现文件的压缩与解压缩 压缩: 1.统计出文件中相同字符出现的次数 2.获取哈夫曼编码 次数作为权值构建哈夫曼树 3.重新编码,写回压缩文件 保存头文件: 源文件后缀 编码信息的行数 每个 ...

  4. 数据压缩及解压缩算法,多种文件的压缩与解压缩-java android

    > 数据压缩算法,文本压缩算法 几种压缩算法原理介绍- https://blog.csdn.net/clevercode/article/details/46691645 文本压缩算法的对比和选 ...

  5. 对rar文件的解压缩,对zip文件的压缩与解压缩

    一.对rar文件的解压缩 1.maven <dependency><groupId>com.github.junrar</groupId><artifactI ...

  6. Linux下文件的压缩与解压缩

    Linux下文件的压缩与解压缩与Windows环境下有较大的区别,在Windows下只需要安装类似Winrar工具就能解压缩大部分文件,而在Linux命令行下每一种文件都有不同的压缩和解压缩方法. 使 ...

  7. sudo mysql压缩备份解压操作_高效管理文件之压缩及解压缩 .bz2 文件

    对文件进行压缩,可以通过使用较少的字节对文件中的数据进行编码来显著地减小文件的大小,并且在跨网络的文件的备份和传送时很有用. 另一方面,解压文件意味着将文件中的数据恢复到初始状态.Linux 中有几个 ...

  8. C# 文件的压缩与解压缩

    依赖:.NET Framework 4.5及以上,引用 - 添加引用 - 程序集 System.IO.Compression System.IO.Compression.FileSystem ---- ...

  9. 如何使用Python对文件进行压缩与解压缩

    前言 我们在日常工作中,除了会涉及到使用Python处理文本文件,有时候还会涉及对压缩文件的处理. 通常会涉及到的压缩文件格式有: •rar:Windows 环境下用的比较多的压缩,比较著名的GUI工 ...

最新文章

  1. mybatis基础,mybatis配置文件核心组件typeHandler元素
  2. python 怎么报错后再次启动?
  3. 如何设置wiki权限
  4. linux下声卡的安装
  5. Windows socket测试工具
  6. 用g++编译cpp文件
  7. select去重 sqlserver_SQLSERVER 去重
  8. jeecms oracle v5_jeecms v5 spring和ehcache的整合
  9. 卧龙图甄选 | 惊蛰来到,万物复苏,春天的气息扑面而来
  10. 威斯康星大学硕士计算机科学,威斯康星大学麦迪逊分校计算机科学理学硕士研究生申请要求及申请材料要求清单...
  11. APPLE G5 机箱改造“黑苹果”全攻略
  12. C++11多线程 内存序(std::memory_order_consume)
  13. 【数模系列】02_三大相关系数+Python代码
  14. 病毒木马查杀实战第013篇:一个基于.NET的“敲竹杠”病毒研究
  15. JVM学习(三)JVM内存模型
  16. 「Nescafé26」 Freda的传呼机 【最短路径+树上倍增】
  17. Java项目:基于SSM的婚纱影楼管理系统(计算机毕业设计)
  18. ORACLE-023:令人烦恼的 ora-01722 无效数字
  19. 关于scope.$index, scope.row是什么意思
  20. 我手机计算机屏幕是黑色的,原来如此 手机屏幕边缘的黑边是什么呢?

热门文章

  1. Python实现用户登录
  2. 智慧城市php源码,智慧城市本地O2O系统NIUCMS商业版V3.4完整源码
  3. java实现折半查找_java语言之实现折半查找算法
  4. python循环结构代码_Python --- 程序的循环结构
  5. body 没有被撑开_父div没有被撑开,该怎么解决?_html/css_WEB-ITnose
  6. OMG Network与安全多方计算提供商Enya达成合作
  7. SAP License:ERP厂商比较
  8. SAP License:SAP 清帐函数示例
  9. SAP License:FICO重要概念(二)-附常用技巧
  10. SAP License:物料类型被误删除及解决办法