使用GDI+进行图像处理

有人问我如何对图像进行旋转处理,也就是让用户歪着脖子看图像,用户的脖子拧断了怎么办?反正不会来找我......

其实这个问题的一种解决方法是利用二维(x,y坐标中)矩阵转换实现图像旋转。使用高中时所学的三角知识或者大学中的线性代数知识就可以解决。其原理是已知一个点的坐标,那么这个点的旋转坐标可以通过(x*cos(A) + y*sin(A),- x*sin(A) + y*cos(A))求得,这里A是以弧度为单位的角度(2P弧度=360度)。因此,只要将图像加载到内存中,然后将它选入设备上下文,接着调用GetPixel和SetPixel,象上面所说的那样映射所有的像素,便可以实现图像的旋转效果。对于90、180、-90度的旋转,这是一个不错的方法,因为正弦、余弦的值无外乎+/-1或者0......话还没等我说完,一块砖头就朝我头上飞过来了,啊唷,我当然不会叫你用这种方法做事情啦!有更好的方法呢。下面就是本文的正题:使用GDI+实现图像旋转处理。我想了解GDI+的人不是很多,因为它是Windows中的新东西。要想了解它的细节,请参考MSDN的有关文章。

GDI+是GDI图形库的一个增强版本,C++可以使用这个库。它内建于Windows XP 和Microsoft .NET,而对于Windows 98、Windows NT和Windows 2000,则有一个可重新发布的版本。GDI+是一个C++ API。它用C++类和C++方法。GDI+所包含的内容非常多,远远不止我在此所描述的这些。为了使用GDI+,你必须包含(#include)<gdiplus.h>文件,并将工程链接到gdiplus.lib库,这两个文件包含在最新的Windows SDK中。我对“在MFC程序中显示JPG/GIF图像”一文中的例子代码Myimgapp进行了重写,并改名为Myimgapp2,其代码对CPicture类进行了重大改动,因为原来的CPicture主要针对IPicture进行封装,而这一次主要是封装GDI+。下面是Myimgapp2运行画面,如图一所示。这个程序示范了如何用GDI+来旋转图像。

图一 图像旋转90度

前面说过,原来程序中的那个C++类CPicture是基于IPicture接口的,它处理图像的COM接口。在本文的例子程序Myimgapp2中,我重写了CPicture的代码,使用了GDI+里的图像类(Image)。对所有的细节都进行了封装。新的CPicture类不再使用 IPicture 这个COM接口,而是用Image取而代之,所有其它的类如CPictureView 和 CPictureCtrl都能和从前一样工作。但有两个障碍要解决:第一个是你必须对GDI库进行初始化以及最后的终止释放操作,与其说它是个障碍,还不如说它是GDI+本身的需要,在哪里进行这两个操作呢?最佳的地方莫过于在程序的 InitInstance 和 ExitInstance函数中: //初始化 GDI 
class CMyApp : public CWinApp {
protected:
 GdiplusStartupInput m_gdiplusStartupInput;
 ULONG_PTR m_gdiplusToken;
…….
};
//释放GDI
BOOL CMyApp::InitInstance()
{
 VERIFY(GdiplusStartup(&m_gdiplusToken,
  &m_gdiplusStartupInput, NULL)==Ok);
…….
}
int CMyApp::ExitInstance()
{
 GdiplusShutdown(m_gdiplusToken);
 return CWinApp::ExitInstance();
}
 

 CMyApp::m_gdiplusToken 是一个很神奇的东东,它来自GdiplusStartup 并被传递到GdiplusShutdown。m_gdiplusStartupInput 是一个结构,它包含某些GDI+的启动参数。缺省构造函数建立一个智能的缺省值,它又一次证明了C++比C更好。一旦你启动GDI+,就可以使用它了。原来的CPicture类有一个指向IPicture的指针,而新版的CPicture类有一个指向Image的指针。同样,它也有可重载的Load函数来从不同的地方加载图象。例如,下面便是新版的CPicture如何从某个路径名中加载图像文件。 BOOL CPicture::Load(LPCTSTR pszPathName)
{
 Free();
 USES_CONVERSION;
 m_pImage = Image::FromFile(A2W(pszPathName),
  m_bUseEmbeddedColorManagement);
 return m_pImage->GetLastStatus()==Ok;
}

时间: 2024-09-14 05:13:31

使用GDI+进行图像处理的相关文章

C# (GDI+相关) 图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)

原文:C# (GDI+相关) 图像处理(各种旋转.改变大小.柔化.锐化.雾化.底片.浮雕.黑白.滤镜效果)   C#图像处理   (各种旋转.改变大小.柔化.锐化.雾化.底片.浮雕.黑白.滤镜效果)     一.各种旋转.改变大小   注意:先要添加画图相关的using引用.   //向右旋转图像90°代码如下: private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) {   Graphics

gdi+-C# 图像处理 如何截取一个扇形区域

问题描述 C# 图像处理 如何截取一个扇形区域 我现在需要做一个简单的圆周动画,原理是使用GDI+.现在遇到一个问题,我需要截取圆的一个扇形区域,扇形的角度从0到360可以任意指定.有没有办法实现? 解决方案 就是区域类型,由弧和两条线段构成 http://www.cnblogs.com/lvpengms/p/3566964.html

GDI和GDI+对象的相互转换

当然希望可以使用GDI+来完全代替GDI,再不济也只需要从GDI对象转到GDI+对象.但是就 是有那么些工程,又要新技术新特性.又希望快速开发.又不肯丢弃旧版本的已有的功能. 没办法,只能缝缝补补,咔哐碙啌... 一.CDC到Graphics只要这样: Graphics g(pDC->GetSafeHdc());//只要能构造CDC句柄的MFC对象都可以 //CClientDC.CPaintDC,也都可以 二.CBitmap到Graphics需要创建一个内 存位图设备: CDC MemDC; C

GDI+中常见的几个问题(4)

5.读图是快了,处理怎么还是慢? GDI+的Bitmap类提供了两个罪恶的函数GetPixel, SetPixel,用来获取某个像素点的颜色 值.这个2个函数如果只调用一次两次也就罢了,万一我想把整张图片加红一点,用下面的代 码,我估计你等到黄花菜都凉了,还没有算完呢. 看看下面的代码是怎么写的. 1 FileStream fs = new FileStream(image, FileMode.Open, FileAccess.Read); 2 Image img = Image.FromStr

MFC框架程序中全屏显示特性的实现

在开发图像显示程序以及视频应用程序时,常常需要全屏显示特性,比如ACD See和豪杰解霸等应用都有全屏显示功能.本文将介绍如何在MFC框架程序中实现视图的全屏显示,也就是说将标题.菜单.工具栏.状态栏以及窗口的所有边框全部被隐藏,视图充满整个屏幕.并提供全屏显示与框架窗口之间的快捷切换操作. 大家知道,在MFC框架中并没有提供现成的类或者函数来实现全屏显示特性,至少我到目前为止是没有发现.但是要实现这个特性也并不难.其基本思路是调整主窗口的大小和位置,使视图的显示充满屏幕.它需要以屏幕左上角为原

基于VC.NET的GDI+图像处理

我们知道,在以往的图像处理中,常常要根据不同图像文件的格式及其数据存储结构在不同格式中进行转换.某个图像文件的显示也是依靠对文件数据结构的剖析,然后读取相关图像数据而实现的.现在,GDI+提供了Image和Bitmap类使我们能轻松容易地处理图像. 概述 GDI+支持大多数流行的图像文件格式,如BMP.GIF.JPEG.TIFF和PNG等.下面先来介绍这些图像文件,然后再说明Image和Bitmap类支持的特性. 1.图像文件格式简介 图像文件是描绘一幅图像的计算机磁盘文件,其文件格式不下数十种

【数字图像处理】七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

       本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行讲解,主要通过MFC单文档视图实现显示BMP图像增强处理,包括图像普通平滑.高斯平滑.不同算子的图像锐化知识.希望该篇文章对你有所帮助,尤其是初学者和学习图像处理的学生.        [数字图像处理]一.MFC详解显示BMP格式图片        [数字图像处理]二.MFC单文档分割窗口显示图片        [数字图像处理]三.MFC实现图像灰度.采样和量化功能详解  

运用Visual C#完成基本数字图像处理

visual 一.概述: 本文的实例是一个数字图像处理的应用程序,它完成的功能包括对图像颜色的翻转.对图像进行灰度处理和对图像进行增亮处理.该程序对图像进行处理部分的代码包含在一个专门的Filters类里面,通过调用该类里的静态成员函数,我们就可以实现相应的图像处理功能了.为实现图像处理,我们要对图像进行逐个象素处理.我们知道图像是由一个个的象素点组成的,对一幅图像的每个象素进行了相应的处理,最后整个图像也就处理好了.在这个过程中,我们只需对每个象素点进行相应的处理,在处理过程中却不需要考虑周围

C#数字图像处理的方法

本文主要通过彩色图象灰度化来介绍C#处理数字图像的3种方法,Bitmap类.BitmapData类和 Graphics类是C#处理图像的的3个重要的类. Bitmap只要用于处理由像素数据定义的图像的对象,主要方法和属性如下: GetPixel方法和SetPixel方法,获取和设置一个图像的指定像素的颜色. PixelFormat属性,返回图像的像素格式. Palette属性,获取或折纸图像所使用的颜色调色板. Height属性和Width属性,返回图像的高度和宽度. LockBits方法和Un