-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgif.py
118 lines (101 loc) · 3.96 KB
/
gif.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
from PIL import Image
import pygame
import time
class GifRuner(object):
def __init__(self, filename, scale=1):
self.filename = filename
self.scale = scale
self.image = Image.open(filename)
self.frames = []
self.get_frames()
self.cur = 0
self.ptime = time.time()
self.running = True
self.breakpoint = len(self.frames) - 1
self.startpoint = 0
self.reversed = False
def get_rect(self):
return pygame.rect.Rect((0, 0), (self.image.size[0] * self.scale, self.image.size[1] * self.scale))
def get_frames(self):
image = self.image
pal = image.getpalette()
base_palette = []
for i in range(0, len(pal), 3):
rgb = pal[i:i + 3]
base_palette.append(rgb)
all_tiles = []
try:
while 1:
if not image.tile:
image.seek(0)
if image.tile:
all_tiles.append(image.tile[0][3][0])
image.seek(image.tell() + 1)
except EOFError:
image.seek(0)
all_tiles = tuple(set(all_tiles))
try:
while 1:
try:
duration = image.info["duration"]
except KeyError:
duration = 100
duration *= .001 # convert to milliseconds!
cons = False
x0, y0, x1, y1 = (0, 0) + (image.size[0] * self.scale, image.size[1] * self.scale)
if image.tile:
tile = image.tile
else:
image.seek(0)
tile = image.tile
if len(tile) > 0:
x0, y0, x1, y1 = tile[0][1]
if all_tiles:
if all_tiles in ((6,), (7,)):
cons = True
pal = image.getpalette()
palette = []
for i in range(0, len(pal), 3):
rgb = pal[i:i + 3]
palette.append(rgb)
elif all_tiles in ((7, 8), (8, 7)):
pal = image.getpalette()
palette = []
for i in range(0, len(pal), 3):
rgb = pal[i:i + 3]
palette.append(rgb)
else:
palette = base_palette
else:
palette = base_palette
# ignoredErrors
pi = pygame.image.frombuffer(image.tobytes(), image.size, image.mode)
pi.set_palette(palette)
pi = pygame.transform.scale(pi, (self.image.size[0] * self.scale, self.image.size[1] * self.scale))
if "transparency" in image.info:
pi.set_colorkey(image.info["transparency"])
self.frames.append([pi, duration])
image.seek(image.tell() + 1)
except EOFError as e:
pass
def render(self, screen, pos, transparency=255):
if self.running:
if time.time() - self.ptime > self.frames[self.cur][1]:
if self.reversed:
self.cur -= 1
if self.cur < self.startpoint:
self.cur = self.breakpoint
else:
self.cur += 1
if self.cur > self.breakpoint:
self.cur = self.startpoint
self.ptime = time.time()
pict = self.frames[self.cur][0]
pict.set_alpha(transparency)
screen.blit(pict, pos)
def get_height(self):
return (self.image.size[0] * self.scale, self.image.size[1] * self.scale)[1]
def get_width(self):
return (self.image.size[0] * self.scale, self.image.size[1] * self.scale)[0]
def get_size(self):
return (self.image.size[0] * self.scale, self.image.size[1] * self.scale)[0]