home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pypil112.zip / PIL-1.1.2.zip / Lib / site-packages / PIL / ImagePalette.py < prev    next >
Text File  |  2001-05-03  |  3KB  |  116 lines

  1. #
  2. # The Python Imaging Library.
  3. # $Id$
  4. #
  5. # image palette object
  6. #
  7. # History:
  8. # 1996-03-11 fl   Rewritten.
  9. # 1997-01-03 fl   Up and running.
  10. # 1997-08-23 fl   Added load hack
  11. # 2001-04-16 fl   Fixed randint shadow bug in random()
  12. #
  13. # Copyright (c) 1997-2001 by Secret Labs AB
  14. # Copyright (c) 1996-1997 by Fredrik Lundh
  15. #
  16. # See the README file for information on usage and redistribution.
  17. #
  18.  
  19. import array
  20. import Image
  21.  
  22. class ImagePalette:
  23.     "Colour palette for palette mapped images"
  24.  
  25.     def __init__(self, mode = "RGB", palette = None):
  26.         self.mode = mode
  27.         self.palette = palette or range(256)*len(self.mode)
  28.         if len(self.mode)*256 != len(self.palette):
  29.             raise ValueError, "wrong palette size"
  30.  
  31.     def tostring(self):
  32.         return array.array("b", self.palette).tostring()
  33.  
  34.     def save(self, fp):
  35.         if type(fp) == type(""):
  36.             fp = open(fp, "w")
  37.         fp.write("# Palette\n")
  38.         fp.write("# Mode: %s\n" % self.mode)
  39.         for i in range(256):
  40.             fp.write("%d" % i)
  41.             for j in range(i, len(self.palette), 256):
  42.                 fp.write(" %d" % self.palette[j])
  43.             fp.write("\n")
  44.         fp.close()
  45.  
  46. # --------------------------------------------------------------------
  47. # Internal
  48.  
  49. class raw:
  50.     def __init__(self, rawmode, data):
  51.         self.rawmode = rawmode
  52.         self.data = data
  53.  
  54. # --------------------------------------------------------------------
  55. # Factories
  56.  
  57. def new(mode, data):
  58.     Image.core.new_palette(mode, data)
  59.  
  60. def negative(mode = "RGB"):
  61.     palette = range(256)
  62.     palette.reverse()
  63.     return ImagePalette(mode, palette * len(mode))
  64.  
  65. def random(mode = "RGB"):
  66.     from random import randint
  67.     palette = map(lambda a, randint=randint:
  68.                   randint(0, 255), [0]*256*len(mode))
  69.     return ImagePalette(mode, palette)
  70.  
  71. def wedge(mode = "RGB"):
  72.     return ImagePalette(mode, range(256) * len(mode))
  73.  
  74. def load(filename):
  75.  
  76.     # FIXME: supports GIMP gradients only
  77.  
  78.     fp = open(filename, "rb")
  79.  
  80.     lut = None
  81.  
  82.     if not lut:
  83.         try:
  84.             import GimpPaletteFile
  85.             fp.seek(0)
  86.             p = GimpPaletteFile.GimpPaletteFile(fp)
  87.             lut = p.getpalette()
  88.         except (SyntaxError, ValueError):
  89.             pass
  90.  
  91.     if not lut:
  92.         try:
  93.             import GimpGradientFile
  94.             fp.seek(0)
  95.             p = GimpGradientFile.GimpGradientFile(fp)
  96.             lut = p.getpalette()
  97.         except (SyntaxError, ValueError):
  98.             pass
  99.  
  100.     if not lut:
  101.         try:
  102.             import PaletteFile
  103.             fp.seek(0)
  104.             p = PaletteFile.PaletteFile(fp)
  105.             lut = p.getpalette()
  106.         except (SyntaxError, ValueError):
  107.             pass
  108.  
  109.     if not lut:
  110.         raise IOError, "cannot load palette"
  111.  
  112.     return lut # data, rawmode
  113.  
  114.  
  115. # add some psuedocolour palettes as well
  116.