GDI+ 摘要: 保存图像文件

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

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

幸好,有 GetImageDecoders函数作为參照

[cpp] view
plain
copy

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

[cpp] view
plain
copy

  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:

[cpp] view
plain
copy

  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:

[cpp] view
plain
copy

  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

时间: 2024-10-13 07:11:05

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

GDI

GDI是Graphics Device Interface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出. 在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就可以方便的在屏幕.打印机及其它输出设备上输出图形,文本等操作.GDI的出现使程序员无需要关心硬件设备及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方便了开发工作. GDI

Windows GDI绘图基础知识

一.Windows可以画直线.椭圆线(椭圆圆周上的曲线)和贝塞尔曲线.////////////7 个画线函式是:(1)画直线LineTo    BOOL LineTo(HDC hdc,int nXEnd,int nYEnd);结合MoveToEx函数使用BOOL MoveToEx(HDC hdc,int X,int Y,LPPOINT lpPoint);Point记录了旧的坐标点(先前的当前位置).///注意:GetCurrentPositionEx (hdc, &pt) ;获得当前位置. (2

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

void ViewReportDlg::CopyScreenToBitmap() { CDC *cdc = this->GetDC(); HDC wnd = cdc->GetSafeHdc(); //CClientDC dc(this); CRect rect; BOOL showMsgTag; //是否要弹出”图像保存成功对话框" this->GetClientRect(&rect); //获取画布大小 HBITMAP hbitmap = CreateCompatib

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

使用opencv前记得引入库和头文件: #include<opencv2\opencv.hpp> 1.加载图像(cv::imread)(OPENCV 支持 JPG,PNG,TIFF等常见格式图像文件加载) imread函数原型是: CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR ); ------imread加载一副由filename指定的图像文件并返回一个Mat对象 ------第一个

如何在使用Vue的情况下实现Electron打开文件保存对话框?

一.问题场景 最近是在使用Electron+Vue构建一个基于modbus rtu协议的上位机应用,使用ipcMain和ipcRenderer实现点击Vue组件后打开对话框,获取到文件路径并写入数据,完成后通知.但是出现ipcRenderer.on() 调用多次的错误情况.那么,使用Electron+Vue实现文件保存的正确姿势是什么呢? 二.具体实现 在electron的src/main/index.js中定义IPC通道 // 1. 引入对话框与IPC通信模块 const ipc = requ

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

c#图像处理入门 -bitmap类和图像像素值获取方法 一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetPixel方法和SetPixel方法:获取和设置一个图像的指定像素的颜色. 2. PixelFormat属性:返回图像的像素格式. 3. Palette属性:获取和设置图像所使用的颜色调色板. 4. Height Width属性:返回图像的高度和

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

一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetPixel方法和SetPixel方法:获取和设置一个图像的指定像素的颜色. 2. PixelFormat属性:返回图像的像素格式. 3. Palette属性:获取和设置图像所使用的颜色调色板. 4. Height Width属性:返回图像的高度和宽度. 5. LockBits方法和UnlockBits

MFC和ATL共享的新类CImage为图像处理提供了许多相应的处理方法

CImage类 我们知道,Visual C++的CBitmap类和静态图片控件的功能是比较弱的,它只能显示出在资源中的图标.位图.光标以及图元文件的内容,而不像VB中的Image控件可 以显示出绝大多数的外部图像文件(BMP.GIF.JPEG等).因此,想要在对话框或其他窗口中显示外部图像文件则只能借助于第三方提供的控件或代码. 现在,MFC和ATL共享的新类CImage为图像处理提供了许多相应的方法,这使得Visual C++在图像方面的缺憾一去不复返了. CImage类概述 CImage是M

c#图像处理入门

一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetPixel方法和SetPixel方法:获取和设置一个图像的指定像素的颜色. 2. PixelFormat属性:返回图像的像素格式. 3. Palette属性:获取和设置图像所使用的颜色调色板. 4. Height Width属性:返回图像的高度和宽度. 5. LockBits方法和UnlockBits