2
# The Python Imaging Library
5
# Adobe PSD 2.5/3.0 file handling
8
# 1995-09-01 fl Created
9
# 1997-01-03 fl Read most PSD images
10
# 1997-01-18 fl Fixed P and CMYK support
11
# 2001-10-21 fl Added seek/tell support (for layers)
13
# Copyright (c) 1997-2001 by Secret Labs AB.
14
# Copyright (c) 1995-2001 by Fredrik Lundh
16
# See the README file for information on usage and redistribution.
21
import Image, ImageFile, ImagePalette
24
# (photoshop mode, bits) -> (pil mode, required channels)
31
(7, 8): ("L", 1), # FIXME: multilayer
32
(8, 8): ("L", 1), # duotone
40
return ord(c[1]) + (ord(c[0])<<8)
43
return ord(c[3]) + (ord(c[2])<<8) + (ord(c[1])<<16) + (ord(c[0])<<24)
45
# --------------------------------------------------------------------.
49
return prefix[:4] == "8BPS"
52
# Image plugin for Photoshop images.
54
class PsdImageFile(ImageFile.ImageFile):
57
format_description = "Adobe Photoshop"
67
if s[:4] != "8BPS" or i16(s[4:]) != 1:
68
raise SyntaxError, "not a PSD file"
70
psd_bits = i16(s[22:])
71
psd_channels = i16(s[12:])
72
psd_mode = i16(s[24:])
74
mode, channels = MODES[(psd_mode, psd_bits)]
76
if channels > psd_channels:
77
raise IOError, "not enough channels"
80
self.size = i32(s[18:]), i32(s[14:])
88
if mode == "P" and size == 768:
89
self.palette = ImagePalette.raw("RGB;L", data)
99
end = self.fp.tell() + size
100
while self.fp.tell() < end:
103
name = read(ord(read(1)))
104
if not (len(name) & 1):
106
data = read(i32(read(4)))
109
self.resources.append((id, name, data))
110
if id == 1039: # ICC profile
111
self.info["icc_profile"] = data
114
# layer and mask information
120
end = self.fp.tell() + size
123
self.layers = _layerinfo(self.fp)
129
self.tile = _maketile(self.fp, mode, (0, 0) + self.size, channels)
135
def seek(self, layer):
136
# seek to given layer (1..max)
137
if layer == self.frame:
142
name, mode, bbox, tile = self.layers[layer-1]
149
raise EOFError, "no such layer"
152
# return layer number (0=image, 1..max=layers)
155
def load_prepare(self):
156
# create image memory if necessary
158
self.im.mode != self.mode or self.im.size != self.size:
159
self.im = Image.core.fill(self.mode, self.size, 0)
160
# create palette (optional)
162
Image.Image.load(self)
164
def _layerinfo(file):
165
# read layerinfo block
168
for i in range(abs(i16(read(2)))):
171
y0 = i32(read(4)); x0 = i32(read(4))
172
y1 = i32(read(4)); x1 = i32(read(4))
177
types = range(i16(read(2)))
191
info.append((m, size))
193
# figure out the image mode
197
elif mode == ["B", "G", "R"]:
199
elif mode == ["A", "B", "G", "R"]:
202
mode = None # unknown
204
# skip over blend flags and extra information
210
length = i32(read(4))
212
mask_y = i32(read(4)); mask_x = i32(read(4))
213
mask_h = i32(read(4)) - mask_y; mask_w = i32(read(4)) - mask_x
214
file.seek(length - 16, 1)
215
combined += length + 4
217
length = i32(read(4))
220
combined += length + 4
222
length = ord(read(1))
225
combined += length + 1
227
file.seek(size - combined, 1)
228
layers.append((name, mode, (x0, y0, x1, y1)))
232
for name, mode, bbox in layers:
235
t = _maketile(file, m, bbox, 1)
238
layers[i] = name, mode, bbox, tile
243
def _maketile(file, mode, bbox, channels):
248
compression = i16(read(2))
250
xsize = bbox[2] - bbox[0]
251
ysize = bbox[3] - bbox[1]
259
for channel in range(channels):
260
layer = mode[channel]
263
tile.append(("raw", bbox, offset, layer))
264
offset = offset + xsize*ysize
266
elif compression == 1:
268
# packbits compression
271
bytecount = read(channels * ysize * 2)
273
for channel in range(channels):
274
layer = mode[channel]
278
("packbits", bbox, offset, layer)
280
for y in range(ysize):
281
offset = offset + i16(bytecount[i:i+2])
291
# --------------------------------------------------------------------
294
Image.register_open("PSD", PsdImageFile, _accept)
296
Image.register_extension("PSD", ".psd")