使用GDI+的RotateFlip方法 旋转图像并保存图片

使用GDI+旋转图像并保存图片的方法,代码如下:

 1 #pragma once
2 class CGDIImageFile
3 {
4 public:
5 CGDIImageFile(void);
6 ~CGDIImageFile(void);
7
8 String TypeToFormat(TCHAR cType);
9 bool GetImageCLSID(const TCHAR* mformat,CLSID *pClsid);
10
11 void CreateRotateImage(String& sSrcFile, int nArc, String sDesFile = L"");
12 ULONG_PTR gdiplusToken;
13 };

GDIImageFile.h

  1 #include "StdAfx.h"
2 #include "GDIImageFile.h"
3
4 #include <GdiPlus.h>
5 using namespace Gdiplus;
6 #pragma comment(lib,"Gdiplus.lib")
7
8 CGDIImageFile::CGDIImageFile(void)
9 {
10 GdiplusStartupInput gdiplus;
11 GdiplusStartup(&gdiplusToken,&gdiplus,NULL);
12 }
13
14
15 CGDIImageFile::~CGDIImageFile(void)
16 {
17 GdiplusShutdown(gdiplusToken);
18 }
19
20 void CGDIImageFile::CreateRotateImage(String& sSrcFile, int nArc, String sDesFile)
21 {
22 Image *srcImg= new Image(sSrcFile.c_str());
23
24 int nWidth = srcImg->GetWidth();
25 int nHeight = srcImg->GetHeight();
26 //重点在此
27 switch(nArc)
28 {
29 case 90:
30 {
31 srcImg->RotateFlip(Rotate270FlipXY);
32 nWidth = srcImg->GetHeight();
33 nHeight = srcImg->GetWidth();
34 break;
35 }
36 case 180:
37 {
38 srcImg->RotateFlip(RotateNoneFlipX);
39 break;
40 }
41 case 270:
42 {
43 srcImg->RotateFlip(Rotate90FlipXY);
44 nWidth = srcImg->GetHeight();
45 nHeight = srcImg->GetWidth();
46 break;
47 }
48 default:break;
49 }
50
51 Graphics imgGrahpics(srcImg);
52 Bitmap bitmap(nWidth, nHeight, &imgGrahpics);//注意高度和宽度
53 Graphics bmpGraphics(&bitmap);
54 bmpGraphics.DrawImage(srcImg, 0, 0);
55 int nPos = sSrcFile.find(L".");
56 if (nPos == -1)
57 return;
58
59 String encoder;
60 String tmpstr = sSrcFile.substr(nPos + 1,nPos + 2);
61 TCHAR tmpchar = tmpstr[0];
62
63 encoder = TypeToFormat(tmpchar);
64
65 CLSID imgClsid;
66 //GetEncoderClsid()函数是在MSDN中的例子
67 if (!GetImageCLSID(encoder.c_str(),&imgClsid))
68 {
69 return ;
70 }
71 if(sDesFile == L"")
72 sDesFile = sSrcFile + L"_rotate";
73 bitmap.Save(sDesFile.c_str(),&imgClsid,NULL);
74 delete srcImg;
75 }
76
77 bool CGDIImageFile::GetImageCLSID(const TCHAR* mformat,CLSID *pClsid)
78 {
79 UINT num = 0;
80 UINT size = 0;
81
82 ImageCodecInfo *pImageCodecInfo = NULL;
83 GetImageEncodersSize(&num,&size);
84 if (size == 0)
85 {
86 return false;
87 }
88 pImageCodecInfo = new ImageCodecInfo[size];
89 if (pImageCodecInfo == NULL)
90 {
91 return false;
92 }
93
94 GetImageEncoders(num,size,pImageCodecInfo);
95
96 for(UINT i = 0;i < num; i++)
97 {
98 if (wcscmp(pImageCodecInfo[i].MimeType,mformat) == 0)
99 {
100 *pClsid = pImageCodecInfo[i].Clsid;
101 delete[] pImageCodecInfo;
102 return true;
103 }
104 }
105 delete[] pImageCodecInfo;
106 return false;
107 }
108
109 String CGDIImageFile::TypeToFormat(TCHAR cType)
110 {
111 String encoder;
112 switch(cType)
113 {
114 case L‘J‘:
115 case L‘j‘:
116 encoder = L"image/jpeg";
117 break;
118 case L‘B‘:
119 case L‘b‘:
120 encoder = L"image/bmp";
121 break;
122 case L‘G‘:
123 case L‘g‘:
124 encoder = L"image/gif";
125 break;
126 case L‘P‘:
127 case L‘p‘:
128 encoder = L"image/png";
129 break;
130 case L‘T‘:
131 case L‘t‘:
132 encoder = L"image/tiff";
133 break;
134 default:
135 encoder = L"image/jpeg";
136 break;
137 }
138 return encoder;
139 }

GDIImageFile.cpp

使用GDI+的RotateFlip方法 旋转图像并保存图片,布布扣,bubuko.com

时间: 2024-08-04 06:39:11

使用GDI+的RotateFlip方法 旋转图像并保存图片的相关文章

GDI 泄漏检测方法

方法一 1.打开电脑的[任务管理器],选择[进程]页,点击菜单项的[查看]项,选择[选择列]: 2.勾选[GDI对象(J)]即可. 3.此时,用户就可以在进程中看到每个进程对应的GDI对象,每个进程的GDI对象(网页浏览器除外,每打开一个网页GDI对象都会增加)基本上是一定的,如果不断上涨,则说明程序存在GDI泄漏问题. 方法二 使用检测工具GDIndicator,支持win7+xp 1.启动待检测的程序和GDIndicator,启动顺序没有要求,之后F5刷新,就能看到系统中所有进程,和使用的资

C#中的GDI+图形绘制方法

GDI+图形绘制方法 1.首先对于绘制图形,必须的先将命名空间导入:using System.Drawing.Drawing2D; 2.然后在一个事件中写入程序 首先先将Graphics这个对象实例化: 然后就是实例化笔(pen)或者刷子(brush): 对于笔的实例化Pen mypen = new Pen(Color(选择颜色),笔的线条粗度) 刷子的实例化 solidbrush:它的实例化只需要指定color属性值就可以了: hatchbrush:它的实例化需要指定所需要绘制的图形以及颜色:

A generic error occurred in GDI+的解决方案

转自智慧光原文A generic error occurred in GDI+. 解决方法 使用image1.RotateFlip(RotateFlipType.Rotate90FlipNone)方法时候,出现错误: An unhandled exception of type 'System.Runtime.InteropServices.ExternalException' occurred in System.Drawing.dll Additional information: A ge

GDI+画图技术

private void button1_Click(object sender, EventArgs e) { //this代表当前窗体,在当前窗体上创建Graphics //第一步:创建GDI对象 Graphics g = this.CreateGraphics(); //创建一个画笔 Pen p=new Pen (Color.Red,2); //确定两个点 Point p1 = new Point(20, 20); Point p2 = new Point(30, 40); //调用GDI

如何学习新的框架(保存图片到相册)

一.点击查看大图 1.点击图片或按钮(点击查看大图按钮),modal出来一个控制器,显示大图片 2.怎么处理能让点击图片就能查看大图? 两种方法:1.给图片添加点按手势 2.给图片所在的view上添加 - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 2.1 添加点按手势 优点:适用于任何场景下,不受限制 缺点:代码量大 2.2 给图片所在view添加touchesEnded:方法 优点:能快

GDI基础知识

GDI即图形设备接口,在windows中负责图形输出.它位于应用程序和不同硬件设备之间,这种结构让程序员从直接处理不同硬件工作中解放出来.GDI处理了硬件间的差异,并且通过将应用程序与不同输出设备特性相隔离,使windows应用程序能够毫无障碍在windows支持的任何图形设备上运行. CDC类: SDK全局函数实现:HDC hdc = ::GetDC(m_hWnd); ..... ::ReleaseDC(m_hWnd,hdc); CDC类实现:CDC* pDC = GetDC(); ... R

在VC中显示和处理图片的方法

落鹤生 发布于 2011-10-21 09:12 点击:344次  来自:blog.csdn.net/mengaim_cn 几种用GDI画图的方法介绍. TAG: GDI   法1:这个方法其实用的是一本经典vc图像处理的书上的有关读取位图的函数库, 当没有这个函数库时,就没有太多的实用价值.这种方法直接用的是读取和显示bmp图片的函数库首先要得到要显示区域的位置:  CWnd* pWnd=GetDlgItem(IDC_BMP);  RECT rect;  pWnd->GetClientRect

怎么将图片保存在手机照片瀑布流主目录下 -----ios

UIImageWriteToSavedPhotosAlbum(self.imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); 这个方法可以将保存图片保存在瀑布流主目录下 这个方法检验有没有保存成功 - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)

iOS UIPickerController 调用相机,选择图片上传,带预览功能

在.h中加入delegate @interface ViewController : UIViewController<UIActionSheetDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate> //实现按钮事件 -(IBAction)chooseImage:(id)sender { UIActionSheet *sheet; <p> // 判断是否支持相机 </p> if(