Delphi GDI对象之绘制位图

http://www.cnblogs.com/pchmonster/archive/2012/07/06/2579334.html

绘制位图(Drawing Bitmaps)

绘制位图听起来似乎很难,然而如几次所见到的那样,绘制位图非常容易。TCanvas类具有几种方法绘制位图,最常用的方法是Draw方法,这种方法只是在画布上指定位置绘制位图。用户已经见过几个这样的例子。下面是简短的例子。


1

2

3

4

5

6

7

8

9

procedure TForm1.btn1Click(Sender: TObject);

var

  Bitmap: TBitmap;

begin

  Bitmap := TBitmap.Create;

  Bitmap.LoadFromFile(‘type.bmp‘);

  Canvas.Draw(0, 0, Bitmap);

  Bitmap.Free;

end;

这段代码创建了一个TBitmap对象,装载一副BMP位图,并在窗口的最上角显示。

若显示位图不需修改时,可使用Draw方法。



StretchDraw方法用于改变位图的大小。用户在所需绘制的位图和图像位置确定确定一个矩形框。如果所用矩形框大于位图的原始大小,则放大位图;如果矩形框小于位图的原始大小,则缩小位图,这里是一个例子:


1

2

3

4

5

6

7

8

9

10

11

procedure TForm1.btn2Click(Sender: TObject);

var

  Bitmap: TBitmap;

  R: TRect;

begin

  Bitmap := TBitmap.Create;

  Bitmap.LoadFromFile(‘type.bmp‘);

  R := Rect(0, 0, 150, 150);  { 将原始300x300的位图缩放为150x150}

  Canvas.StretchDraw(R, Bitmap);

  Bitmap.Free;

end;

以上代码将位图缩放为150x150像素大小,效果如下:

Note

StretchDraw没法保持位图的原始长宽比率。这完全由用户确认位图保持它的原始长宽比率。



另一个位图绘制方法是CopyRect。这种方法要求同时指定源矩形框和目标矩形框。这就可以将位图分成片段显示,下面的例子就是:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

procedure TForm1.btn3Click(Sender: TObject);

var

  Bitmap: TBitmap;

  Src: TRect;

  Dst: TRect;

  I, X, Y: Integer;

  Strips: Integer;

  Stripsize: Integer;

  OldPal: HPALETTE;

begin

  ClearCanvas;

  Bitmap := TBitmap.Create;

  Bitmap.LoadFromFile(‘type.bmp‘);

  Strips := 6; { 分成六份}

  Stripsize := Bitmap.Height div Strips;

  OldPal := SelectPalette(Canvas.Handle, Bitmap.Palette, True);

  for I := 0 to Pred(Strips) do

  begin

    Src := Rect(0, i * Stripsize, Bitmap.Width, (i * Stripsize) + Stripsize);

    X := Random(Width - Bitmap.Width);

    Y := Random(Height - Stripsize);

    Dst := Rect(X, Y, X + Bitmap.Width, Y + Stripsize);

    Canvas.CopyRect(Dst, Bitmap.Canvas, Src);

  end;

  SelectPalette(Canvas.Handle, OldPal, True);

  Bitmap.Free;

end;

这段代码装载位图,将它分割成片段,然后在窗体任意位置显示这些片段。下图就是这段代码的显示结果。

拷贝位图片段咋一看似乎没有多大意义,然而普通的图形程序设计方法就是创建由一些小的图像构成的大图,并只是将用户需要的图形拷贝到屏幕上。在这种情况下,CopyRect方法就可以使用。

Note

上面的代码中利用SelectPalette函数设置窗体调色板为位图的调色板属性。由于某些奇特的原因,TCanvas类没有调色板属性,因此必须采用API设置窗体调色板。如果没有设置调色板,那么当位图片段显示在窗体上时颜色时错乱的,CopyRect方法是用不同原理在画布上显示位图,因此当使用这种方法时,采用这种特别的步骤是很必要的。

在Windows2000下256色显示设置下,使用与不使用SelectPalette函数的效果对比图:

还有一种位图绘制方法需要提及,BrushCopy方法要求用户指定源矩形框、目标矩形框、图像和透明色,BrushCopy联机帮助中指出,使用ImageList组件而不要用这种方法,但是有时BrushCopy使用的很好,而且使用起来比ImageList组件要容易。使用具有透明背景的位图时记得使用BrushCopy方法。

Delphi syntax:


1

procedure BrushCopy(const Dest: TRect; Bitmap: TBitmap; const Source: TRect; Color: TColor);

下面的例子,展示了CopyRect和BrushCopy显示同一位图的效果,代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

procedure TForm1.btn4Click(Sender: TObject);

var

  Bitmap: TBitmap;

  MyRect, MyOther: TRect;

begin

  MyRect := Rect(10, 10, 310, 165);

  MyOther := Rect(10, 170, 310, 320);

  Bitmap := TBitmap.Create;

  Bitmap.LoadFromFile(‘pchmonster.bmp‘);

  Canvas.BrushCopy(MyRect, Bitmap, Rect(0, 0, 300, 150), clwhite);

  Canvas.CopyRect(MyOther, Bitmap.Canvas, Rect(0, 0, 300, 150));

  Bitmap.Free;

end;

运行后,BrushCopy的透明背景位图效果明显。如下图:



以上代码均在Delphi7中测试通过,示例代码下载:GDI之绘制位图.rar

时间: 2024-12-24 09:46:55

Delphi GDI对象之绘制位图的相关文章

Delphi GDI对象之脱屏位图(Offscreen Bitmaps),也叫内存位图

http://www.cnblogs.com/pchmonster/archive/2012/07/09/2583613.html 脱屏位图(Offscreen Bitmaps) 脱屏位图,也叫内存位图,普遍用于Windows程序设计中.它在内存中制作图像,然后利用Draw方法在屏幕上显示出来.当用户想更快的在屏幕上绘制图像时,脱屏位图有助于避免闪烁.脱屏位图也适合于复杂制图程序.用户可以将图像预存起来,需要时显示出来.脱屏位图用于动画,最流行的动画制作方法是Microsoft的DirectX

Delphi GDI对象之剪切区域

原文链接: http://www.cnblogs.com/pchmonster/archive/2012/07/05/2577627.html 剪切区域(Clipping Regions) Regions是屏幕的一部分,它可用于控制绘图的那部分画布.TCanvas类具有ClipRect属性,但这个属性只是只读的,要改变裁减区,必须使用Windows API,仍以前面的例子为例,并加以修改来说明裁剪区是如何工作的,下面是代码: 1 2 3 4 5 6 7 8 9 10 11 12 var   Bi

常用GDI函数(1):绘制线条和图形

1. CDC::SetPixel()用来绘制一个像素点. 使用Win32 API函数: HDC hdc = ::GetDC(m_hWnd);//获得窗口的设备描述表 ::SetPixel(hdc, 100, 200, RGB(255, 0, 0)); ::ReleaseDC(m_hWnd, hdc);//释放DC资源 CDC::MoveTo(),CDC::LineTo()用来绘制直线. 使用CDC类: CDC* pDC = GetDC();//获得与当前窗口相关联的DC对象 pDC->MoveT

Delphi GDI(一)

Delphi 7下IGDIPlus库的使用 IGDI+是一个免费开源封装微软GDI+功能的Delphi库,该库使得可以用Delphi语言代码快速简短的实现复杂GDI+应用程序. 官方网站:http://www.mitov.com/html/igdi_.html SourceForge:https://sourceforge.net/projects/igdiplus/ 安装方法: 1.首先下载目前最新版的IGDI+,解压到任意目录下,这里我解压到D盘: 2.打开Delphi 7→Tools→En

(转载)VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)

上一节中鸡啄米讲了CDC类及其屏幕绘图函数,本节的主要内容是GDI对象之画笔CPen. GDI对象 在MFC中,CGdiObject类是GDI对象的基类,通过查阅MSDN我们可以看到,CGdiObject类有六个直接的派生类,GDI对象主要也是这六个,分别是:CBitmap.CBrush.CFont.CPalette.CPen和CRgn. 在这六个GDI对象中,最常用的莫过于画笔和画刷了,即CPen类和CBrush类.本文就主要讲解画笔的使用. 画笔的应用实例 鸡啄米在这里直接通过一个波形图的实

GDI+学习之 ------- 绘制角度可变的颜色渐变效果

GDI+ 是GDI(Windows 早期版本提供的图形设备接口)的后续版本,是Microsoft Windows XP作系统即后续版本的图形显示技术.它已经集成到了.Net开发环境中,所以不管你的OS是什么版本,只要安装了.Net框架,就有了GDI+(注意:是.Net框架,而不是.Net开发环境,所以Win98中也可以使用GDI+). 现在,言归正传. 在头文件中加入下面的代码: #include <GdiPlus.h> using namespace Gdiplus; #pragma com

DX笔记之五------游戏画面绘图之绘制位图

本系列文章由zhmxy555编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7335103 共四步 步骤一:加载位图 步骤二:建立与窗口DC兼容的内存DC 步骤三:选用位图对象 步骤四:贴图 详细步骤 步骤一:加载位图 要从文件加载位图,常常使用LoadImage()函数. HANDLE LoadImage( HINSTANCE hinst,  //包含目标位图的DLL或exe文件的模块句柄 LPCTSTR lpszName,

VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)

上一节中鸡啄米讲了CDC类及其屏幕绘图函数,本节的主要内容是GDI对象之画笔CPen. GDI对象 在MFC中,CGdiObject类是GDI对象的基类,通过查阅MSDN我们可以看到,CGdiObject类有六个直接的派生类,GDI对象主要也是这六个,分别是:CBitmap.CBrush.CFont.CPalette.CPen和CRgn. 在这六个GDI对象中,最常用的莫过于画笔和画刷了,即CPen类和CBrush类.本文就主要讲解画笔的使用. 画笔的应用实例 鸡啄米在这里直接通过一个波形图的实

Delphi GDI+ Library

GDI+ LibraryThis library enables GDI+ functionality for Delphi 2009 and later. It differs from other Delphi GDI+ libraries in the following ways: It is modeled more after the .NET System.Drawing namespace instead of the C++ GDI+ classes. As a result,