GDI+ 摘要: 保存图像文件
要保存图像文件,必须先获得图像的编码格式信息。可是GDI+没有直接提供这个函数:GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
因此须要我们自己写一个 GetEncoderClsid 取得图像编码格式的函数
幸好,有 GetImageDecoders函数作为參照
- #include <windows.h>
- #include <gdiplus.h>
- #include <stdio.h>
- using namespace Gdiplus;
- INT main()
- {
- // Initialize GDI+.
- GdiplusStartupInput gdiplusStartupInput;
- ULONG_PTR gdiplusToken;
- GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
- UINT num; // number of image decoders
- UINT size; // size, in bytes, of the image decoder array
- ImageCodecInfo* pImageCodecInfo;
- // How many decoders are there?
- // How big (in bytes) is the array of all ImageCodecInfo objects?
- GetImageDecodersSize(&num, &size);
- // Create a buffer large enough to hold the array of ImageCodecInfo
- // objects that will be returned by GetImageDecoders.
- pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
- // GetImageDecoders creates an array of ImageCodecInfo objects
- // and copies that array into a previously allocated buffer.
- // The third argument, imageCodecInfos, is a pointer to that buffer.
- GetImageDecoders(num, size, pImageCodecInfo);
- // Display the graphics file format (MimeType)
- // for each ImageCodecInfo object.
- for(UINT j = 0; j < num; ++j)
- {
- wprintf(L"%s\n", pImageCodecInfo[j].MimeType);
- }
- free(pImageCodecInfo);
- GdiplusShutdown(gdiplusToken);
- return 0;
- }
The preceding code produces the following output:
image/bmp
image/jpeg
image/gif
image/x-emf
image/x-wmf
image/tiff
image/png
image/x-icon
仿照上例 ,我们编写自己的。获得编码格式的函数GetEncoderClsid()
- 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
- }
保存图像文件:
Example_1:
- VOID Example_SaveFile(HDC hdc)
- {
- Graphics graphics(hdc);
- // Create an Image object based on a PNG file.
- Image image(L"Mosaic.png");
- // Draw the image.
- graphics.DrawImage(&image, 10, 10);
- // Construct a Graphics object based on the image.
- Graphics imageGraphics(&image);
- // Alter the image.
- SolidBrush brush(Color(255, 0, 0, 255));
- imageGraphics.FillEllipse(&brush, 20, 30, 80, 50);
- // Draw the altered image.
- graphics.DrawImage(&image, 200, 10);
- // Save the altered image.
- CLSID pngClsid;
- GetEncoderClsid(L"image/png", &pngClsid);
- image.Save(L"Mosaic2.png", &pngClsid, NULL);
- }
Example_2:
- void CMyView::SavePic(HBITMAP hBitmap, CString szPicFilePath)
- {
- if(!hBitmap) return;
- if(PathFileExists(szPicFilePath))
- CFile::Remove(szPicFilePath);
- BITMAP bm;
- GetObject(hBitmap,sizeof(BITMAP),&bm);
- WORD BitsPerPixel=bm.bmBitsPixel;
- using namespace Gdiplus;
- Bitmap* bitmap=Bitmap::FromHBITMAP(hBitmap,NULL);
- EncoderParameters encoderParameters;
- ULONG compression;
- CLSID clsid;
- if(BitsPerPixel==1)
- {
- compression=EncoderValueCompressionCCITT4;
- }
- else
- {
- compression=EncoderValueCompressionLZW;
- }
- GetEncoderClsid(L"image/tiff", &clsid);
- encoderParameters.Count=1;
- encoderParameters.Parameter[0].Guid=EncoderCompression;
- encoderParameters.Parameter[0].Type=EncoderParameterValueTypeLong;
- encoderParameters.Parameter[0].NumberOfValues=1;
- encoderParameters.Parameter[0].Value=&compression;
- bitmap->Save(szPicFilePath,&clsid,&encoderParameters);
- delete bitmap;
- /*
- compression=100;
- GetEncoderClsid(L"image/jpeg", &clsid);
- encoderParameters.Count = 1;
- encoderParameters.Parameter[0].Guid = EncoderQuality;
- encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
- encoderParameters.Parameter[0].NumberOfValues = 1;
- encoderParameters.Parameter[0].Value =&compression;
- */
- }
GDI+ 摘要: 保存图像文件的更多相关文章
- VC保存当面某个区域的图片
void ViewReportDlg::CopyScreenToBitmap() { CDC *cdc = this->GetDC(); HDC wnd = cdc->GetSafeHdc ...
- 跟我一起学opencv 第一课之图像加载,修改,保存
使用opencv前记得引入库和头文件: #include<opencv2\opencv.hpp> 1.加载图像(cv::imread)(OPENCV 支持 JPG,PNG,TIFF等常见格 ...
- 【OpenCV学习笔记之一】图像加载,修改及保存
加载图像(用cv::imread)imread功能是加载图像文件成为一个Mat对象 其中第一个参数表示图像文件名称第二个参数 表示加载的图像是什么类型 支持常见的三个参数值IMREAD_UNCHANG ...
- Windows GDI绘图基础知识
一.Windows可以画直线.椭圆线(椭圆圆周上的曲线)和贝塞尔曲线.////////////7 个画线函式是:(1)画直线LineTo BOOL LineTo(HDC hdc,int nXEn ...
- openCV - 1. 加载、修改、保存图像
加载 cv::imread 修改 cv::cvtColor 保存 cv::imwrite 加载图像cv::imread imread功能是加载图像文件成为一个Mat对象,其中第一个参数表示图像文件名称 ...
- (原创)[C#] GDI+ 之鼠标交互:原理、示例、一步步深入、性能优化
一.前言 "GDI+"与"鼠标交互",乍一听好像不可能,也无从下手,但是实现原理比想象中要简单很多. 基于"GDI+"的"交互&q ...
- Duiib 创建不规则窗口(转载)
方法一: 转载:http://blog.csdn.net/chenlycly/article/details/46447297 转载:http://blog.csdn.net/harvic880925 ...
- C#中的bitmap类和图像像素值获取方法
一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetP ...
- c#图像处理入门(-bitmap类和图像像素值获取方法) 转
一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetP ...
随机推荐
- 依据Uri获得sd卡图片
<pre name="code" class="java">String mBigImage = URLEncoder.encode(mImageU ...
- CentOS 忘记 root password处理
在倒计时启动时间,按任意键进入,例如下面的页面 输入 e. 进入这个页面.上下移动至高亮条到中间 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ29yZV ...
- 大约sql声明优化
最近做的mysql数据库优化,并sql声明优化指南.我写了一个小文件.这种互相鼓励有关! 数据库参数获得的性能优化升级都在一起只占数据库应用系统的性能改进40%左右.其余60%的系统性能提升所有来自相 ...
- 5、VS2010+ASP.NET MVC4+EF4+JqueryEasyUI+Oracle该项目的开发——使用datagrid做报表
来点需要:我使用的数据库访问EF框架,但是,因为使用一个动态表来的统计报告中.单独是每天产生基于数据表,它是很难使用EF加盟前.所以我包装在两组数据库存取层的框内,一个是EF,一种是传统的ADO.NE ...
- 接收一个IT招聘促销信息,试着想参加,有兴趣的可以携手并进,共同。
时隆重举行! 招聘的企业: (个人认为,中智.也买酒还是非常有吸引力的) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHdia2Zj/font/5a6L ...
- UVALive 5099 Nubulsa Expo 全球最小割 非网络流量 n^3
主题链接:点击打开链接 意甲冠军: 给定n个点m条无向边 源点S 以下m行给出无向边以及边的容量. 问: 找一个汇点,使得图的最大流最小. 输出最小的流量. 思路: 最大流=最小割. 所以题意就是找全 ...
- thinkphp学习笔记5—模块化设计
原文:thinkphp学习笔记5-模块化设计 1.模块结构 完整的ThinkPHP用用围绕模块/控制器/操作设计,并支持多个入口文件盒多级控制.ThinkPHP默认PATHINFO模式,如下: htt ...
- 沃森Mysql数据库修复工具
华信Mysql数据库修复程序是由北京华信数据恢复中心独立研发.主要针对Mysql数据库损坏的恢复. 本程序可用于因为各种误操作而导致数据丢失的恢复,以及因为断电.陈列损坏.硬盘坏道等各种原因导致数据库 ...
- CQRS
CQRS 2015-06-04 15:33 by 敏捷的水, 177 阅读, 0 评论, 收藏, 编辑 CQRS是Command Query Responsibility Seperation(命令查 ...
- document.domain跨域
原文:[转载]document.domain跨域 document.domain 用来得到当前网页的域名. 比如在地址栏里输入: javascript:alert(document.domain); ...