-
Notifications
You must be signed in to change notification settings - Fork 3.2k
/
arraydemo.py
123 lines (100 loc) 路 3.68 KB
/
arraydemo.py
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/usr/bin/env python
import os
import pygame
from pygame import surfarray
from pygame.locals import *
main_dir = os.path.split(os.path.abspath(__file__))[0]
def surfdemo_show(array_img, name):
"displays a surface, waits for user to continue"
screen = pygame.display.set_mode(array_img.shape[:2], 0, 32)
surfarray.blit_array(screen, array_img)
pygame.display.flip()
pygame.display.set_caption(name)
while 1:
e = pygame.event.wait()
if e.type == MOUSEBUTTONDOWN:
break
elif e.type == KEYDOWN and e.key == K_s:
# pygame.image.save(screen, name+'.bmp')
# s = pygame.Surface(screen.get_size(), 0, 32)
# s = s.convert_alpha()
# s.fill((0,0,0,255))
# s.blit(screen, (0,0))
# s.fill((222,0,0,50), (0,0,40,40))
# pygame.image.save_extended(s, name+'.png')
# pygame.image.save(s, name+'.png')
# pygame.image.save(screen, name+'_screen.png')
# pygame.image.save(s, name+'.tga')
pygame.image.save(screen, name + ".png")
elif e.type == QUIT:
raise SystemExit()
def main(arraytype=None):
"""show various surfarray effects
If arraytype is provided then use that array package. Valid
values are 'numeric' or 'numpy'. Otherwise default to NumPy,
or fall back on Numeric if NumPy is not installed.
"""
if arraytype not in ("numpy", None):
raise ValueError("Array type not supported: %r" % arraytype)
import numpy as N
from numpy import int32, uint8, uint
pygame.init()
print("Using %s" % surfarray.get_arraytype().capitalize())
print("Press the mouse button to advance image.")
print('Press the "s" key to save the current image.')
# allblack
allblack = N.zeros((128, 128), int32)
surfdemo_show(allblack, "allblack")
# striped
# the element type is required for N.zeros in NumPy else
# an array of float is returned.
striped = N.zeros((128, 128, 3), int32)
striped[:] = (255, 0, 0)
striped[:, ::3] = (0, 255, 255)
surfdemo_show(striped, "striped")
# rgbarray
imagename = os.path.join(main_dir, "data", "arraydemo.bmp")
imgsurface = pygame.image.load(imagename)
rgbarray = surfarray.array3d(imgsurface)
surfdemo_show(rgbarray, "rgbarray")
# flipped
flipped = rgbarray[:, ::-1]
surfdemo_show(flipped, "flipped")
# scaledown
scaledown = rgbarray[::2, ::2]
surfdemo_show(scaledown, "scaledown")
# scaleup
# the element type is required for N.zeros in NumPy else
# an #array of floats is returned.
shape = rgbarray.shape
scaleup = N.zeros((shape[0] * 2, shape[1] * 2, shape[2]), int32)
scaleup[::2, ::2, :] = rgbarray
scaleup[1::2, ::2, :] = rgbarray
scaleup[:, 1::2] = scaleup[:, ::2]
surfdemo_show(scaleup, "scaleup")
# redimg
redimg = N.array(rgbarray)
redimg[:, :, 1:] = 0
surfdemo_show(redimg, "redimg")
# soften
# having factor as an array forces integer upgrade during multiplication
# of rgbarray, even for numpy.
factor = N.array((8,), int32)
soften = N.array(rgbarray, int32)
soften[1:, :] += rgbarray[:-1, :] * factor
soften[:-1, :] += rgbarray[1:, :] * factor
soften[:, 1:] += rgbarray[:, :-1] * factor
soften[:, :-1] += rgbarray[:, 1:] * factor
soften //= 33
surfdemo_show(soften, "soften")
# crossfade (50%)
src = N.array(rgbarray)
dest = N.zeros(rgbarray.shape) # dest is float64 by default.
dest[:] = 20, 50, 100
diff = (dest - src) * 0.50
xfade = src + diff.astype(uint)
surfdemo_show(xfade, "xfade")
# alldone
pygame.quit()
if __name__ == "__main__":
main()