2
# The Python Imaging Library.
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()
13
# Copyright (c) 1997-2001 by Secret Labs AB
14
# Copyright (c) 1996-1997 by Fredrik Lundh
16
# See the README file for information on usage and redistribution.
20
import Image, ImageColor
23
# Colour palette wrapper for palette mapped images.
26
"Colour palette for palette mapped images"
28
def __init__(self, mode = "RGB", palette = None):
30
self.rawmode = None # if set, palette contains raw data
31
self.palette = palette or range(256)*len(self.mode)
34
if len(self.mode)*256 != len(self.palette):
35
raise ValueError, "wrong palette size"
38
# experimental: get palette contents in format suitable
39
# for the low-level im.putpalette primitive
41
return self.rawmode, self.palette
42
return self.mode + ";L", self.tostring()
45
# experimental: convert palette to string
47
raise ValueError("palette contains raw palette data")
48
if Image.isStringType(self.palette):
50
return array.array("B", self.palette).tostring()
52
def getcolor(self, color):
53
# experimental: given an rgb tuple, allocate palette entry
55
raise ValueError("palette contains raw palette data")
56
if Image.isTupleType(color):
58
return self.colors[color]
60
# allocate new color slot
61
if Image.isStringType(self.palette):
62
self.palette = map(int, self.palette)
63
index = len(self.colors)
65
raise ValueError("cannot allocate more than 256 colors")
66
self.colors[color] = index
67
self.palette[index] = color[0]
68
self.palette[index+256] = color[1]
69
self.palette[index+512] = color[2]
73
raise ValueError("unknown color specifier: %r" % color)
76
# (experimental) save palette to text file
78
raise ValueError("palette contains raw palette data")
79
if type(fp) == type(""):
81
fp.write("# Palette\n")
82
fp.write("# Mode: %s\n" % self.mode)
85
for j in range(i, len(self.palette), 256):
86
fp.write(" %d" % self.palette[j])
90
# --------------------------------------------------------------------
93
def raw(rawmode, data):
94
palette = ImagePalette()
95
palette.rawmode = rawmode
96
palette.palette = data
100
# --------------------------------------------------------------------
103
def _make_linear_lut(black, white):
107
lut.append(white*i/255)
109
raise NotImplementedError # FIXME
112
def _make_gamma_lut(exp, mode="RGB"):
115
lut.append(int(((i / 255.0) ** exp) * 255.0 + 0.5))
119
return Image.core.new_palette(mode, data)
121
def negative(mode="RGB"):
124
return ImagePalette(mode, palette * len(mode))
126
def random(mode="RGB"):
127
from random import randint
129
for i in range(256*len(mode)):
130
palette.append(randint(0, 255))
131
return ImagePalette(mode, palette)
133
def sepia(white="#fff0c0"):
134
r, g, b = ImageColor.getrgb(white)
135
r = _make_linear_lut(0, r)
136
g = _make_linear_lut(0, g)
137
b = _make_linear_lut(0, b)
138
return ImagePalette("RGB", r + g + b)
140
def wedge(mode="RGB"):
141
return ImagePalette(mode, range(256) * len(mode))
145
# FIXME: supports GIMP gradients only
147
fp = open(filename, "rb")
153
import GimpPaletteFile
155
p = GimpPaletteFile.GimpPaletteFile(fp)
157
except (SyntaxError, ValueError):
162
import GimpGradientFile
164
p = GimpGradientFile.GimpGradientFile(fp)
166
except (SyntaxError, ValueError):
173
p = PaletteFile.PaletteFile(fp)
175
except (SyntaxError, ValueError):
179
raise IOError, "cannot load palette"
181
return lut # data, rawmode
184
# add some psuedocolour palettes as well