C++ BMP转JPG方法一
读取文件数据后创建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方法一相关推荐
- php前台调用后台方法,JavaScript_JavaScript调用后台的三种方法实例,方法一:直接使用%=%调 - phpStudy...
JavaScript调用后台的三种方法实例 方法一:直接使用调用 前台JS: var methodStr = ""; alert(methodStr); 后头方法: public ...
- 导出oracle sequences,CSS_oracle导出序列方法分析,方法一:SELECT ' CREATE SEQUEN - phpStudy...
oracle导出序列方法分析 方法一: SELECT ' CREATE SEQUENCE '||SEQUENCE_NAME|| ' INCREMENT BY '|| INCREMENT_BY ||' ...
- JBOSS通过Apache负载均衡方法一:使用mod_jk
JBOSS通过Apache负载均衡方法一:使用mod_jk 本文第一.二节分别对Linux环境下前端使用Apache以及windows环境下前端使用IIS通过AJP协议和后端的JBOSS通信实现负 ...
- 分析:windows下cmd默认的编码是ASCII编码 ,windows的中文环境下编码是GBK 方法一:在保存输出流保存的时候做一个对文字GBK编码,在输出到文件 如下 [python] view
分析:windows下cmd默认的编码是ASCII编码 ,windows的中文环境下编码是GBK 方法一:在保存输出流保存的时候做一个对文字GBK编码,在输出到文件 如下 [python] view ...
- php excel header,【IT专家】PHP生成excel,方法一-header生成
本文由我司收集整编,推荐下载,如有疑问,请与我司联系 PHP生成excel,方法一:header生成 2018/02/09 444 public function export_order() { / ...
- P2386 放苹果 方法一
http://noi.openjudge.cn/ch0203/666/ /* 2.3基本算法之递归变递推_666放苹果 方法一 http://noi.openjudge.cn/ch0203/666/1 ...
- NOIP2016 复赛普及组第 1 题 买铅笔 方法一
/* NOIP2016 复赛普及组第 1 题 买铅笔 方法一 P1909 买铅笔 https://www.luogu.org/problem/P1909 */ #include<cstdio& ...
- python创建数据库字数不限制_textarea字数限制方法一例
function checkLen(obj) { var maxChars = 30;//最多字符数 if (obj.value.length > maxChars) obj.value = o ...
- python爬虫匹配uniport数据库的Pathway字段是否存在(方法一)
记录一下通过uniprotID获取网页内容并匹配的方法一,这里主要是通过获取的网页内容作为字符串,然后利用python字符串匹配的方法来解决.另外也可以通过获取标签的方法,如果没有这个标签的话,那么就 ...
- HTML 转 PDf 方法一 wkhtmltopdf.exe
工作中涉及到制作PDF报表,找了很多办法,总是不尽人意,有诸多bug,如: 1:中文显示乱码 2:处理字符串分割及换行时要么是字符串被截断无法显示,要么就是无法换行超出显示范围 3:处理分页是内容被截 ...
最新文章
- SAP SD基础知识之信用风险管理概述
- VTK:PolyData之AlignTwoPolyDatas
- 语义分割 - 数据集准备
- 【渝粤教育】国家开放大学2019年春季 2080现代教育思想 参考试题
- 如何在三层交换机上实现跨VLAN 的DHCP配置
- python 调用apollo
- 《0元搭建个人博客史上最详细教程》(阿里云学生服务器+宝塔一键部署篇)
- XCode之第一次亲密接触
- python卡方检验计算pvalue值_用python计算临界值(critical value)和p值(p value)(scipy)...
- Payment相关逻辑
- python的神经网络模块接法图解_关于pytorch中全连接神经网络搭建两种模式详解...
- 亚声速-超声速等熵喷管拟一维流动的CFD解法(附完整代码)
- 山东大学程序设计思维实践- TT与可怜的猫
- 2021综述:计算机视觉中的注意力机制(续四):分支注意力
- 编码字符串,使得总长度最短
- JAVA心理测评系统毕业设计,JAVA心理健康评测系统设计与实现,毕设作品参考
- 程序员疯传「编程语言鄙视链」,究竟谁能逃过一劫?
- 微博热点爬取html,爬虫实战-Ajax类型数据之微博爬取
- 41、流量统计--代码实现
- GitBook制作电子书使用教程