12 处理基本的图像 [wxPython in Action]

12 处理基本的图像

本章内容:

装载图像和创建图像对象

创建设备上下文

绘制到设备上下文

绘制文本到设备上下文

管理画刷、画笔和设备坐标


任 何用户界面工具的最基本的行为就是在屏幕上绘制。在最基本的层面上来说,定义在wxPython中的每个窗口部件都是由发送给屏幕的一系列命令构成的。那 些绘制命令是否是在wxPython代码库中,这依赖于相关窗口部件对于本地操作系统是否是本地化的或完全由wxPython所定义的。在这一章,我们将 给你展示如何在基本绘制命令层面上控制wxPython。我们也将给你展示如何管理和显示其它的图形化元素如图像和字体。

被wxPython用于绘制的主要的概念是设备上下文(device context)。设备上下文使用一个标准的API来管理对设备(如屏幕或打印机)的绘制。设备上下文类用于最基本的绘制功能,如绘制一条直线、曲线或文本。

12.1 使用图像工作

大 多数的应用程序都需要载入至少一个图像,这些图像存储在外部的文件中。样例包括工具栏图片、光标、图标、启始画面或仅仅用于装饰以增加一些时髦感的图像。 传统上,使用图像工作的复杂性是不得不处理用于储存图像的不同的图片文件格式。幸运的是,wxPython内部为你做了所有的这些。你将使用相同的抽象概 念来处理任何图像,而不用关心它的原始格式。

在随后的几节中,我们将讨论wxPython用来管理图像的那么抽象概念,这包括大尺寸图像(large-scale images),以及光标图像。你将看到如何装载图像到你的程序中,然后如何操作它们。

12.1.1 如何载入图像?

在wxPython 中,图像处理是一个双主管系统,与平台无关的图像处理由类wx.Image管理,而与平台有关的图像处理由类wx.Bitmap管理。实际上,意思就是外 部文件格式由wx.Image装载和保存,而wx.Bitmap负责将图像显示到屏幕。图12.1显示了不同图像和位图的创建,按照不同的文件类型读入。

要从一个文件载入一个图像,使用wx.Image的构造函数:

wx.Image(name, type=wx.BITMAP_TYPE_ANY, index=-1)

图12.1


参 数name是图像文件的名字,参数type(类型)是处理器类型。type的ID可以是wx.BITMAP_TYPE_ANY或表12.1中的一个。如果 你使用wx.BITMAP_TYPE_ANY,那么wxPython将试图自动检测该文件的类型。如果你使用一个特定的文件类型,那么wxPython将 使用该类型转换这个文件。例12.1显示了如何使用wx.BITMAP_TYPE_ANY来载入图像。

例12.1 载入并缩放简单图像

import wx

filenames = ["image.bmp", "image.gif", "image.jpg", "image.png" ]

class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Loading Images")
p = wx.Panel(self)

fgs = wx.FlexGridSizer(cols=2, hgap=10, vgap=10)
for name in filenames:
#1 从文件载入图像
img1 = wx.Image(name, wx.BITMAP_TYPE_ANY)

# Scale the original to another wx.Image
w = img1.GetWidth()
h = img1.GetHeight()
img2 = img1.Scale(w/2, h/2)#2 缩小图像

#3 转换它们为静态位图部件
sb1 = wx.StaticBitmap(p, -1, wx.BitmapFromImage(img1))
sb2 = wx.StaticBitmap(p, -1, wx.BitmapFromImage(img2))

# and put them into the sizer
fgs.Add(sb1)
fgs.Add(sb2)

p.SetSizerAndFit(fgs)
self.Fit()


app = wx.PySimpleApp()
frm = TestFrame()
frm.Show()
app.MainLoop()

上面的代码应该很简单。代码开始是我们想要载入的图像文件的名字,我们使用wx.BITMAP_TYPE_ANY类型标记指示wxPython去断定图像文件的格式,而用不着我们操心。然后我们使用图像的方法将图像缩小一半,并将图像转换为位图。

你也可以显示地指定图像文件的格式,在下一节,我们将显示wxPython所支持的图像文件格式。

指定一个图像文件格式

图 像由所用的图像处理器管理。一个图像处理器是wx.ImageHandler的一个实例,它为管理图像格式提供了一个插入式的结构。在通常的情况下,你不 需要考虑图像处理器是如何工作的。你所需要知道的是每个处理器都有它自己唯一的wxPython标识符,用以载入相关格式的文件。表12.1列出了所支持 的格式。

表12.1 wxPython支持的图像文件格式

处理器类:wx.ANIHandler 类型标记:wx.BITMAP_TYPE_ANI

说明:动画光标格式。这个处理器只载入图像而不保存它们。

处理器类:wx.BMPHandler 类型标记:wx.BITMAP_TYPE_BMP

说明:Windows和OS/2位图格式。

处理器类:wx.CURHandle 类型标记:wx.BITMAP_TYPE_CUR

说明:Windows光标 图标格式。

处理器类:wx.GIFHandler 类型标记:wx.BITMAP_TYPE_GIF

说明:图形交换格式。由于版权限制,这个处理器不保存图像。

处理器类:wx.ICOHandler 类型标记:wx.BITMAP_TYPE_ICO

说明:Windows图标格式。

处理器类:wx.IFFHandler 类型标记:wx.BITMAP_TYPE_IFF

说明:交换文件格式。这个处理器只载入图像,它不保存它们。

处理器类:wx.JPEGHandler 类型标记:wx.BITMAP_TYPE_JPEG

说明:联合图形专家组格式。

处理器类:wx.PCXHandler 类型标记:wx.BITMAP_TYPE_PCX

说明:PC画刷格式。当以这种格式保存时,wxPython计算在这个图像中的不同颜色的数量。如果可能的话,这个图像被保存为一个8位图像(也就是说,如果它有256种或更少的颜色)。否则它保存为24位。

处理器类:wx.PNGHandler 类型标记:wx.BITMAP_TYPE_PNG

说明:便携式网络图形格式。

处理器类:wx.PNMHandler 类型标记:wx.BITMAP_TYPE_PNM

说明:只能载入ASCII或原始的RGB图像。图像被该处理器保存为原始的RGB。

处理器类:wx.TIFFHandler 类型标记:wx.BITMAP_TYPE_TIF

说明:标签图像文件格式。

处理器类:wx.XPMHandler 类型标记:wx.BITMAP_TYPE_XPM

说明:XPixMap格式。

处理器类:自动 类型标记:wx.BITMAP_TYPE_ANY

说明:自动检测使用的格式,然后调用相应的处理器。

要 使用一个MIME类型来标识文件,而不是一个处理器类型ID的话,请使用函数wx.ImageFromMime(name, mimetype, index=-1),其中的name是文件名,mimetype是有关文件类型的字符串。参数index表示在图像文件包含多个图像的情况下要载入的图 像的索引。这仅仅被GIF, ICO, 和TIFF处理器使用。默认值-1表示选择默认的图像,被GIF和TIFF处理顺解释为每一个图像(index= 0),被ICO处理器解释为最大且最多色彩的一个。

创建image(图像)对象

wxPython 使用不同的全局函数来创建不同种类的wx.Image对象。要创建一个有着特定尺寸的空图像,使用函数wx.EmptyImage(width, height)——在这个被创建的图像中所有的像素都是黑色。要创建从一个打开的流或Python文件类对象创建一个图像,使用 wx.ImageFromStream(stream,type=wx.BITMAP_TYPE_ANY, index=-1)。有时,根据一个原始的 RGB数据来创建一个图像是有用的,这使用wx.ImageFromData(width,height,data),data是一个字符串,每套连续的 三个字符代表一个像素的红,绿,蓝的组分。这个字符串的大小应该是width*height*3。

创建bitmap(位图)对象

有几个方法可以创建一个位图对象。其中最基本的wx.Bitmap构造函数是
wx.Bitmap (name, type=wx.BITMAP_TYPE_ANY)。参数name是一个文件名,type可以是表12.1中的一个。如果bitmap类能 够本地化地处理这个文件格式,那么它就处理,否则这个图像将自动地经由wx.Image载入并被转换为一个wx.Bitmap实例。

你可 以使用方法wx.EmptyBitmap(width,height,depth=-1)来创建一个空的位图——参数width和height是位图的尺 度,depth是结果图像的颜色深度。有两个函数使你能够根据原始的数据来创建一个位图。函数wx.BitmapFromBits(bits, width, height, depth=-1)创建一个位图,参数bits是一个Python字节列表。这个函数的行为依赖于平台。在大多数平台 上,bits要么是1要么是0,并且这个函数创建一个单色的位图。在Windows平台上,数据被直接传递给Windows的API函数 CreateBitmap()。函数wxBitmapFromXPMData(listOfStrings)一个Python字符串列表作为一个参数,以 XPM格式读该字符串。

通过使用wx.Bitmap的构造函数wx.BitmapFromImage(image, depth=- 1),你可以将一个图像转换为一个位图。参数image是一个实际wx.Image对象,depth是结果位图的颜色深度。如果这个深度没有指定,那么使 用当前显示器的颜色深度。你可以使用函数wx.ImageFromBitmap(bitmap)将位图转回为一个图像,通过传递一个实际的 wx.Bitmap对象。在例12.1中,位图对象的创建使用了位图的构造函数,然后被用于构建wx.StaticBitmap窗口部件,这使得它们能够 像别的wxPython项目一样被放入一个容器部件中。
posted @ 2008-01-31 15:28  Yoshow  阅读(2504)  评论(0编辑  收藏  举报