读取文件数据后创建IStream对象,再调用IStream类方法read将JPG数据以二进制流读取出来。

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

ULONG_PTR gdiplusToken;

Gdiplus::GdiplusStartupInput gdiplusStartupInput;

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

退出的时候记得

Gdiplus::GdiplusShutdown(gdiplusToken);

1.添加GDI头文件

#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);}
}

调用:

HANDLE hFile = CreateFile(L"F:\\nn\\m_2.bmp", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile != INVALID_HANDLE_VALUE){DWORD dwFilesize = GetFileSize(hFile, NULL);//获取文件大小HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFilesize);//分配文件内存if (hGlobal){BYTE *pvData = (BYTE*)GlobalLock(hGlobal);DWORD dwRead = 0;ReadFile(hFile, pvData, dwFilesize, &dwRead, NULL);//将文件数据读取到内存中GlobalUnlock(hGlobal);{IStream *pBMPStream = NULL;HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pBMPStream);//将二进制流存到流对象if (SUCCEEDED(hr)){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(pBMPStream);//这里可以改成图片路径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];//申请1M的空间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。否则读取不出来数据WriteJPGFile(pJPGData, dwRead);delete[] pJPGData;}}// Get the class identifier for the JPEG encoder.if (pJPGStream){pJPGStream->Release();}if (pBMPStream){pBMPStream->Release();}if (pIStorage){pIStorage->Release();}}}GlobalFree(hGlobal);}CloseHandle(hFile);}

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

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

  1. php前台调用后台方法,JavaScript_JavaScript调用后台的三种方法实例,方法一:直接使用%=%调 - phpStudy...

    JavaScript调用后台的三种方法实例 方法一:直接使用调用 前台JS: var methodStr = ""; alert(methodStr); 后头方法: public ...

  2. 导出oracle sequences,CSS_oracle导出序列方法分析,方法一:SELECT ' CREATE SEQUEN - phpStudy...

    oracle导出序列方法分析 方法一: SELECT ' CREATE SEQUENCE '||SEQUENCE_NAME|| ' INCREMENT BY '|| INCREMENT_BY ||' ...

  3. JBOSS通过Apache负载均衡方法一:使用mod_jk

    JBOSS通过Apache负载均衡方法一:使用mod_jk   本文第一.二节分别对Linux环境下前端使用Apache以及windows环境下前端使用IIS通过AJP协议和后端的JBOSS通信实现负 ...

  4. 分析:windows下cmd默认的编码是ASCII编码 ,windows的中文环境下编码是GBK 方法一:在保存输出流保存的时候做一个对文字GBK编码,在输出到文件 如下 [python] view

    分析:windows下cmd默认的编码是ASCII编码 ,windows的中文环境下编码是GBK 方法一:在保存输出流保存的时候做一个对文字GBK编码,在输出到文件 如下 [python] view ...

  5. php excel header,【IT专家】PHP生成excel,方法一-header生成

    本文由我司收集整编,推荐下载,如有疑问,请与我司联系 PHP生成excel,方法一:header生成 2018/02/09 444 public function export_order() { / ...

  6. P2386 放苹果 方法一

    http://noi.openjudge.cn/ch0203/666/ /* 2.3基本算法之递归变递推_666放苹果 方法一 http://noi.openjudge.cn/ch0203/666/1 ...

  7. NOIP2016 复赛普及组第 1 题 买铅笔 方法一

    /* NOIP2016 复赛普及组第 1 题 买铅笔 方法一  P1909 买铅笔 https://www.luogu.org/problem/P1909 */ #include<cstdio& ...

  8. python创建数据库字数不限制_textarea字数限制方法一例

    function checkLen(obj) { var maxChars = 30;//最多字符数 if (obj.value.length > maxChars) obj.value = o ...

  9. python爬虫匹配uniport数据库的Pathway字段是否存在(方法一)

    记录一下通过uniprotID获取网页内容并匹配的方法一,这里主要是通过获取的网页内容作为字符串,然后利用python字符串匹配的方法来解决.另外也可以通过获取标签的方法,如果没有这个标签的话,那么就 ...

  10. HTML 转 PDf 方法一 wkhtmltopdf.exe

    工作中涉及到制作PDF报表,找了很多办法,总是不尽人意,有诸多bug,如: 1:中文显示乱码 2:处理字符串分割及换行时要么是字符串被截断无法显示,要么就是无法换行超出显示范围 3:处理分页是内容被截 ...

最新文章

  1. SAP SD基础知识之信用风险管理概述
  2. VTK:PolyData之AlignTwoPolyDatas
  3. 语义分割 - 数据集准备
  4. 【渝粤教育】国家开放大学2019年春季 2080现代教育思想 参考试题
  5. 如何在三层交换机上实现跨VLAN 的DHCP配置
  6. python 调用apollo
  7. 《0元搭建个人博客史上最详细教程》(阿里云学生服务器+宝塔一键部署篇)
  8. XCode之第一次亲密接触
  9. python卡方检验计算pvalue值_用python计算临界值(critical value)和p值(p value)(scipy)...
  10. Payment相关逻辑
  11. python的神经网络模块接法图解_关于pytorch中全连接神经网络搭建两种模式详解...
  12. 亚声速-超声速等熵喷管拟一维流动的CFD解法(附完整代码)
  13. 山东大学程序设计思维实践- TT与可怜的猫
  14. 2021综述:计算机视觉中的注意力机制(续四):分支注意力
  15. 编码字符串,使得总长度最短
  16. JAVA心理测评系统毕业设计,JAVA心理健康评测系统设计与实现,毕设作品参考
  17. 程序员疯传「编程语言鄙视链」,究竟谁能逃过一劫?
  18. 微博热点爬取html,爬虫实战-Ajax类型数据之微博爬取
  19. 41、流量统计--代码实现
  20. GitBook制作电子书使用教程

热门文章

  1. Natural_Earth 全球地形渲染图 Version 3.2
  2. 指定服务器不存在或访问被拒绝访问,SQL Server不存在或访问被拒绝怎么办
  3. HTML5来了,7个混合式移动开发框架
  4. c语言文字表达式,【原创】化学方程式配平算法的设计与实现( 非Naylon版)
  5. 快速掌握阿里云 OSS
  6. 个人如何购买腾讯云服务器
  7. 解析十大网络防骗术 全面防范网络欺诈
  8. SQL语句 日期查询
  9. 开启使用SPR Batch 问题记录
  10. m4s格式转换mp3_音乐怎么转换mp3格式