深入GDI图像显示

合集下载

gdi+原理

gdi+原理

GDI (Graphics Device Interface) 是一种图形设备接口,它提供了一组函数和数据结构,用于在计算机屏幕上绘制图形和文本。

GDI 的工作原理可以简单概括如下:
1. 设备无关性:GDI 提供了一套抽象的图形操作接口,使得应用程序不需要关心底层硬件的差异。

它可以在不同类型的图形设备(如显示器、打印机)上执行相同的绘图操作。

2. 句柄管理:GDI 使用句柄来标识各种图形对象,例如窗口、画刷、字体等。

应用程序通过创建和使用这些句柄来操作图形对象。

GDI 负责管理这些句柄,包括分配、释放和查询对象。

3. 绘图操作:GDI 提供了一系列函数,用于在设备上进行绘图操作。

这些函数包括绘制线条、填充区域、绘制文本等。

应用程序可以根据需要调用这些函数来实现所需的图形效果。

4. 坐标系统:GDI 使用一个坐标系统来确定图形和文本的位置。

通常,坐标原点位于设备的左上角,水平向右为正,垂直向下为正。

应用程序可以使用坐标系统来定位和变换图形对象。

5. 双缓冲技术:为了避免绘图时的闪烁和不流畅现象,GDI 使用双缓冲技术。

在内存中创建一个临时的图像缓冲区,所有的绘图操作先在缓冲区中进行,然后再将整个缓冲区一次性地绘制到屏幕上,从而实现平滑的图形显示。

总之,GDI 是一个用于绘制图形和文本的图形设备接口,它提供了设备无关性、句柄管理、绘图操作、坐标系统和双缓冲等特性,使得应用程序可以方便地操作图形对象并实现所需的图形效果。

1。

windows gdi指标

windows gdi指标

GDI(图形设备接口)是Windows操作系统中的一个重要组件,用于在屏幕上绘制文本和图形。

以下是GDI的一些重要指标:
1. 颜色深度:表示图形中可以显示的颜色数量。

例如,24位颜色深度可以显示1600万种颜色。

2. 分辨率:表示屏幕上的像素密度,通常以每英寸点数(DPI)表示。

高分辨率可以提供更清晰的图像和文本。

3. 字体支持:GDI支持多种字体,包括TrueType和PostScript字体。

字体的大小和样式决定了文本的外观和可读性。

4. 图形绘制:GDI提供了多种绘制图形的函数,如线条、圆、多边形、曲线等。

这些函数可以用于创建各种形状和效果。

5. 图像处理:GDI支持对图像进行各种处理,如缩放、旋转、裁剪、颜色转换等。

这些功能可以帮助用户对图像进行编辑和美化。

6. 性能:GDI的性能取决于多个因素,如硬件性能、系统资源占用等。

在某些情况下,使用GDI可能会影响应用程序的运行速度和响应时间。

7. 兼容性:由于GDI是Windows操作系统的一部分,因此它与Windows操作系统和其他应用程序的兼容性较好。

总之,GDI是Windows操作系统中非常重要的组件之一,它提供了多种功能和指标,可以帮助用户创建高质量的图形和文本。

使用GDI在窗口上画出一个图片

使用GDI在窗口上画出一个图片
dc = getdc(窗口句柄)
memhdc = createcompitabledc(dc)
selectobject(memhdc,图片句柄)
BitBlt(hDc,0,0,100,24,memdc,0,0,SRCCOPY)
===============================
Dim img As Long, img_W As Long, img_H As Long
GdipLoadImageFromFile StrPtr("C:\TestImage.png"), img
GdipGetImageWidth img, img_W
GdipGetImageHeight img, img_H
注意咯 第三~第六个参数是原来图片中要截取的部分;第七~第十呢则是画到哪里以及画出来多大的设置。
(4)贴图刷
贴图刷子 跟其它刷子一样 我们需要创建刷子 另外我们需要先初始化图片:)
来看代码:
Dim img As Long, textureBrush As Long
GdipLoadImageFromFile StrPtr("C:\TestImage.png"), img
'GdipDisposeImage img
当然 这里面载入长宽是可选的。
最后呢 别忘记释放Image,否则内存突然没了可不要找我~
(2)来自资源文件:GdipLoadImageFromStream
这个函数主要是用来从资源文件(RES)载入图像的,怎么载入呢?我们来看函数,函数是从Stream载入,但是我们VB6没有集成Stream对象,从RES读取出来(LoadResData)也只是返回Byte()。不过很好,OLE提供了一个函数能够将Byte()变为一个IStream对象——我们需要这个API

GDI原理

GDI原理

GDI原理GDI,全称为图形设备接口(Graphics Device Interface),是一种用于在Windows操作系统中绘制图形的技术。

它提供了一种将图形显示在屏幕上的标准方法,同时也是Windows应用程序与显示设备之间通信的桥梁。

在本文中,我们将深入探讨GDI的原理及其工作方式。

首先,GDI通过使用设备无关的图形对象(如画笔、画刷、字体等)来描述图形。

这些图形对象可以在不同的输出设备上进行绘制,而无需对应用程序进行修改。

这种设备无关性使得GDI成为了一种非常灵活的图形绘制技术。

其次,GDI通过使用设备上下文(Device Context,简称DC)来实现图形的绘制。

设备上下文是一个与设备相关的数据结构,它包含了绘制图形所需的各种参数和信息。

应用程序可以通过GDI函数来获取设备上下文,并在其上进行图形的绘制操作。

另外,GDI还提供了一系列的绘图函数,用于在设备上下文中进行各种图形的绘制操作。

这些函数包括了直线绘制、矩形绘制、圆形绘制、文本输出等功能。

通过调用这些函数,应用程序可以实现各种复杂的图形绘制效果。

除此之外,GDI还支持图形的变换和组合操作。

应用程序可以通过GDI函数来对图形进行平移、旋转、缩放等变换操作,也可以将多个图形进行组合,实现复杂的图形效果。

最后,GDI通过使用裁剪区域来限制图形的绘制范围。

裁剪区域是一个与设备相关的区域,它可以用来限制图形的绘制范围,从而实现局部图形的显示和隐藏。

总的来说,GDI是一种强大而灵活的图形绘制技术,它为应用程序提供了丰富的图形绘制功能,并且具有良好的设备无关性。

通过使用GDI,应用程序可以实现各种复杂的图形效果,从而提升用户界面的质量和用户体验。

在本文中,我们对GDI的原理及其工作方式进行了深入的探讨,希望能够帮助读者更好地理解和应用GDI技术。

通过对GDI的学习和掌握,我们可以更加轻松地实现各种复杂的图形效果,从而为用户提供更加丰富和优秀的应用程序。

GDI

GDI
设备描述表句柄一旦获得,那么系统将使用默认的属性值填充设备描述表结构。
如果有必要,我们可以使用一些GDI函数获取和改变设备描述表中的属性值。
感谢观看
GDI+在区域(regions)方面对GDI进行了改进,在GDI中,Regions存储在设备坐标中,对Regions唯一可进 行图形变换的操作就是对区域进行平移。而GDI+用世界坐标存储区域(Regions),允许对区域进行任何图形变换 (譬如如图所示的缩放),图形变换以变换矩阵存储,下面例子是一个区域变换前后的例子(缩放、旋转、平移)
在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就 可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。GDI的出现使程序员无需要关心硬件设备 及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方 便了开发工作。
你可能会注意到上面显示的图形,红色未平移区域与变换后区域有一部分交叉区域,这一部分形成的梦幻效 果就是由GDI+支持的Alpha Blending(混合)实现的,利用alpha融合,你可以指定填充颜色的透明度,透明颜 色与背景色相互融合,填充色越透明,背景色显示越清晰,四个椭圆被填充了同样的颜色,但由于拥有不同的透 明度而呈现不同的显示效果。
GDI+提供了矩阵对象,一个非常强大的工具,使得编写图形的旋转、平移、缩放代码变得非常容易。一个矩 阵对象总是和一个图形变换对相起来,比方说,路径对象(PATH)有一个Transform方法,它的一个参数能够接 受矩阵对象的,每次路径绘制时,它能够根据变换矩阵绘制。下面的图形是一个图形变换前后的例子,变换按照 先缩放后旋转完成。

gdi+ 原理

gdi+ 原理

gdi+ 原理GDI(Graphics Device Interface)是Windows操作系统中用于图形输出的接口。

它是Microsoft公司开发的一种图形处理标准,用于在Windows操作系统中实现各种图形设备和应用程序的图形输出。

在计算机科学中,GDI是一种非常常见的图形编程接口,它提供了一种方便的方式来访问各种图形设备和应用程序中的图形数据。

一、GDI的组成GDI主要由以下几个部分组成:1. 设备上下文(DC):设备上下文是GDI中的一个重要概念,它代表了一个特定的输出设备,如屏幕、打印机等。

在GDI中,设备上下文包含了与输出设备相关的各种信息,如分辨率、颜色格式等。

2. 画笔(Pen):画笔是GDI中的一个工具,它允许开发者在设备上下文中绘制各种形状和线条。

画笔包含了颜色、宽度、样式等属性。

3. 刷子(Brush):刷子是GDI中的另一个工具,它允许开发者在设备上下文中绘制填充。

刷子包含了颜色、粗细等属性,以及一个位图来表示实际的填充图案。

4. 字体(Font):字体是GDI中用于文本输出的一个重要概念。

开发者可以通过指定字体、大小、样式等属性来输出文本。

5. 区域(Region):区域是GDI中的一个概念,它允许开发者对设备上下文中的某个区域进行操作,如绘制、剪裁等。

区域由一组路径和形状组成,可以通过GDI的API进行操作。

二、GDI的工作原理GDI通过调用各种绘图函数来操作设备上下文,从而实现图形的输出。

这些绘图函数包括画线、填充、文本输出等。

开发者可以通过GDI提供的API来创建、使用和管理这些绘图函数。

GDI的工作原理可以分为以下几个步骤:1. 创建设备上下文:开发者首先需要创建一个设备上下文对象,指定输出设备的属性,如分辨率、颜色格式等。

2. 创建画笔和刷子对象:根据需要,开发者可以创建画笔和刷子对象,并设置它们的属性。

3. 调用绘图函数:开发者通过调用GDI提供的绘图函数,将画笔和刷子应用到设备上下文中,从而实现图形的输出。

06图形设备接口GDI基本概念

06图形设备接口GDI基本概念

设备坐标系分为屏幕坐标系、窗口坐标系和客户区坐标系三种相互独立的坐标系。屏幕坐标系以屏幕左上角为原点,一些与整个屏幕有关的函数均采用屏幕坐标,如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。弹出式菜单使用的也是屏幕坐标。窗口坐标系以窗口左上角为坐标原点,它包括窗口标题栏、菜单栏和工具栏等范围。客户区坐标系以窗口客户区左上角为原点,主要用于客户区的绘图输出和窗口消息的处理。鼠标消息的坐标参数使用客户区坐标,CDC类绘图成员函数使用与客户区坐标对应的逻辑坐标。
1. GDI的一些基本概念
Windows绘图过程和设备无关性的实现:
GDI处于设备驱动程序的上一层,当程序调用绘图函数时,GDI将绘图命令传送给当前设备的驱动程序,以调用驱动程序提供的接口函数。驱动程序的接口函数将Windows绘图命令转化为设备能够执行的输出命令,实现图形的绘制。不同设备具有不同的驱动程序,设备驱动程序是设备相关的。
如果采用MFC方法编程,MFC提供了不同类型的DC类,每一个类都封装了DC句柄,并且它们的构造函数自动调用获取DC的API函数,析构函数自动调用释放DC的API函数。因此,在程序中通过声明一个MFC设备环境类的对象就自动获取了一个DC,而当该对象被销毁时就自动释放了获取的DC。MFC AppWizard应用程序向导创建的OnDraw()函数自动支持所获取的DC。MFC的DC类包括CDC、CPaintDC、CClientDC、CWindowDC和CMetaFileDC等,其中CDC类是MFC设备环境类的基类,其它的MFC设备环境类都是CDC的派生类。
获取设备环境DC的方法:
在程序中不能直接存取DC数据结构,只能通过系统提供的一系列函数或使用设备环境的句柄HDC来间接地获取或设置设备环境结构中的各项属性,如显示器高度和宽度、支持的颜色数及分辨率等。如果采用SDK方法编程,获取DC的方法有两种:在WM_PAINT消息处理函数中通过调用API函数BeginPaint()获取设备环境,在消息处理函数返回前调用API函数EndPaint()释放设备环境。在其他函数中通过调用API函数GetDC()获取设备环境,调用API函数ReleaseDC()释放设备环境。

17_使用GDI+处理数字图像

17_使用GDI+处理数字图像

编写BMP图片显示函数 编写BMP图片显示函数
void CShowBitmapView::ShowBitmap(CDC* pDC,CString strPicPath) { HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,strPicPath,IMAGE_BITMAP,0,0,LR_CREATE DIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE); m_bitmap.Detach(); m_bitmap.Attach(hBitmap); CRect rect; GetClientRect(&rect); CDC dcImage; if (!dcImage.CreateCompatibleDC(pDC)) { return; } BITMAP bm; m_bitmap.GetBitmap(&bm); dcImage.SelectObject(&m_bitmap); //pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcImage,0,0,SRCCOPY); //图片保留 原始大小 pDC>StretchBlt(0,0,rect.right,rect.bottom,&dcImage,0,0,bm.bmWidth,bm.bmHeight,SRCC OPY); //图片拉伸显示,填满整个客户区 }
例题1 例题1 ShowImage
1、新建一个单文档的应用程序,项目名称为 ShowBitmap 2、为CShowBitmapView类添加下述成员变量和 成员函数:其中 CImage m_MyImage 需要头文件"atlimage.h"的支持,或者你可以用向 导来加这个变量,那么头文件会自动添加的,我 们这里手动在CShowBitmapView.h中加入 #include "atlimage.h",一定要记得加

在C#中用GDI+实现图形动态显示

在C#中用GDI+实现图形动态显示

0 引 言
G I G ahcD v eIt f e 作为公共语言运 D +( r i ei e a +) p s c n rc 行库 , Wi o s 是 n w 图形设计界面( D ) d G I的高级实现 , 它已 完全替代 G I拥有较好的性能和易于使用的特点。利用 D, 它可以创建 图形、 制文本 以及将 图形图像作 为对象操 绘 作。 并且可在 Wi w 窗体和控件上呈现图形图像。虽 n s o d 然针对 We 窗体无法直接使用 , b 但可以通过 We 服务器 b “ 图像” I e 控件最示 图形 图像。 目前 , D +是在 (  ̄g ) r G I Wi w 窗体应用程序中以编程方式呈现图形 的惟一方 n s o d
Abta tGD + i ga hc e i tr c +.I i a l s irr s t r n fr aat r whc o a i ewi rp i e src : I s r p i d vc i e ae s en f t s a ba i .I t soms t af m i i cmp t l t ga hc d c sl e a d o o hs b h s

或文件等图形设备进行交互的 Wi w 和 we 图形应用 n s o d b 程序 , 井显示在屏幕或 由打印机输出。其实现途经是通过
总的来讲实现本例的思想是创ቤተ መጻሕፍቲ ባይዱ两个绘图面在一个绘图面上绘制轨迹后再贴在另一个绘图面上并在露上绘制图标当进入下一个循环时新的轨迹图又再次贴在上然后再在配绘制图标这样虽然每一个循环都是先画轨迹再画图标但是显示在窗体上始终只有运动的轨迹和随轨迹运动的图标
维普资讯
第 66 第 2 t B 0 0 1 2期 2
t x lip o rm h t u t n o doh r a . e fr , t eu e f I 。 l ahe et ea en t n c n e i t d o e p t rg a t a r na d ws n te tThr o e wi t s o Wi a l f e hh o GD + i wi c i h l r ai o v ne l a t l v t o ny n q i l b t e na pi t na dga h s e i uc y ew e p l a i rp i v c i C#.T i p p r l it d c p ra h st l n t i f y  ̄ i g a hcl nC k c o n c d en hs e ln r u a p o c e i e a wi o e o mp me a o o na c rp i tn d n ai

GDI+专题----C# 制作以动画的方式显示图像

GDI+专题----C# 制作以动画的方式显示图像

GDI+专题----C# 制作以动画的方式显示图像(一)十一将至,放假前将GDI+最后一部分今天终于完成:以动画的方式显示图像。

希望对 GDI+编程的园友有所帮助。

PPT 以动画方式显示幻灯片是其一个很重要的特点,相信里边一定有您喜欢的动画方式,今天我就带大家认识几款以动画方式显示幻灯片的制作方法,由于是GDI+编程,这里以图像代替幻灯片(其实原理是相通的)来演示如何制作以动画方式显示图像。

说明:由于是以动画方式显示图像,这里没办法直接贴静态截图,因此决定给园友开源,将所有的可运行代码附在案例后面,由于所有的动画处理图像的对象放在都pictureBox控件中,同时定义的类都大同小异,因此这里先把下面案例中要用到的所有类及装载图像的代码给大家,运行时用这里的代码加下面任意一个实例的代码即可运行程序!同时楼主保证每个案例代码都编译通过,绝不忽悠!private Bitmap SourceBitmap;private Bitmap MyBitmap;private void button2_Click(object sender, EventArgs e){//打开图像文件OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Filter = "图像文件(JPeg, Gif, Bmp, etc.)|*.jpg;*.jpeg;*.gif;*.bmp;*.tif; *.tiff; *.png| JPeg 图像文件(*.jpg;*.jpeg)|*.jpg;*.jpeg |GIF 图像文件(*.gif)|*.gif |BMP图像文件(*.bmp)|*.bmp|Tiff图像文件(*.tif;*.tiff)|*.tif;*.tiff|Png图像文件(*.png)| *.png |所有文件(*.*)|*.*"; if (openFileDialog.ShowDialog() == DialogResult.OK){//得到原始大小的图像SourceBitmap = new Bitmap(openFileDialog.FileName);//得到缩放后的图像MyBitmap = new Bitmap(SourceBitmap, this.pictureBox1.Width, this.pictureBox1.Height); this.pictureBox1.Image = MyBitmap;}}一. 以上下反转的方式显示图像.原理: 计算图像位置和高度后以高度的一半为轴进行对换上下半边的图像.代码:private void button1_Click(object sender, EventArgs e){try{int width = this.MyBitmap.Width; //图像宽度int height = this.MyBitmap.Height; //图像高度Graphics g = this.panel1.CreateGraphics();g.Clear(Color.Gray);for (int i = -width / 2; i <= width / 2; i++){g.Clear(Color.Gray);int j = Convert.ToInt32(i * (Convert.ToSingle(height) / Convert.ToSingle(width))); Rectangle DestRect = new Rectangle(0, height / 2 -j, width, 2 * j);Rectangle SrcRect = new Rectangle(0, 0, MyBitmap.Width, MyBitmap.Height);g.DrawImage(MyBitmap, DestRect, SrcRect, GraphicsUnit.Pixel);System.Threading.Thread.Sleep(10);}}catch (Exception ex){MessageBox.Show(ex.Message, "信息提示");}}二. 以上下对接的方式显示图像原理: 首先将图像分为上下两部分, 然后分别显示.代码:private void button1_Click(object sender, EventArgs e){try{int width = this.pictureBox1.Width; //图像宽度int height = this.pictureBox1.Height; //图像高度Graphics g = this.panel1.CreateGraphics();g.Clear(Color.Gray);Bitmap bitmap = new Bitmap(width, height);int x = 0;while (x <= height / 2){for (int i = 0; i <= width - 1; i++){bitmap.SetPixel(i, x, MyBitmap.GetPixel(i, x));}for (int i = 0; i <= width - 1; i++){bitmap.SetPixel(i, height - x - 1, MyBitmap.GetPixel(i, height - x - 1)); }x++;this.panel1.Refresh();g.DrawImage (bitmap,0,0);System.Threading.Thread.Sleep(10);}}catch (Exception ex){MessageBox.Show(ex.Message, "信息提示");}}三. 以四周扩散的方式显示图像原理: 首先设置图像显示的位置, 然后按高度和宽度的比例循环输出, 直到高度和宽度为原始大小.代码:private void button1_Click(object sender, EventArgs e){try{int width = this.MyBitmap.Width; //图像宽度int height = this.MyBitmap.Height; //图像高度//取得Graphics对象Graphics g = this.panel1.CreateGraphics();g.Clear(Color.Gray); //初始为全灰色for (int i = 0; i <= width / 2; i++){int j = Convert.ToInt32 (i*(Convert.ToSingle(height) / Convert.ToSingle(width)));Rectangle DestRect = new Rectangle(width / 2 - i, height/2-j, 2 * i, 2*j);Rectangle SrcRect = new Rectangle(0, 0, MyBitmap.Width, MyBitmap.Height);g.DrawImage(MyBitmap, DestRect, SrcRect, GraphicsUnit.Pixel);System.Threading.Thread.Sleep(10);}}catch (Exception ex){MessageBox.Show(ex.Message, "信息提示");}}四. 以分块效果显示图像原理: 首先将图分为几块, 再使用 Bitmap 类的 Clone方法从原图指定的块中复制图像, 最后将这些块依次显示出来便可代码:private void button1_Click(object sender, EventArgs e){Graphics g = this.panel1.CreateGraphics();g.Clear(Color.White);int width = MyBitmap.Width;int height = MyBitmap.Height;//定义将图片切分成四个部分的区域RectangleF[] block ={new RectangleF(0,0,width/2,height/2),new RectangleF(width/2,0,width/2,height/2),new RectangleF(0,height/2,width/2,height/2),new RectangleF(width/2,height/2,width/2,height/2)};//分别克隆图片的四个部分Bitmap[] MyBitmapBlack ={MyBitmap.Clone(block[0],System.Drawing.Imaging.PixelFormat.DontCare),MyBitmap.Clone(block[1],System.Drawing.Imaging.PixelFormat.DontCare),MyBitmap.Clone(block[2],System.Drawing.Imaging.PixelFormat.DontCare),MyBitmap.Clone(block[3],System.Drawing.Imaging.PixelFormat.DontCare)};//绘制图片的四个部分,各部分绘制时间间隔为0.5秒g.DrawImage(MyBitmapBlack[0], 0, 0);System.Threading.Thread.Sleep(1000);g.DrawImage(MyBitmapBlack[1], width / 2, 0);System.Threading.Thread.Sleep(1000);g.DrawImage(MyBitmapBlack[3], width / 2, height / 2);System.Threading.Thread.Sleep(1000);g.DrawImage(MyBitmapBlack[2], 0, height / 2);}五. 以淡入淡出效果显示图像原理: 使用 ImageAttrributes 类的 SetColorMatrix() 方法设置颜色, 调整矩阵实现淡出的效果. 此类还可以对颜色进行校正, 调暗, 调亮和移除等.代码:private void button1_Click(object sender, EventArgs e) {try{Graphics g = this.panel1.CreateGraphics();g.Clear(Color.Gray);int width = MyBitmap.Width;int height = MyBitmap.Height;ImageAttributes attributes = new ImageAttributes();ColorMatrix matrix = new ColorMatrix();//创建淡入颜色矩阵matrix.Matrix00 = (float)0.0;matrix.Matrix01 = (float)0.0;matrix.Matrix02 = (float)0.0;matrix.Matrix03 = (float)0.0;matrix.Matrix04 = (float)0.0;matrix.Matrix10 = (float)0.0;matrix.Matrix11 = (float)0.0;matrix.Matrix12 = (float)0.0;matrix.Matrix13 = (float)0.0;matrix.Matrix14 = (float)0.0;matrix.Matrix20 = (float)0.0;matrix.Matrix21 = (float)0.0;matrix.Matrix22 = (float)0.0;matrix.Matrix23 = (float)0.0;matrix.Matrix24 = (float)0.0;matrix.Matrix30 = (float)0.0;matrix.Matrix31 = (float)0.0;matrix.Matrix32 = (float)0.0;matrix.Matrix33 = (float)0.0;matrix.Matrix34 = (float)0.0;matrix.Matrix40 = (float)0.0;matrix.Matrix41 = (float)0.0;matrix.Matrix42 = (float)0.0;matrix.Matrix43 = (float)0.0;matrix.Matrix44 = (float)0.0;matrix.Matrix33 = (float)1.0;matrix.Matrix44 = (float)1.0;//从0到1进行修改色彩变换矩阵主对角线上的数值//使三种基准色的饱和度渐增Single count = (float)0.0;while (count < 1.0){matrix.Matrix00 = count;matrix.Matrix11 = count;matrix.Matrix22 = count;matrix.Matrix33 = count;attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);g.DrawImage(MyBitmap, new Rectangle(0, 0, width, height),0, 0, width, height, GraphicsUnit.Pixel, attributes);分页标题System.Threading.Thread.Sleep(200);count = (float)(count + 0.02);}}catch (Exception ex){MessageBox.Show(ex.Message, "信息提示");}}private void button3_Click(object sender, EventArgs e) {try{Graphics g = this.panel1.CreateGraphics();g.Clear(Color.Gray);int width = MyBitmap.Width;int height = MyBitmap.Height;ImageAttributes attributes = new ImageAttributes();ColorMatrix matrix = new ColorMatrix();//创建淡出颜色矩阵matrix.Matrix00 = (float)0.0;matrix.Matrix01 = (float)0.0;matrix.Matrix02 = (float)0.0;matrix.Matrix03 = (float)0.0;matrix.Matrix04 = (float)0.0;matrix.Matrix10 = (float)0.0;matrix.Matrix11 = (float)0.0;matrix.Matrix12 = (float)0.0;matrix.Matrix13 = (float)0.0;matrix.Matrix14 = (float)0.0;matrix.Matrix20 = (float)0.0;matrix.Matrix21 = (float)0.0;matrix.Matrix22 = (float)0.0;matrix.Matrix23 = (float)0.0;matrix.Matrix24 = (float)0.0;matrix.Matrix30 = (float)0.0;matrix.Matrix31 = (float)0.0;matrix.Matrix32 = (float)0.0;matrix.Matrix33 = (float)0.0;matrix.Matrix34 = (float)0.0;matrix.Matrix40 = (float)0.0;matrix.Matrix41 = (float)0.0;matrix.Matrix42 = (float)0.0;matrix.Matrix43 = (float)0.0;matrix.Matrix44 = (float)0.0;matrix.Matrix33 = (float)1.0;matrix.Matrix44 = (float)1.0;//从1到0进行修改色彩变换矩阵主对角线上的数值//依次减少每种色彩分量Single count = (float)1.0;while (count > 0.0){matrix.Matrix00 = (float)count;matrix.Matrix11 = (float)count;matrix.Matrix22 = (float)count;matrix.Matrix33 = (float)count;attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);g.DrawImage(MyBitmap, new Rectangle(0, 0, width, height),0, 0, width, height, GraphicsUnit.Pixel, attributes); System.Threading.Thread.Sleep(20);count = (float)(count - 0.01);}}catch (Exception ex){MessageBox.Show(ex.Message, "信息提示");}}六. 以左右对接的方式显示图像原理: 首先将图像分为左右两部分, 然后分别显示.代码:private void button1_Click(object sender, EventArgs e) {//以左右对接方式显示图像try{int width = this.MyBitmap.Width; //图像宽度Graphics g = this.panel1.CreateGraphics();g.Clear(Color.Gray); //初始为全灰色Bitmap bitmap = new Bitmap(width, height);int x = 0;while (x <= width / 2){for (int i = 0; i <= height - 1; i++){bitmap.SetPixel(x, i, MyBitmap.GetPixel(x, i)); }for (int i = 0; i <= height - 1; i++){bitmap.SetPixel(width - x - 1, i,MyBitmap.GetPixel(width - x - 1, i));}x++;this.panel1.Refresh();g.DrawImage (bitmap,0,0);System.Threading.Thread.Sleep(10);}}catch (Exception ex){MessageBox.Show(ex.Message, "信息提示");}}七. 以左右反转的方式显示图像原理: 计算图像位置和高度后以宽度的一半为轴进行对换左右半边的图像.代码:private void button1_Click(object sender, EventArgs e){//以左右反转方式显示图像try{int width = this.MyBitmap.Width; //图像宽度int height = this.MyBitmap.Height; //图像高度Graphics g = this.panel1.CreateGraphics();g.Clear(Color.Gray); //初始为全灰色for (int j = -height / 2; j <= height / 2; j++){g.Clear(Color.Gray); //初始为全灰色int i = Convert.ToInt32(j * (Convert.ToSingle(width) / Convert.ToSingle(height))); Rectangle DestRect = new Rectangle(width / 2 - i, 0, 2 * i, height);Rectangle SrcRect = new Rectangle(0, 0, MyBitmap.Width, MyBitmap.Height);g.DrawImage(MyBitmap, DestRect, SrcRect, GraphicsUnit.Pixel);System.Threading.Thread.Sleep(10);分页标题}}catch (Exception ex){MessageBox.Show(ex.Message, "信息提示");八. 以从上向下拉伸的方式显示图像原理: 将图像的宽度不变每次显示图像的一部分, 直到将图片完全显示. 代码:private void button1_Click(object sender, EventArgs e){//以从上向下拉伸方式显示图像try{int width = this.MyBitmap.Width; //图像宽度int height = this.MyBitmap.Height; //图像高度Graphics g = this.panel1.CreateGraphics();g.Clear(Color.Gray); //初始为全灰色for (int y = 1; y <= height; y++){Bitmap bitmap=MyBitmap.Clone (new Rectangle(0,0,width ,y),System.Drawing .Imaging.PixelFormat .Format24bppRgb );g.DrawImage (bitmap,0,0);System.Threading.Thread.Sleep(10);catch (Exception ex){MessageBox.Show(ex.Message, "信息提示");}}九. 以从左向右拉伸的方式显示图像原理: 将图像的高度不变每次显示图像的一部分, 直到将图片完全显示代码:private void button1_Click(object sender, EventArgs e){//以从左向右拉伸方式显示图像try{int width = this.MyBitmap.Width; //图像宽度int height = this.MyBitmap.Height; //图像高度Graphics g = this.panel1.CreateGraphics();g.Clear(Color.Gray); //初始为全灰色 for (int x = 1; x <= width; x++){Bitmap bitmap=MyBitmap.Clone (new Rectangle(0,0,x ,height),System.Drawing .Imaging.PixelFormat .Format24bppRgb );g.DrawImage (bitmap,0,0);System.Threading.Thread.Sleep(10);}catch (Exception ex){MessageBox.Show(ex.Message, "信息提示");}}十. 以任意角度旋转图像原理: 主要使用了 Graphics 类提供的 RotateTransform() 方法对图像进行旋转.代码:private void button1_Click(object sender, EventArgs e){//以任意角度旋转显示图像Graphics g = this.panel1.CreateGraphics();float MyAngle = 0;//旋转的角度while (MyAngle < 360){TextureBrush MyBrush = new TextureBrush(MyBitmap);this.panel1.Refresh();MyBrush.RotateTransform(MyAngle);g.FillRectangle(MyBrush, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height); MyAngle += 0.5f;System.Threading.Thread.Sleep(50);}}十一. 以椭圆的方式显示图像原理: 主要使用了 Graphics 类提供的 FillEllipse() 方法和 TextureBrush() 方法.代码:private void button1_Click(object sender, EventArgs e){//椭圆显示图像Graphics g = this.panel1.CreateGraphics();TextureBrush MyBrush = new TextureBrush(MyBitmap);g.FillEllipse(MyBrush, this.panel1.ClientRectangle);}十二. 以不同的透明度显示图像.原理: Graphics 类的 FromArgb() 方法代码:private void button1_Click(object sender, EventArgs e){//以不同的透明度显示图像Graphics g = this.panel1.CreateGraphics();g.SmoothingMode = SmoothingMode.AntiAlias;TextureBrush MyBrush = new TextureBrush(MyBitmap);g.FillRectangle(MyBrush, this.panel1.ClientRectangle);for (int i = 0; i < 255; i++){//由透明变为不透明g.FillRectangle(new SolidBrush(Color.FromArgb(i,Color.DarkSlateGray)), this.panel1.ClientRectangle);System.Threading.Thread.Sleep(100);}}十三. 以不同分辨率显示图像原理: Bitmap 类的 SetResolution 方法代码:private void button1_Click(object sender, EventArgs e){//以不同的分辨率显示图像for (int i = 10; i < this.panel1.Height; i += 2){g.Clear(Color.Gray);MyBitmap.SetResolution(i, i);g.DrawImage(MyBitmap, 0, 0);System.Threading.Thread.Sleep(100);}}十四. 以不同翻转方式显示图像.原理: Bitmap 类的 RotateFip()方法代码:private void button1_Click(object sender, EventArgs e) {//以不同翻转方式显示图像Graphics g = this.panel1.CreateGraphics();for (int i = 0; i < 17; i++){switch (i){case 0:MyBitmap.RotateFlip(RotateFlipType.RotateNoneFlipX); break;case 1:MyBitmap.RotateFlip(RotateFlipType.Rotate180FlipNone); break;case 2:MyBitmap.RotateFlip(RotateFlipType.Rotate180FlipX);case 3:MyBitmap.RotateFlip(RotateFlipType.Rotate180FlipXY); break;case 4:MyBitmap.RotateFlip(RotateFlipType.Rotate180FlipY);break;case 5:MyBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); break;case 6:MyBitmap.RotateFlip(RotateFlipType.Rotate270FlipX);break;case 7:MyBitmap.RotateFlip(RotateFlipType.Rotate270FlipXY); break;case 8:MyBitmap.RotateFlip(RotateFlipType.Rotate270FlipY);break;case 9:MyBitmap.RotateFlip(RotateFlipType.Rotate90FlipNone); break;case 10:MyBitmap.RotateFlip(RotateFlipType.Rotate90FlipX);break;case 11:MyBitmap.RotateFlip(RotateFlipType.Rotate90FlipXY);break;MyBitmap.RotateFlip(RotateFlipType.Rotate90FlipY);break;case 13:MyBitmap.RotateFlip(RotateFlipType.RotateNoneFlipNone); break;case 14:MyBitmap.RotateFlip(RotateFlipType.RotateNoneFlipX);break;case 15:MyBitmap.RotateFlip(RotateFlipType.RotateNoneFlipXY); break;case 16:MyBitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);break;}g.Clear(Color.White);g.DrawImage(MyBitmap, 0, 0);System.Threading.Thread.Sleep(1000);}}。

基于GDI+技术的图形图像处理

基于GDI+技术的图形图像处理
3 0 ・ 研究与应用 ・
纺 织 机械
2 0 1 3年 第 4期
基 于 GDI +技 术 的 图形 图像 处 理
李睿敏 陈俐 坊
( 青 岛宏大纺织机械有 限责任公司 2 6 6 1 0 1 )


本 文提 出 了一种 基 于 G DI +技 术进 行 图形 图像 处理 的 设计 方 法 , 介绍 了 G DI +绘 图技 术
矩 阵的旋 转 、 错切 、 平移 和 比例 等变 换操 作 , 还 支 持
G r a p h i c s 图形 和 区域 的矩 阵变 换 ; 支持 A l p h a 混色 ;
l 设 备 驱动程 序 l
== ======= ============ ======== =====
还支 持重新 着色 、 色彩修正、 消 除走 样 、 元 数据 以及 G r a p h i c s 容器等 特性 。
的特 点和 功 能 , 重 点 阐述 了在 . n e t 开发 环 境 下使 用 G DI +技 术 开发 图像 处理 软件 的 步骤 和代 码 。 文 中所述 示例 已通过 上机 调试 , 并投入 了实际使 用。
关键 词 G DI + . n e t 图形 图像
由于 GD I 本 身功 能 的局 限性 , 使 得 程序 员 在 开
包含 在 最 新 的 wi n d o ws S D K 中。G DI +基 于组 件
1 G D I +的特 点 及 功 能
G DI +是 G DI ( G r a p h i c s D e v i c e I n t e r f a c e ) 的 升
级版 , 它进 行 - r很好 的改 进 , 添加 许 多新 特 性 。G DI +提 供 了颜 色 类 、 画刷类 、 画笔 类 、 字 体类 、 区域类 、

gdi drawimage方法

gdi drawimage方法

gdi drawimage方法
GDI+的Graphics类显示图像的核心方法是DrawImage,其重载函数有许多个。

常用的一般重载函数有:
1. Status DrawImage(Image image, INT x, INT y):此函数将图像image 显示在(x,y)的位置上,这个位置与image图像的左上角点相对应。

2. Status DrawImage(Image image, const Rect& rect):此函数将图像image显示在由rect指定的矩形区域内。

3. Status DrawImage(Image image, const Point destPoints, INT count):此函数将图像image显示在一个多边形区域内,destPoints和count分别用来指定多边形的顶点和顶点个数。

4. Status DrawImage(Image image, INT x, INT y, INT srcx, INT srcy, INT srcwidth, INT srcheight, Unit srcUnit):此函数将图像image的srcx、srcy、srcwidth和srcheight指定的区域显示在(x,y)的位置上,srcUnit用
来指定所使用的单位,默认时使用PageUnitPixel,即用像素作为度量单位。

以上是GDI+的DrawImage方法的一些基本用法,你可以根据具体需求选
择适合的函数进行使用。

深入GDI图像显示

深入GDI图像显示

深入GDI图像显示摘要:本文首先给出了一种结合了DIB和DDB两种位图优点的图像显示方法,其次对GDI函数的高级应用,如透明位图显示、图像旋转显示、图像镜像显示进行了研究。

关键词:GDI图像显示,特殊GDI函数的应用,透明位图显示,图像几何变换显示图像信息是人类认识世界的重要知识来源,人类获得的70%以上的信息来自于眼睛摄取的丰富和真切的图像。

图像与计算机相结合带给人们近乎神奇的图像艺术。

对于程序开发者来说,实现高速的绘图是设计漂亮友好的用户界面的基础和关键所在。

在Win32图像程序设计中,图像显示的方法主要有:GDI,DirectDraw,OpenGL等技术,本文仅讨论利用GDI函数实现位图的显示。

Windows使用的位图有两种:设备无关位图DIB(Device IndependentBitmap)和设备相关位图DDB(Device Dependent Bitmap)。

DDB位图一般用HBITMAP句柄或CBitmap对象保存,Windows 提供的创建DDB位图的函数主要有CreateCompatibleBitmap()、CreateBitmap()和CreateBitmapIndirect()。

出于效率的关系,一般创建彩色位图用CreateCompatibleBitmap()函数,因为它创建的位图格式与显示DC的格式一致,用SelectObject()选入DC和显示的速度要快,另外两个函数多用来创建单色位图。

也可以创建与显示DC不同格式的位图,但这样灰使得显示速度略为变慢。

由于DDB位图的设备相关性,因此它在显示速度方面有优势,但是同时也限制了DDB位图只能在相关DC上才能有效显示。

而这时DIB位图的优势就体现出来了,DIB位图具有良好的设备无关性,可以包含诸如调色板、分辨率等信息。

可以使得应用程序独立于操作系统,因此得到了广泛的应用。

在Win32中DIB位图的显示技术有了较大的提高,与DDB位图相比,两者差别并不是很明显。

使用GDI+ 显示GIF动画 P424

使用GDI+ 显示GIF动画 P424

《Visual C++ 开发实战宝典》10.6 GDI+ 图像处理10.6.2 使用GDI+ 显示GIF动画P424①定义下面内存画布CMemDC,加速图像处理,否则会出现闪烁!!②以下洋红部分,为将内存画布背景设置成白色。

然后,在此上面绘制GIF图像帧。

③以下蓝色部分,为将内存画布颜色设成画刷颜色。

为实现GIF背景与窗口客户区颜色一致。

④断言:ASSERT(this->GetDeviceCaps(RASTERCAPS)&RC_BITBLT==RC_BITBLT),用来判断画面是否支持PatBlt函数。

⑤在CMemDC构造函数中,若不向内存画布绘制白色或其它颜色或图案,将构造函数中的洋红与蓝色部分注释掉。

则显示原汁原味GIF动画(和ACDSee中看到的一样,即保持原背景色)。

如下图⑥析构函数中的BitBlt()函数不可缺少!内存画布对象CMemDC dc是OnTimer定时器处理函数中的局部变量,OnTimer作用是定时显示GIF动画帧。

第执行一次,将一帧画绘制到内存画布dc上,OnTimer()执行退出后,调用调用析构函数中的BitBlt()函数将内存画布dc中的图像绘制到窗口客户区指定的部分。

可见,内存画布dc中的图像包括2部分:其一,在构造函数中绘制的背景(如白色或其它画刷图案),当然,也可以不用绘制背景。

其二,在OnTimer()函数中绘制的动画帧。

class CMemDC : public CDC//定义一个CMemDC类{private:CBitmap* m_bmp; //定义一个位图对象CBitmap* m_oldbmp; //定义一个位图对象CDC* m_pDC; //定义一个设备上下文指针CRect m_Rect; //定义一个区域对象public:CMemDC(CDC* pDC, const CRect& rect) : CDC() //定义构造函数{CreateCompatibleDC(pDC); //创建一个兼容的设备上下文m_bmp = new CBitmap; //为位图对象分配空间//创建位图对象m_bmp->CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());m_oldbmp = SelectObject(m_bmp); //选中创建的位图到内存画布m_pDC = pDC; //设置成员变量m_Rect = rect; //设置区域对象//this->BitBlt(0, 0, m_Rect.Width(), m_Rect.Height(),//pDC, m_Rect.left, m_Rect.top,WHITENESS); //绘制白色背景,若想采用任意颜色,如下蓝色部分//判断是否支持PatBlt函数ASSERT(this->GetDeviceCaps(RASTERCAPS)&RC_BITBLT==RC_BITBLT);CBrush brush;brush.CreateSolidBrush(RGB(236,233,216)); //RGB(,,)是对话框背景色,使用取色软件ColorPix 获得。

使用GDI+进行图像处理

使用GDI+进行图像处理

使用GDI+进行图像处理前段时间VCKBASE发布了一篇有关图像处理的文章“”,之后不断有人问我如何对图像进行旋转处理,也就是让用户歪着脖子看图像,用户的脖子拧断了怎么办?反正不会来找我......其实这个问题的一种解决方法是利用二维(x,y坐标中)矩阵转换实现图像旋转。

使用高中时所学的三角知识或者大学中的线性代数知识就可以解决。

其原理是已知一个点的坐标,那么这个点的旋转坐标可以通过求得,这里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.lib库,这两个文件包含在最新的Windows SDK中。

我对“”一文中的例子代码Myimgapp进行了重写,并改名为Myimgapp2,其代码对CPicture 类进行了重大改动,因为原来的CPicture主要针对IPicture进行封装,而这一次主要是封装GDI+。

利用GDI+实现脑图谱原图像与边缘图的融合显示

利用GDI+实现脑图谱原图像与边缘图的融合显示

利用GDI+实现脑图谱原图像与边缘图的融合显示1诸素萍1,2,戴振东11南京航空航天大学仿生结构与材料防护研究所,南京(210016)2南京航空航天大学机电学院,南京(210016)Email: zddai@摘要:在VC++6.0中利用GDI+对色彩透明度支持的特点实现了屏幕上脑图谱原图像与边缘图像的融合显示,代替手工描绘的方法,同时与边缘检测集成在同一平台上,提高了效率。

关键词:GDI+;透明度;图像融合显示中图分类号:TP3161.引言为了研究壁虎脑部的功能区域,需要找出各个区域的边缘。

传统方法是基于纸质的脑图谱,采用手工描绘出各个功能区边缘[1],这种方法可以在图谱拍摄不清楚的情况下凭借经验准确的找出区域边界, 且界线可以人为修饰美观。

但是,在切片技术制作的大脑切片仅为几十个µ,一个大脑制作的脑图谱为1000幅左右的情况下,采用传统手工描绘时间花费大,在速度上不能满足要求。

现在脑图谱存储成数字图像,因此可以采用边缘检测方法得到研究壁虎脑区图谱的边缘图,再将边缘图与原图进行融合。

在已经编程检测出边缘图的条件下,文中主要将边缘图与原图进行融合。

前面所述的边缘检测系统用VC ++6.0开发的,是基于GDI( Graphics Device Interface )开发的,图像显示不能实现边缘图与原图的融合显示,这是由于GDI不支持图像的色彩透明度设置。

随着Windows XP操作系统的出现新一代图形设备接口GDI+[2] ,给广大图像图形用户带来了全新的图形接口,其增强功能为实现图像与图像融合显示提供了解决途径,本文通过相关实验,编程实现了图像与图像的融合显示,应用在脑图谱边缘勾勒中。

2.GDI+的新增功能GDI+( Graphic Device Interface Plus)是微软 Windows XP和Windows 2003 Server 操作系统的一部分,它主要负责显示信息到显示器和打印机。

使用gdi在窗口上画出一个图片(UseGDItodrawapictureonthewindow)

使用gdi在窗口上画出一个图片(UseGDItodrawapictureonthewindow)

使用gdi在窗口上画出一个图片(Use GDI to draw a picture on thewindow)GDI双缓冲函数实现步骤PAINTSTRUCT PS;HDC HDC;/ /获取屏幕显示直流HDC = BeginPaint(HWND,和PS);/ /创建内存直流HDC hdcmem = CreateCompatibleDC(HDC);/ /创建一个BMP内存空间HBITMAP hBMP = CreateCompatibleBitmap(HDC,screen_width,screen_height);/ /将BMP内存空间分配给内存直流hgdiobj holdsel = SelectObject(hdcmem,hBMP);/ /这是使用者需要绘制的画面,全部往内存直流绘制矩形(hdcmem,0,0,screen_width,screen_height);DrawMenuButton(hdcmem);将内存的内容复制到屏幕显示直流/直流中,完成显示BitBlt(HDC,0,0,screen_width,screen_height,hdcmem,0,0,srccopy);/ /清除资源SelectObject(hdcmem,holdsel);DeleteDC(hdcmem);EndPaint(HWND,和PS);=========================================================== ===直流= GetDC(窗口句柄)memhdc = createcompitabledc(DC)SelectObject(memhdc,图片句柄)BitBlt(HDC,0,0100,24,memdc,0,0,srccopy)=========================================================== =========gdiploadimagefromfile载入PNG图片?1首先把位图载入:LoadImage(HBITMAP BMP = null,”D:/标志。

gdi渲染画面的几种方法

gdi渲染画面的几种方法

gdi渲染画面的几种方法【原创实用版1篇】目录(篇1)一、引言二、GDI 渲染画面的基本概念1.GDI 的定义2.GDI 渲染画面的作用三、GDI 渲染画面的几种方法1.位图2.矢量图3.渐变4.透明度四、各种方法的优缺点1.位图的优缺点2.矢量图的优缺点3.渐变的优缺点4.透明度的优缺点五、总结正文(篇1)一、引言在计算机图形学中,GDI(图形设备接口)是一种用于渲染图形的基本接口。

GDI 渲染画面是指在计算机屏幕上显示图形的过程。

在 GDI 中,有多种渲染画面的方法,如位图、矢量图、渐变和透明度等。

本文将对这些方法进行详细介绍,并分析它们的优缺点。

二、GDI 渲染画面的基本概念1.GDI 的定义GDI 是 Windows 操作系统中用于绘制图形的基本接口。

它提供了一组函数来实现图形绘制、文本输出、图像处理等功能。

通过使用 GDI,程序员可以在屏幕、打印机等设备上绘制各种图形。

2.GDI 渲染画面的作用GDI 渲染画面的作用是将图形设备上的像素转换为具体的颜色和亮度值。

在渲染过程中,GDI 会将图形设备接口的命令转换为具体的图形输出,从而实现图形的显示。

三、GDI 渲染画面的几种方法1.位图位图是一种由像素组成的图像。

在位图中,每个像素都有一个对应的颜色值。

GDI 通过绘制像素来实现位图的渲染。

位图具有较高的显示效果,但存储空间较大,放大时会失真。

2.矢量图矢量图是一种由线条和曲线组成的图像。

GDI 通过计算线条和曲线的方程来实现矢量图的渲染。

矢量图具有较小的存储空间,放大时不失真,但显示效果略逊于位图。

3.渐变渐变是一种在两种颜色之间平滑过渡的效果。

GDI 通过计算颜色值在渐变区域内的分布来实现渐变效果。

渐变可以提高图像的层次感和立体感,但计算较为复杂。

4.透明度透明度是指图像中某个像素的颜色值与背景颜色的混合程度。

GDI 通过设置像素的透明度来实现图像的透明效果。

透明度可以实现图像的半透明或全透明,但可能导致图像的显示效果降低。

gdi+ image 使用方法

gdi+ image 使用方法

gdi+ image 使用方法GDI+是一种用于图形绘制和图像处理的API,它在Windows 操作系统上提供了强大的图形处理功能。

要使用GDI+处理图像,可以按照以下步骤进行操作:1. 导入命名空间:必须导入System.Drawing和System.Drawing.Imaging命名空间,才能使用GDI+相关类和方法。

```csharpusing System.Drawing;using System.Drawing.Imaging;```2. 创建一个Bitmap对象:Bitmap是一个表示图像数据的类,可以用于创建、操作和保存图像。

```csharpBitmap image = new Bitmap("image.jpg");```3. 使用Graphics对象进行绘图:Graphics是一个用于绘制图形和文本的类,可以对Bitmap对象进行绘制操作。

```csharpGraphics graphics = Graphics.FromImage(image);// 在图像上绘制图片、文本等```4. 保存或显示图像:可以使用Bitmap对象的Save方法将图像保存到文件中,也可以使用Graphics对象的DrawImage方法在窗口或控件上显示图像。

```csharpimage.Save("output.jpg", ImageFormat.Jpeg);// 或者pictureBox.Image = image;```除了绘图和显示图像外,GDI+还提供了丰富的图像处理功能,例如调整图像大小、旋转图像、应用滤镜效果等。

可以使用Graphics对象和Image类的相关方法和属性来实现这些功能。

需要注意的是,GDI+在处理图像时可能会占用大量的系统资源,如果处理大图像或大量图像,应该小心管理资源,避免出现性能问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

深入GDI图像显示摘要:本文首先给出了一种结合了DIB和DDB两种位图优点的图像显示方法,其次对GDI函数的高级应用,如透明位图显示、图像旋转显示、图像镜像显示进行了研究。

关键词:GDI图像显示,特殊GDI函数的应用,透明位图显示,图像几何变换显示图像信息是人类认识世界的重要知识来源,人类获得的70%以上的信息来自于眼睛摄取的丰富和真切的图像。

图像与计算机相结合带给人们近乎神奇的图像艺术。

对于程序开发者来说,实现高速的绘图是设计漂亮友好的用户界面的基础和关键所在。

在Win32图像程序设计中,图像显示的方法主要有:GDI,DirectDraw,OpenGL等技术,本文仅讨论利用GDI函数实现位图的显示。

Windows使用的位图有两种:设备无关位图DIB(Device IndependentBitmap)和设备相关位图DDB(Device Dependent Bitmap)。

DDB位图一般用HBITMAP句柄或CBitmap对象保存,Windows 提供的创建DDB位图的函数主要有CreateCompatibleBitmap()、CreateBitmap()和CreateBitmapIndirect()。

出于效率的关系,一般创建彩色位图用CreateCompatibleBitmap()函数,因为它创建的位图格式与显示DC的格式一致,用SelectObject()选入DC和显示的速度要快,另外两个函数多用来创建单色位图。

也可以创建与显示DC不同格式的位图,但这样灰使得显示速度略为变慢。

由于DDB位图的设备相关性,因此它在显示速度方面有优势,但是同时也限制了DDB位图只能在相关DC上才能有效显示。

而这时DIB位图的优势就体现出来了,DIB位图具有良好的设备无关性,可以包含诸如调色板、分辨率等信息。

可以使得应用程序独立于操作系统,因此得到了广泛的应用。

在Win32中DIB位图的显示技术有了较大的提高,与DDB位图相比,两者差别并不是很明显。

但是可以对DDB位图操作的GDI函数远远多于DIB位图。

另外获取和操作DDB位图数据比较麻烦,而DIB位图可以采用直接分配内存来保存,因此在位图数据获取和操作上具有一定的优势。

本文给出一种充分结合了两者优点的图像显示技术,并且深入研究了诸如透明位图显示,图像旋转显示、镜像显示、梯度填充等GDI高级功能应用。

一、位图显示新方法用于操作DIB图像的应用类有许多,笔者在"电脑编程与技巧"杂志99年第10期, 介绍了一个封装的通用图像基类(CImage),可完成DIB 图像数据的管理和一些基本处理功能。

其中大多的DIB类都采用直接分配内存的方式,然后用DIB操作函数来实现图像的显示。

这种方式在Win98中,DIB操作函数将DIB内存直接写入显示内存中,但是在NT 中,操作系统首先将DIB拷贝到服务器端创建一个DDB,然后再将DDB 内存写入显存中,因此图像显示速度就会变慢。

具体的原理有兴趣的读者可以参阅MSDN种的技术文献中关于GDI操作的文章"Win32 动画原理"。

在Win98/NT中提供了一个新的函数CreateDIBSection(),可以在客户与服务器之间创建一个存储DIB位图的公共内存区给GDI。

可以在该内存上执行各种GDI操作(包括利用BitBlt()函数直接输出到显存);另外可以直接访问该内存。

这样就可以提高DIB位图的显示速度。

但是可以看到极少数介绍这种方法的书籍上采用的方法是:先分配DIB内存读入位图,然后用获得位图信息再利用CreateDIBSection()函数分配内存,将数据拷贝到其中,最后将先分配DIB内存删除。

这种方法过程繁琐就不说了,如果遇到调入的位图有几十兆,那速度将慢的惊人。

本文采用的显示方法是:分配DIB内存就用CreateDIBSection()函数,然后用该函数返回的HBITMAP结构变量将位图连接到一个CBitmap变量中。

这样在图像显示的时候,建立一个与当前DC兼容的DC,然后将位图选入用BitBlt()或StretchBlt()函数来显示。

这种方法不仅显示图像的速度快,而且可以直接获得图像数据,对于图像处理应用程序,可以提高图像显示和处理的性能。

该方法是基于通用图像基类(CImage)来实现的,关于该基类的介绍,可参见“一个通用图像基类”一文。

具体的实现代码如下:在类的定义中加入下面的变量HBITMAP hBitmap; // 位图句柄CBitmap m_Bitmap; // DDB位图变量CDC *BMP_DC; // 兼容的DCCBitmap *m_lpOldBmp; // 存放旧图像的指针在类的构造函数中加入如下代码,建立兼容的DCBMP_DC = new CDC;BMP_DC->CreateCompatibleDC( NULL );在分配内存的函数中加入下面的代码,位图信息头m_lpDibInfo要首先获得。

// 用CreateDIBSection()分配图像数据内存hBitmap = CreateDIBSection( BMP_DC->m_hDC,// 兼容DC句柄 m_lpDibInfo,// 位图信息头DIB_RGB_COLORS, // 色彩类型(void **)&m_lpDibArray, // 数据内存指针NULL, 0 );// 如果内存分配成功,将它连接到一个CBitmap变量中if( hBitmap != NULL ){m_Bitmap.Attach( hBitmap );BMP_DC->SelectObject( m_Bitmap );}// 如果内存分配失败,用new来分配内存else{// 分配图像数据内存m_lpDibArray = new BYTE[ m_ImageSize ];// 初始化图像数据内存memset( m_lpDibArray, 0, m_ImageSize );// 如果分配失败,报错if( m_lpDibArray == NULL ) AfxThrowMemoryException(); }其中CreateDIBSection()函数第三个参数指明色彩类型,一般有两种DIB_RGB_COLORS和DIB_PAL_COLORS。

在Win98操作系统下,对于压缩格式为BI_BITFIELDS类型的BMP位图(一般为16位或32位有色彩掩码位图)应用参数DIB_PAL_COLORS,而对于压缩格式为BI_RGB类型的BMP位图用的参数应为DIB_RGB_COLORS。

但是在NT或Win2000操作系统下,该参数只能为DIB_RGB_COLORS,否者在为16位或32位有色彩掩码位图分配内存时会出错。

由于笔者开发程序基于Win2000操作系统,因此该参数就直接用DIB_RGB_COLORS。

获取图像的数据可用指针m_lpDibArray,显示图像可用BitBlt()或StretchBlt()函数来完成。

下面给出的显示函数,可以实现图像放大和大型位图的显示,在视类的OnDraw()函数中调用,参数仅为当前DC指针和客户区的大小,其余计算滚动位置和源图范围的工作均由该函数完成。

BOOL CImage::BestBlt(CDC *pMpDc, CRect ClientRect, BOOL IsFull) {// 将设备坐标转换位逻辑坐标pMpDc->DPtoLP( &ClientRect );// 设置Blt的方式pMpDc->SetStretchBltMode( COLORONCOLOR );// 计算对应客户区的图像区大小int ClientW = ClientRect.Width();int ClientH = ClientRect.Height();CPoint BMPLUP, BMPRBP;if( IsFull ){BMPLUP.x = BMPLUP.y = 0;BMPRBP.x = m_ImageWidth;BMPRBP.y = m_ImageHeight;}else{BMPLUP.x = (int) (ClientRect.left / m_fScale + 0.5); BMPLUP.y = (int) (ClientRect.top / m_fScale + 0.5); BMPRBP.x = (int) (ClientRect.right / m_fScale + 0.5); BMPRBP.y = (int) (ClientRect.bottom / m_fScale + 0.5);if( BMPRBP.x > m_ImageWidth ){BMPRBP.x = m_ImageWidth;}if( BMPRBP.y > m_ImageHeight ){BMPRBP.y = m_ImageHeight;}}// 显示图像return pMpDc->StretchBlt(ClientRect.left,ClientRect.top,ClientRect.Width(),ClientRect.Height(),BMP_DC,BMPLUP.x,BMPLUP.y,BMPRBP.x - BMPLUP.x,BMPRBP.y - BMPLUP.y,SRCCOPY);}上面的位图显示方法不仅可以直接获得图像数据,而且图像又可以作为一个CBitmap变量,CBitmap变量作为GDI对象可以灵活地被各种GDI函数调用,因此次方法结合了DIB和DDB两种位图优点,实现了位图灵活、快速的显示。

二、透明位图的显示方法在许多动画程序中,精灵(sprite)的出现给程序增色许多。

精灵的显示就涉及到透明位图的显示问题,其实精灵实际上视一幅矩形位图,只是背景是固定的颜色,类似于电影拍摄中的蓝幕技术。

下面就给出几种能实现透明位图的显示方法。

1.直接修改位图数据许多程序是用编制的DIB图像类来实现图像的显示,如果直接改变图像内存的数据,如果源图像上点的颜色等于背景色,就不修改目标图像,否则用源图像点替代目标图像点。

这样就可以实现精灵图像的显示。

这种方法有两个缺点:一是要求精灵图像较小,二是对于源图像和目标图像格式不同的情况处理起来比较困难,而且要求程序员对程序进行必要的优化以加快图像更新速度,因此这种方法一般不被采用。

2.用TransparentBlt()函数实现对于Win98或NT5.0操作系统,提供了一个函数TransparentBlt(),可以实现透明位图的显示。

该函数类似于StretchBlt()函数,支持缩放操作,但不支持镜像操作。

具体用法如下:TransparentBlt( pDC->m_hDC, // 目标设备环境句柄10, // 目标矩形区域的左上角x坐标70, // 目标矩形区域的左上角y坐标w, // 目标矩形区域宽度h, // 目标矩形区域高度BackDC.m_hDC, // 源图像的设备环境句柄0, // 源图像的左上角x坐标0, // 源图像的左上角y坐标w, // 源图像的宽度h, // 源图像的高度BackColor );// 透明区域的颜色值注意要使用该函数必须要将MSIMG32.LIB库连接到工程中,可以通过在相应CPP文件中加入下面的代码来将该库连接进工程:#pragma comment( lib, "MSIMG32.LIB")3.用MaskBlt()函数实现MaskBlt()函数通过一个单色模板位图和相应的光栅操作码来实现透明位图得显示。

相关文档
最新文档