要保存图像文件,必须先获得图像的编码格式信息。可是GDI+没有直接提供这个函数:GetEncoderClsid(const WCHAR* format, CLSID* pClsid)

因此须要我们自己写一个 GetEncoderClsid 取得图像编码格式的函数

幸好,有 GetImageDecoders函数作为參照

  1. #include <windows.h>
  2. #include <gdiplus.h>
  3. #include <stdio.h>
  4. using namespace Gdiplus;
  5. INT main()
  6. {
  7. // Initialize GDI+.
  8. GdiplusStartupInput gdiplusStartupInput;
  9. ULONG_PTR           gdiplusToken;
  10. GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
  11. UINT  num;        // number of image decoders
  12. UINT  size;       // size, in bytes, of the image decoder array
  13. ImageCodecInfo* pImageCodecInfo;
  14. // How many decoders are there?
  15. // How big (in bytes) is the array of all ImageCodecInfo objects?
  16. GetImageDecodersSize(&num, &size);
  17. // Create a buffer large enough to hold the array of ImageCodecInfo
  18. // objects that will be returned by GetImageDecoders.
  19. pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
  20. // GetImageDecoders creates an array of ImageCodecInfo objects
  21. // and copies that array into a previously allocated buffer.
  22. // The third argument, imageCodecInfos, is a pointer to that buffer.
  23. GetImageDecoders(num, size, pImageCodecInfo);
  24. // Display the graphics file format (MimeType)
  25. // for each ImageCodecInfo object.
  26. for(UINT j = 0; j < num; ++j)
  27. {
  28. wprintf(L"%s\n", pImageCodecInfo[j].MimeType);
  29. }
  30. free(pImageCodecInfo);
  31. GdiplusShutdown(gdiplusToken);
  32. return 0;
  33. }

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()

  1. INT GetEncoderClsid(const WCHAR *format, CLSID *pClsid)
  2. {
  3. UINT  num = 0;          // number of image encoders
  4. UINT  size = 0;         // size of the image encoder array in bytes
  5. ImageCodecInfo* pImageCodecInfo = NULL;
  6. GetImageEncodersSize(&num, &size);
  7. if(size == 0)
  8. return -1;  // Failure
  9. pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
  10. if(pImageCodecInfo == NULL)
  11. return -1;  // Failure
  12. GetImageEncoders(num, size, pImageCodecInfo);
  13. for(UINT j = 0; j < num; ++j)
  14. {
  15. if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
  16. {
  17. *pClsid = pImageCodecInfo[j].Clsid;
  18. free(pImageCodecInfo);
  19. return j;  // Success
  20. }
  21. }
  22. free(pImageCodecInfo);
  23. return -1;  // Failure
  24. }

保存图像文件:

Example_1:

  1. VOID Example_SaveFile(HDC hdc)
  2. {
  3. Graphics graphics(hdc);
  4. // Create an Image object based on a PNG file.
  5. Image  image(L"Mosaic.png");
  6. // Draw the image.
  7. graphics.DrawImage(&image, 10, 10);
  8. // Construct a Graphics object based on the image.
  9. Graphics imageGraphics(&image);
  10. // Alter the image.
  11. SolidBrush brush(Color(255, 0, 0, 255));
  12. imageGraphics.FillEllipse(&brush, 20, 30, 80, 50);
  13. // Draw the altered image.
  14. graphics.DrawImage(&image, 200, 10);
  15. // Save the altered image.
  16. CLSID pngClsid;
  17. GetEncoderClsid(L"image/png", &pngClsid);
  18. image.Save(L"Mosaic2.png", &pngClsid, NULL);
  19. }

Example_2:

  1. void CMyView::SavePic(HBITMAP hBitmap, CString szPicFilePath)
  2. {
  3. if(!hBitmap) return;
  4. if(PathFileExists(szPicFilePath))
  5. CFile::Remove(szPicFilePath);
  6. BITMAP bm;
  7. GetObject(hBitmap,sizeof(BITMAP),&bm);
  8. WORD BitsPerPixel=bm.bmBitsPixel;
  9. using namespace Gdiplus;
  10. Bitmap* bitmap=Bitmap::FromHBITMAP(hBitmap,NULL);
  11. EncoderParameters encoderParameters;
  12. ULONG compression;
  13. CLSID clsid;
  14. if(BitsPerPixel==1)
  15. {
  16. compression=EncoderValueCompressionCCITT4;
  17. }
  18. else
  19. {
  20. compression=EncoderValueCompressionLZW;
  21. }
  22. GetEncoderClsid(L"image/tiff", &clsid);
  23. encoderParameters.Count=1;
  24. encoderParameters.Parameter[0].Guid=EncoderCompression;
  25. encoderParameters.Parameter[0].Type=EncoderParameterValueTypeLong;
  26. encoderParameters.Parameter[0].NumberOfValues=1;
  27. encoderParameters.Parameter[0].Value=&compression;
  28. bitmap->Save(szPicFilePath,&clsid,&encoderParameters);
  29. delete bitmap;
  30. /*
  31. compression=100;
  32. GetEncoderClsid(L"image/jpeg", &clsid);
  33. encoderParameters.Count = 1;
  34. encoderParameters.Parameter[0].Guid = EncoderQuality;
  35. encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
  36. encoderParameters.Parameter[0].NumberOfValues = 1;
  37. encoderParameters.Parameter[0].Value =&compression;
  38. */
  39. }

转会:http://blog.csdn.net/shuilan0066/article/details/7084742

GDI+ 摘要: 保存图像文件的更多相关文章

  1. VC保存当面某个区域的图片

    void ViewReportDlg::CopyScreenToBitmap() { CDC *cdc = this->GetDC(); HDC wnd = cdc->GetSafeHdc ...

  2. 跟我一起学opencv 第一课之图像加载,修改,保存

    使用opencv前记得引入库和头文件: #include<opencv2\opencv.hpp> 1.加载图像(cv::imread)(OPENCV 支持 JPG,PNG,TIFF等常见格 ...

  3. 【OpenCV学习笔记之一】图像加载,修改及保存

    加载图像(用cv::imread)imread功能是加载图像文件成为一个Mat对象 其中第一个参数表示图像文件名称第二个参数 表示加载的图像是什么类型 支持常见的三个参数值IMREAD_UNCHANG ...

  4. Windows GDI绘图基础知识

    一.Windows可以画直线.椭圆线(椭圆圆周上的曲线)和贝塞尔曲线.////////////7 个画线函式是:(1)画直线LineTo    BOOL LineTo(HDC hdc,int nXEn ...

  5. openCV - 1. 加载、修改、保存图像

    加载 cv::imread 修改 cv::cvtColor 保存 cv::imwrite 加载图像cv::imread imread功能是加载图像文件成为一个Mat对象,其中第一个参数表示图像文件名称 ...

  6. (原创)[C#] GDI+ 之鼠标交互:原理、示例、一步步深入、性能优化

    一.前言 "GDI+"与"鼠标交互",乍一听好像不可能,也无从下手,但是实现原理比想象中要简单很多. 基于"GDI+"的"交互&q ...

  7. Duiib 创建不规则窗口(转载)

    方法一: 转载:http://blog.csdn.net/chenlycly/article/details/46447297 转载:http://blog.csdn.net/harvic880925 ...

  8. C#中的bitmap类和图像像素值获取方法

    一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetP ...

  9. c#图像处理入门(-bitmap类和图像像素值获取方法) 转

    一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetP ...

随机推荐

  1. Java程序猿JavaScript学习笔记(14——扩大jQuery UI)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  2. 【cocos2d-js公文】十八、Cocos2d-JS v3.0物业风格API

    1. 新的API风格 我们直接来看看你能够怎样使用Cocos2d-JS v3.0: 曾经的API 新的API node.setPosition(x, y); node.x = x; node.y = ...

  3. 采用shell脚本统计代码的行数

    刚毕业那会儿有一次去台湾公司面试,我问多行代码怎么写.我从来没有想过这个问题,粗略计算,.惊叹:大概几十万行不行. 最近整理资料,看着eclipse左边全面上市,我觉得这个东西.代码共同拥有的行倒底总 ...

  4. oracle11g ASM(修复损坏的磁盘组头asm修复2)

    --编KFED [oracle@rac2 lib]$cd $ORACLE_HOME/rdbms/lib [oracle@rac2 lib]$ pwd /u01/app/oracle/product/1 ...

  5. linux下面的中断处理软件中断tasklet机制

    參考: <Linux内核设计与实现> http://blog.csdn.net/fontlose/article/details/8279113 http://blog.chinaunix ...

  6. IT互联网行业中相关职能的缩写

    RD – Research & Develop 研发FE – Front End 前端QA – Quality Assurance 测试DBA – Database Administrator ...

  7. 64位WIN7+oracle11g+plsql

    64位WIN7+oracle11g+plsql安装 Posted on 2015-07-28 22:41 算命大师不算卦 阅读(27) 评论(0) 编辑 收藏 上部转自Oracle 11g R2 fo ...

  8. C++ Primer Plus 文章17章 进,输出和文件

    文章17章 进.输出和文件 1.当到达输入句子.他将刷新输出缓冲区满输出电流 2.streambuf分类 它提供了用于各种操作的一个缓冲 ios_base类表示流的一般特征 ios基础的类ios_ba ...

  9. Android使用surface直接显示yuv数据(三)

    在本文中,Java创建UI和关节JNI经营层surface直接显示yuv数据(yv12).发展环境Android 4.4,驰A23平台. package com.example.myyuvviewer ...

  10. C++ Web Programming

    一般的网关接口或者CGI,就是一个标准的集合.它定义信息怎样再问吧server和一般脚本间的交换. CGI的说明书是由NCSA维护,NCSA定义CGI的范畴:一般的网关接口或者CGI是外部网关程序的一 ...