版本29和30间的区别
于2006-10-16 00:32:56修订的的版本29
大小: 8244
编辑: czk
备注:
于2006-10-16 12:32:30修订的的版本30
大小: 11464
编辑: czk
备注:
删除的内容标记成这样。 加入的内容标记成这样。
行号 3: 行号 3:
= 图片处理 = = 图像处理 =

== 读取和保存 ==
使用pygame.image模块,可以对图像进行读取和保存。

使用pygame.image.load读取图像文件。{{{
img = pygame.image.load(filename)
}}}可以读取文件名为filename的图像文件,pygame会自动确定文件的类型(比如GIF或者BMP),一般来说支持JPG、PNG、GIF (non animated)、BMP、PCX、TGA (uncompressed)、TIF、LBM (及PBM)、PBM (及PGM, PPM)、XPM等。它返回一个包含图像的Surface,Surface的格式和原来的文件相同(包括颜色格式、透明色和alpha透明)。

使用pygame.image.save可以把图像保存到文件中。{{{
pygame.image.save(img, filename)
}}}这个函数可以把img这个Surface的内容保存为filename指定的图像文件,文件格式可以是BMP、TGA、PNG或者JPEG。如果文件扩展名不认识,默认保存为TGA格式。TGA和BMP格式都是非压缩的文件。

还有pygame.image.tostring、pygame.image.fromstring、pygame.image.frombuffer函数可以把图像序列化,即把图像保存在字符串中或者从字符串中读取图像。

== 变换 ==
使用pygame.transform模块中的函数,可以对图像进行简单的变换。所有的这些函数都需要一个Surface参数指明要处理的图像,并生成一个新的图像表示处理后的结果,原来的图像不会被改变。

使用pygame.transform.flip可以上下左右颠倒图像,比如{{{
newimg = pygame.transform.flip(img, True, False)
}}}第一个参数指定要翻转的图像,第二个参数指定是否对图像进行左右颠倒,第三个参数指定是否对图像进行上下颠倒。函数返回颠倒后的图像。

使用pygame.transform.scale可以对图像进行缩放,比如{{{
newimg = pygame.transform.resize(img, (640, 480))
}}}第一个参数指定要缩放的图像,第二个参数指定缩放后的图像大小,函数返回缩放后的图像。

使用pygame.transform.rotate可以对图像进行旋转,比如{{{
newimg = pygame.transform.rotate(img, 30.0)
}}}第一个参数指定要旋转的图像,第二个参数指定旋转的角度数,正值为逆时针旋转,负值是顺时针旋转。函数返回旋转后的图像。旋转后的图像可能比原来的图像大,才能够容纳原来的整个图像,空出来的部分会补上透明色或者原来图像的左上角点的颜色。

使用pygame.transform.rotozoom可以对图像进行缩放并旋转,比如{{{
newimg = pygame.transform.rotozoom(img, 30.0, 2.0)
}}}第一个参数指定要处理的图像,第二个参数指定旋转的角度数,第三个参数指定缩放的比例。返回处理后的图像。这个函数和前面两个函数不一样,这个函数会对图像进行滤波处理,图像效果会更好,但是速度会慢很多。

使用pygame.transform.scale2x可以对图像进行快速的两倍大小的放大,比如{{{
newimg = pygame.transform.scale2x(img)
}}}

使用pygame.transform.chop可以对图像进行裁减,比如{{{
newimg = pygame.transform.chop(img, (100, 100, 200, 200))
}}}第一个参数指定要裁减的图像,第二个参数指定要保留的图像的区域。返回裁减后留下的图像。

TableOfContents

图像处理

1. 读取和保存

使用pygame.image模块,可以对图像进行读取和保存。

使用pygame.image.load读取图像文件。

img = pygame.image.load(filename)

可以读取文件名为filename的图像文件,pygame会自动确定文件的类型(比如GIF或者BMP),一般来说支持JPG、PNG、GIF (non animated)、BMP、PCX、TGA (uncompressed)、TIF、LBM (及PBM)、PBM (及PGM, PPM)、XPM等。它返回一个包含图像的Surface,Surface的格式和原来的文件相同(包括颜色格式、透明色和alpha透明)。

使用pygame.image.save可以把图像保存到文件中。

pygame.image.save(img, filename)

这个函数可以把img这个Surface的内容保存为filename指定的图像文件,文件格式可以是BMP、TGA、PNG或者JPEG。如果文件扩展名不认识,默认保存为TGA格式。TGA和BMP格式都是非压缩的文件。

还有pygame.image.tostring、pygame.image.fromstring、pygame.image.frombuffer函数可以把图像序列化,即把图像保存在字符串中或者从字符串中读取图像。

2. 变换

使用pygame.transform模块中的函数,可以对图像进行简单的变换。所有的这些函数都需要一个Surface参数指明要处理的图像,并生成一个新的图像表示处理后的结果,原来的图像不会被改变。

使用pygame.transform.flip可以上下左右颠倒图像,比如

newimg = pygame.transform.flip(img, True, False)

第一个参数指定要翻转的图像,第二个参数指定是否对图像进行左右颠倒,第三个参数指定是否对图像进行上下颠倒。函数返回颠倒后的图像。

使用pygame.transform.scale可以对图像进行缩放,比如

newimg = pygame.transform.resize(img, (640, 480))

第一个参数指定要缩放的图像,第二个参数指定缩放后的图像大小,函数返回缩放后的图像。

使用pygame.transform.rotate可以对图像进行旋转,比如

newimg = pygame.transform.rotate(img, 30.0)

第一个参数指定要旋转的图像,第二个参数指定旋转的角度数,正值为逆时针旋转,负值是顺时针旋转。函数返回旋转后的图像。旋转后的图像可能比原来的图像大,才能够容纳原来的整个图像,空出来的部分会补上透明色或者原来图像的左上角点的颜色。

使用pygame.transform.rotozoom可以对图像进行缩放并旋转,比如

newimg = pygame.transform.rotozoom(img, 30.0, 2.0)

第一个参数指定要处理的图像,第二个参数指定旋转的角度数,第三个参数指定缩放的比例。返回处理后的图像。这个函数和前面两个函数不一样,这个函数会对图像进行滤波处理,图像效果会更好,但是速度会慢很多。

使用pygame.transform.scale2x可以对图像进行快速的两倍大小的放大,比如

newimg = pygame.transform.scale2x(img)

使用pygame.transform.chop可以对图像进行裁减,比如

newimg = pygame.transform.chop(img, (100, 100, 200, 200))

第一个参数指定要裁减的图像,第二个参数指定要保留的图像的区域。返回裁减后留下的图像。

绘图

除了可以把事先画好的图片blit到Surface上以外,还可以在Surface上自行在Surface上绘制一些简单的图形,比如点、线、方、圆等。这个功能主要由pygame.draw模块完成。

首先导入pygame.draw模块。

import pygame.draw

如果已经用了import pygame,则pygame.draw模块也被自动导入了。

然后准备好要在上面绘制图形的Surface,比如

surface = pygame.display.set_mode((640, 480))

1. 画矩形

接下来就可以在surface上面绘制想要的图形了。比如说画矩形可以使用pygame.draw.rect函数:

pygame.draw.rect(surface, (0,0,255), (100, 200, 100, 100))

第一个参数指定在哪个Surface上画矩形,第二个参数是矩形的颜色,第三个参数是矩形的位置和大小。

颜色的参数一般是一个由红绿蓝三种颜色值构成的三元组,0是最暗的,255是最亮的。比如(0,0,255)是纯蓝色,(255,0,0)是纯红色,(0,0,0)是黑色,(255,255,255)是白色等等。有时候也可以使用RGBA四元组来表示颜色。如果Surface包含alpha,四元组中alpha值会被直接写入到Surface里面,画图函数并不会进行透明的绘画。颜色参数也可以是一个整数,是映射到Surface里的像素值。其他绘图函数里面的颜色参数也是一样的。

矩形参数由四个值构成的元组,分别是矩形左上角的x、y坐标,矩形的宽和高。

默认情况下,画出来的矩形是实心的(中间填充了指定的颜色)。如果要画一个只有边框的矩形,可以指定一个可选的参数width。比如

pygame.draw.rect(surface, (0,0,255), (100, 200, 100, 100), 2)

可以在屏幕上画一个边框是2个像素粗的矩形,中间是透明的。如果不指定这个width参数,或者width指定为0,则画出来的矩形就是实心的。其他有些绘图函数里面也有类似的参数,功能也是相似的。

pygame.draw.rect函数返回一个矩形,表示屏幕上被修改的像素的区域范围。其它绘图函数也都有这样的返回值。

2. 画多边形

用pygame.draw.polygon可以在Surface上画一个多边形。比如

pygame.draw.polygon(surface, (255,0,0), [(100, 100),(200, 100),(250,186.6),(200,273.2),(100, 273.2),(50,186.6)])

第三个参数pointlist参数是多边形顶点的列表。可选的第四个width参数是多边形的边的粗细。如果width是0或者被忽略,多边形是被填充的。

pygame.draw.polygon(surface, (0,255,0), [(100, 100),(200, 100),(250,186.6),(200,273.2),(100, 273.2),(50,186.6)],1)

3. 画圆

pygame.draw.circle在Surface上画一个圆形。

pygame.draw.circle(surface, (255,255,0), (100, 100), 50)

第三个参数pos是圆的圆心,第四个参数radius是半径大小。可选的第五个参数width是圆边的粗细,如果width缺省或者是0圆会被填充。

4. 画椭圆

pygame.draw.ellipse在矩形区域中画一个椭圆的形状。比如

pygame.draw.ellipse(surface, (0,255,255), (200, 200, 200, 100))

第三个参数指定的矩形区域是椭圆填充的区域。可选的第四个参数width是边的粗细。如果width缺省或者是0,椭圆会被填充。

5. 画弧线

pygame.draw.arc画椭圆的一段。比如

pygame.draw.arc(surface, (0,255,0), (200, 200, 200, 100), 3.14159/3, 3.14159*2/3)

在Surface上画一个椭圆状的弧线。第三个参数rect指定椭圆填充的矩形。接下来两个角度参数指定起始和终止的角度(以弧度为单位),朝右为0度。可选的第六个参数width是弧线的粗细,默认值是1。

== 画线段 == pygame.draw.line函数可以画一条直线段。比如

pygame.draw.line(surface, (255,0,255), (100, 100), (200, 200))

第三个参数指定起点,第四个参数指定终点。可选的第五个参数width指定线的宽度,默认是1。线段终点没有箭头,宽的线段终点是方形的。

6. 画连续的线段

pygame.draw.lines画多条连续的线段。比如

pygame.draw.lines(surface, (255,255,255), False, [(100, 100), (200, 200), (300, 200), (200, 100)])

第四个参数pointlist是一系列点的列表。如果第三个参数是True,则在最后一点和第一点之间会画一条线段。可选的第五个参数表示线的宽度,默认为1。这个函数不会画终点箭头和中间连接头。线段有尖锐的拐角,粗的线段会有不太好看的拐角。

7. 抗锯齿的线段

pygame.draw.aaline画抗锯齿的线段。

pygame.draw.aaline(surface, (255,255,0), (200, 100), (300, 200))

这个函数的用法和画线段的函数差不多,只是画出来的线段有抗锯齿效果,看上去比较光滑。有一个可选的第五个参数blend,如果blend是True,则阴影部分是和原始像素混合而不是直接覆盖的。这个函数接受浮点数作为点的坐标。

pygame.draw.aalines可以画多条连续的抗锯齿线段。

pygame.draw.aalines(surface, (0,0, 255), False, [(100, 100), (200, 200), (300, 100), (200, 0)])

如果第三个参数如果是True,则在第一个点和最后一点之间会画一条直线。有一个可选的第五个参数blend,如果blend参数是True,则阴影部分是和原始像素混合而不是直接覆盖的。这个函数接受浮点数作为点的坐标。

8. 点操作

画点的方法和其它方法不太一样,用Surface.set_at方法完成画点的操作,比如:

surface.set_at((100, 100), (255,255,255))

第一个参数是点的坐标,第二个参数是颜色。在游戏和实时模拟中,一次取得和设置一个像素是很慢的。

除了可以在Surface上画点,还可以用Surface.get_at读取Surface上像素的值。比如

color = surface.get_at((100, 100))

这个函数返回给定点的颜色值。

9. 填充区域

Surface.fill方法可以用一种颜色填充一个矩形区域。比如

surface.fill((255,0,0), (100, 200, 100, 100))

第一个参数指定要填充的颜色,第二个参数指定填充的矩形区域。如果没有给定第二个参数,整个Surface会被填充。第二个参数会限制备填充的区域。这个函数会返回受影响的Surface区域。

写字

相对于在Surface上画图,在Surface上写文字要复杂得多。

首先需要导入pygame.font模块并初始化。

import pygame.font
pygame.font.init()

1. 选择字体

然后用pygame.font.get_fonts获取可用的字体的列表。

pygame.font.get_fonts()

它返回一个字体名字的列表。

然后再用字体名字列表中的一个名字可以创建一个字体对象。

font = pygame.font.SysFont("monospace", 12)

第一个参数指定字体的名字,第二个参数指定字体的大小。可选的第三个参数bold指定是否粗体,默认不是粗题。可选的地四个参数italic指定是否斜体,默认不是斜体。

如果是要使用自己给的字体文件,可以这样创建字体对象

font = pygame.font.Font("/usr/share/fonts/truetype/arphic/uming.ttf", 12)

第一个参数指定要载入的字体文件的完整路径,第二个参数指定字体的大小。

2. 创建文字Surface

使用字体对象的Font.render函数可以创建一个Surface,里面包含写出来的文字。比如

font_surface = font.render("Hello world!", False, (255,0,0))

第一个参数是要写的文字,文字只能包含一行,换行符不会被画出来。第二个参数指定是否使用抗锯齿效果,如果是True字符会有光滑的边缘。第三个参数是字体的颜色。可选的第四个参数background用来指定文字背景的颜色。如果没有指定background,背景是透明的。返回创建的Surface,它上面包含了画出来的文字,它的大小是能容纳这些字的最小的大小。

要在已有的Surface上写字,只能先创建一个只包含文字的Surface,然后把它blit到已有的Surface上。比如:

surface.blit(font_surface, (100, 100))

对surface的控制

The end

Pygame图形接口基础 (2008-02-23 15:34:18由localhost编辑)

ch3n2k.com | Copyright (c) 2004-2020 czk.