ren811

GIFImage

Jan 10th, 2013
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.37 KB | None | 0 0
  1. # coding: utf-8
  2. import Image
  3. import pygame
  4. from pygame.locals import *
  5.  
  6. import time
  7.  
  8. class GIFImage(object):
  9.     def __init__(self, filename):
  10.         self.filename = filename
  11.         self.image = Image.open(filename)
  12.         self.frames = []
  13.         self.get_frames()
  14.  
  15.         self.cur = 0
  16.         self.ptime = time.time()
  17.  
  18.         self.running = True
  19.         self.breakpoint = len(self.frames)-1
  20.         self.startpoint = 0
  21.         self.reversed = False
  22.  
  23.     def get_frames(self):
  24.         image = self.image
  25.  
  26.         pal = image.getpalette()
  27.         base_palette = []
  28.         for i in range(0, len(pal), 3):
  29.             rgb = pal[i:i+3]
  30.             base_palette.append(rgb)
  31.  
  32.         all_tiles = []
  33.         try:
  34.             while 1:
  35.                 if not image.tile:
  36.                     image.seek(0)
  37.                 if image.tile:
  38.                     all_tiles.append(image.tile[0][3][0])
  39.                 image.seek(image.tell()+1)
  40.         except EOFError:
  41.             image.seek(0)
  42.  
  43.         all_tiles = tuple(set(all_tiles))
  44.  
  45.         try:
  46.             while 1:
  47.                 try:
  48.                     duration = image.info["duration"]
  49.                 except:
  50.                     duration = 100
  51.  
  52.                 duration *= .001 #convert to milliseconds!
  53.                 cons = False
  54.  
  55.                 x0, y0, x1, y1 = (0, 0) + image.size
  56.                 if image.tile:
  57.                     tile = image.tile
  58.                 else:
  59.                     image.seek(0)
  60.                     tile = image.tile
  61.                 if len(tile) > 0:
  62.                     x0, y0, x1, y1 = tile[0][1]
  63.  
  64. ##                    if tile[0][3][0] in (4, 5):
  65. ##                        #replacement, don't have our own palette!
  66. ##                        palette = base_palette
  67. ##                    elif tile[0][3][0] in (6, 7):
  68. ##                        #consecutive blitting, have own palette's
  69. ##                        cons = True
  70. ##                        pal = image.getpalette()
  71. ##                        palette = []
  72. ##                        for i in range(0, len(pal), 3):
  73. ##                            rgb = pal[i:i+3]
  74. ##                            palette.append(rgb)
  75. ##                    else:
  76. ##                        pal = image.getpalette()
  77. ##                        palette = []
  78. ##                        for i in range(0, len(pal), 3):
  79. ##                            rgb = pal[i:i+3]
  80. ##                            palette.append(rgb)
  81. ##                else:
  82. ##                    palette = base_palette
  83.  
  84.                 if all_tiles:
  85.                     if all_tiles in ((6,), (7,)):
  86.                         cons = True
  87.                         pal = image.getpalette()
  88.                         palette = []
  89.                         for i in range(0, len(pal), 3):
  90.                             rgb = pal[i:i+3]
  91.                             palette.append(rgb)
  92.                     elif all_tiles in ((7, 8), (8, 7)):
  93.                         pal = image.getpalette()
  94.                         palette = []
  95.                         for i in range(0, len(pal), 3):
  96.                             rgb = pal[i:i+3]
  97.                             palette.append(rgb)
  98.                     else:
  99.                         palette = base_palette
  100.                 else:
  101.                     palette = base_palette
  102.  
  103. ##                try:
  104. ##                    if image.dispose:
  105. ##                        print "YAY!"
  106. ##                        i = image.dispose
  107. ##                        np = pygame.image.fromstring(i.tostring(), i.size, i.mode)
  108. ##                        np.set_palette(palette)
  109. ##                        if "transparency" in i.info:
  110. ##                            np.set_colorkey(i.info["transparency"])
  111. ##                        cons = np
  112. ##                    else:
  113. ##                        print image.dispose
  114. ##                except:
  115. ##                    print image.dispose
  116.  
  117.                 pi = pygame.image.fromstring(image.tostring(), image.size, image.mode)
  118.                 pi.set_palette(palette)
  119.                 if "transparency" in image.info:
  120.                     pi.set_colorkey(image.info["transparency"])
  121.                 pi2 = pygame.Surface(image.size, SRCALPHA)
  122.                 if cons:
  123.                     for i in self.frames:
  124.                         pi2.blit(i[0], (0,0))
  125.                 pi2.blit(pi, (x0, y0), (x0, y0, x1-x0, y1-y0))
  126.  
  127.                 self.frames.append([pi2, duration])
  128.                 image.seek(image.tell()+1)
  129.         except EOFError:
  130.             pass
  131.  
  132.     def render(self, screen, pos):
  133.         if self.running:
  134.             if time.time() - self.ptime > self.frames[self.cur][1]:
  135.                 if self.reversed:
  136.                     self.cur -= 1
  137.                     if self.cur < self.startpoint:
  138.                         self.cur = self.breakpoint
  139.                 else:
  140.                     self.cur += 1
  141.                     if self.cur >= self.breakpoint:
  142.                         self.cur = self.startpoint
  143.  
  144.                 self.ptime = time.time()
  145.  
  146.         screen.blit(self.frames[self.cur][0], pos)
  147.  
  148.     def seek(self, num):
  149.         self.cur = num
  150.         if self.cur < 0:
  151.             self.cur = 0
  152.         if self.cur >= len(self.frames):
  153.             self.cur = len(self.frames)-1
  154.  
  155.     def set_bounds(self, start, end):
  156.         if start < 0:
  157.             start = 0
  158.         if start >= len(self.frames):
  159.             start = len(self.frames) - 1
  160.         if end < 0:
  161.             end = 0
  162.         if end >= len(self.frames):
  163.             end = len(self.frames) - 1
  164.         if end < start:
  165.             end = start
  166.         self.startpoint = start
  167.         self.breakpoint = end
  168.  
  169.     def pause(self):
  170.         self.running = False
  171.  
  172.     def play(self):
  173.         self.running = True
  174.  
  175.     def rewind(self):
  176.         self.seek(0)
  177.     def fastforward(self):
  178.         self.seek(self.length()-1)
  179.  
  180.     def get_height(self):
  181.         return self.image.size[1]
  182.     def get_width(self):
  183.         return self.image.size[0]
  184.     def get_size(self):
  185.         return self.image.size
  186.     def length(self):
  187.         return len(self.frames)
  188.     def reverse(self):
  189.         self.reversed = not self.reversed
  190.     def reset(self):
  191.         self.cur = 0
  192.         self.ptime = time.time()
  193.         self.reversed = False
  194.  
  195.     def copy(self):
  196.         new = GIFImage(self.filename)
  197.         new.running = self.running
  198.         new.breakpoint = self.breakpoint
  199.         new.startpoint = self.startpoint
  200.         new.cur = self.cur
  201.         new.ptime = self.ptime
  202.         new.reversed = self.reversed
  203.         return new
  204.  
  205. def main():
  206.     pygame.init()
  207.     screen = pygame.display.set_mode((640, 480))
  208.  
  209.     hulk = GIFImage("F:\Programming\GIFImage\hulk.gif")
  210.     #football = GIFImage("F:\Programming\GIFImage\football.gif")
  211.     hulk2 = hulk.copy()
  212.     hulk2.reverse()
  213.     hulk3 = hulk.copy()
  214.     hulk3.set_bounds(0, 2)
  215.     #spiderman = GIFImage("F:\Programming\GIFImage\spiderman7.gif")
  216.  
  217.     while 1:
  218.         for event in pygame.event.get():
  219.             if event.type == QUIT:
  220.                 pygame.quit()
  221.                 return
  222.  
  223.         screen.fill((255,255,255))
  224.         hulk.render(screen, (50, 0))
  225.         hulk2.render(screen, (50, 150))
  226.         hulk3.render(screen, (50, 300))
  227.     #    football.render(screen, (200, 50))
  228.     #    spiderman.render(screen, (200, 150))
  229.         pygame.display.flip()
  230.  
  231. if __name__ == "__main__":
  232.     main()
Advertisement
Add Comment
Please, Sign In to add comment