使用GDI中的Image类的构造函数,直接从文件路径读取图像后,调用Image类的Save方法将BMP转换成jpg。

使用GetImageEncodersSize之前一定要初始化GDIplus。最好在函数里面

ULONG_PTR gdiplusToken;

Gdiplus::GdiplusStartupInput gdiplusStartupInput;

Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

退出的时候记得

Gdiplus::GdiplusShutdown(gdiplusToken);

1.添加头文件

#include < Gdiplus.h>
#pragma comment(lib, "Gdiplus.lib")
using namespace Gdiplus;
#include <Objbase.h>
#include <Objidl.h>
#pragma comment(lib, "Ole32.lib")
#pragma comment(lib, "Uuid.lib")

2.定义公共函数

INT GetEncoderClsid(const WCHAR *format, CLSID *pClsid)
{UINT  num = 0;          // number of image encoders    UINT  size = 0;         // size of the image encoder array in bytes    ImageCodecInfo* pImageCodecInfo = NULL;GetImageEncodersSize(&num, &size);if (size == 0){return -1;  // Failure   }pImageCodecInfo = (ImageCodecInfo*)(malloc(size));if (pImageCodecInfo == NULL){return -1;  // Failure   }GetImageEncoders(num, size, pImageCodecInfo);for (UINT j = 0; j < num; ++j){if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0){*pClsid = pImageCodecInfo[j].Clsid;free(pImageCodecInfo);return j;  // Success    }}free(pImageCodecInfo);return -1;  // Failure
}
void WriteJPGFile(BYTE *pData, DWORD dwLen)
{HANDLE hFile = CreateFile(L"F:\\1.jpg", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile != INVALID_HANDLE_VALUE){DWORD dwWrite = 0;WriteFile(hFile, pData, dwLen, &dwWrite, NULL);CloseHandle(hFile);}
}

3.调用

CLSID codecClsid;GetEncoderClsid(L"image/jpeg", &codecClsid);int iQuality = 100;EncoderParameters encoderParameters;encoderParameters.Count = 1;encoderParameters.Parameter[0].Guid = EncoderQuality;encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;encoderParameters.Parameter[0].NumberOfValues = 1;encoderParameters.Parameter[0].Value = &iQuality;Image pImage(L"F:\\nn\\m_2.bmp");//这里可以改成图片路径IStorage* pIStorage = NULL;IStream* pJPGStream = NULL;HRESULT hr = StgCreateDocfile(NULL, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, &pIStorage);if (SUCCEEDED(hr)){hr = pIStorage->CreateStream(L"StreamImage1", STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &pJPGStream);DWORD dwErr = GetLastError();if (SUCCEEDED(hr)){Status bStatus = pImage.Save(pJPGStream, &codecClsid);//将bmp转jpg后保存在内存中//Status bStatus = pImage.Save(L"f:\\1.jpg", &codecClsid);//如果是保存为文件则把注释去掉BYTE * pJPGData = new BYTE[1024 * 1024];memset(pJPGData, 0, 1024 * 1024);LARGE_INTEGER move;move.QuadPart = 0;pJPGStream->Seek(move, STREAM_SEEK_SET, NULL);//定位到流的起始位置DWORD dwRead = 0;hr = pJPGStream->Read(pJPGData, 1024 * 1024, &dwRead);//在read之前必须seek。否则读取不出来数据。jpg数据已经保存在pJPGData中WriteJPGFile(pJPGData, dwRead);delete[] pJPGData;}}// Get the class identifier for the JPEG encoder.if (pJPGStream){pJPGStream->Release();}if (pIStorage){pIStorage->Release();}

demo: http://download.csdn.net/detail/sz76211822/9819193

C++ BMP转JPG方法二相关推荐

  1. 链表问题15——将搜索二叉树转换成双向链表(方法二)

    题目 题目同上一篇文章,即题目将二叉树按照中序顺序转换成双向链表 思路 方法二:利用递归函数,不使用任何容器.时间复杂度为O(N),额外空间复杂度为O(h),h为二d d d df叉树的高度 首先需要 ...

  2. 链表问题14——在单链表种删除指定值的节点(方法二)

    题目 题目可参考上一篇文章,删除链表中的指定值 思路 方法二:不用任何容器,直接调整.时间复杂度O(N),空间复杂度O(1) 因为最后计划返回链表头,所以先遍历链表按顺序找到第一个不等于num的节点作 ...

  3. 链表问题13——删除无序单链表中值重复出现的节点(方法二)

    题目 同上一篇题目,本篇介绍方法二类似于选择排序的过程,时间复杂度为O(),额外空间复杂度为O(1), 思路 按顺序遍历节点 先是记录当前节点,然后去查看后面是否还有重复,有的话删掉,直到遍历完 然后 ...

  4. 链表问题12——将单链表的每K个节点之间逆序(方法二)

    题目 题目同上一篇方法一中的题目. 思路 方法二:在原链表中调整 用变量记录每一组开始的第一个节点,最后一个节点,然后逆序即可. 源码 public class Node{public int val ...

  5. 链表问题10——两个单链表生成相加链表(方法二)

    题目 假设链表中每一个节点的值都在0-9之间,链表整体代表一个整数. 给定两个这种链表的头节点,请生成代表两个整数相加值的结果链表. 链表1 链表2 生成的新链表 9->3->7 6-&g ...

  6. 多台linux无密码访问之方法二

    一:实验环境同"多台linux无密码访问之方法一" 二:配置过程 前3步同"多台linux无密码访问之方法一" ★第四步不同于方法一 4.在.ssh目录下创建一 ...

  7. BMP格式知识之二:16位,24位,32位的BMP图片算法是如何运算的

    BMP格式知识之二:16位,24位,32位的BMP图片算法是如何运算的 原文:http://blog.csdn.net/qq445803843/article/details/46476433 这段代 ...

  8. 攻防世界(Pwn) forgot---栈溢出;(方法二)

    攻防世界(Pwn) forgot-栈溢出:(方法一) 里面对问题描述的更详细一点 返回目标函数 0x80486CC 方法二(爆破流) 因为最终返回的是 v3[0]-v3[9] 之中的一个函数, v3[ ...

  9. windows右键没有显示“文本文档”的解决办法(建议用方法二)

    很多时候,我们要使用记事本的话,都是通过右键---新建文本文档来实现.但是,当系统设置不当,有时候右键的新建菜单里就没有新建文本文档这一项.下面就讲讲怎么恢复右键的新建菜单,让新建文本文档重新出现 工 ...

  10. python使用近似公式计算e_python如何算自然底数e(方法二)

    原标题:python如何算自然底数e(方法二) e的展开式 e的近似值 e ≈ 2.71828 18284 59045 23536 02874 71352 66249 77572 47093 6999 ...

最新文章

  1. react 嵌套渲染_React 中嵌套数组数据如何渲染到前端页面
  2. 二层交换机的六条安全秘诀
  3. docker中部署hadoop、zookeeper、hbase伪分布式并上传到阿里云远程仓库
  4. Oracle查找Web执行SQL
  5. matlab 进度条/waitbar 显示运行进度
  6. Visual Studio 2008 安装失败(“Web 创作组件”无法安装)解决方法
  7. 94年的博士后又拿到了这个金奖!原来是他的学弟
  8. python爬虫短片_Python爬虫练习:爬取全民小视频(附代码,过程)
  9. Jzoj1307 Jail
  10. JQuery左右切换实现
  11. 研究生课程笔记:软件包在流行病学中的应用(一)——PASS软件
  12. ipad文献管理软件_五款常用的文献管理神软件
  13. 前端接收pdf文件_前端利用pdfobject.js处理pdf文件
  14. 下载英文电子书网站,推荐
  15. Java面试-北大青鸟合肥科海学院
  16. 解决XP IIS连接访问人数限制的问题
  17. RTR4 拾遗(一)-- 图形学的B面
  18. Python基础教程(第三版)读书笔记(8)
  19. QMS-云质-质量管理软件-什么是企业质量知识库?
  20. 2020年雅思机考考点将覆盖全国14城

热门文章

  1. 在C++程序中使用系统热键(附代码)
  2. Crazy Bird
  3. fisco bcos 调用接口报错WeBASE-Node-Manager user not logged in 版本:v1.5.2
  4. erlang 之简单的Diction实现
  5. 提高抗打击能力_提高抗打击能力的简单方法!
  6. Windows下安装tomcat7并设置开机启动服务
  7. linux 安装minio并设置开机自启动
  8. 技术工作总结报告安全性设计报告用户手册如何编写
  9. 关于最短剩余时间优先算法-进程调度模拟【C++】
  10. 使用简短JS事件代码实现原生北京时间时钟