PsdImagePlugin.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. #
  2. # The Python Imaging Library
  3. # $Id$
  4. #
  5. # Adobe PSD 2.5/3.0 file handling
  6. #
  7. # History:
  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)
  12. #
  13. # Copyright (c) 1997-2001 by Secret Labs AB.
  14. # Copyright (c) 1995-2001 by Fredrik Lundh
  15. #
  16. # See the README file for information on usage and redistribution.
  17. #
  18. from __future__ import annotations
  19. import io
  20. from . import Image, ImageFile, ImagePalette
  21. from ._binary import i8
  22. from ._binary import i16be as i16
  23. from ._binary import i32be as i32
  24. from ._binary import si16be as si16
  25. MODES = {
  26. # (photoshop mode, bits) -> (pil mode, required channels)
  27. (0, 1): ("1", 1),
  28. (0, 8): ("L", 1),
  29. (1, 8): ("L", 1),
  30. (2, 8): ("P", 1),
  31. (3, 8): ("RGB", 3),
  32. (4, 8): ("CMYK", 4),
  33. (7, 8): ("L", 1), # FIXME: multilayer
  34. (8, 8): ("L", 1), # duotone
  35. (9, 8): ("LAB", 3),
  36. }
  37. # --------------------------------------------------------------------.
  38. # read PSD images
  39. def _accept(prefix):
  40. return prefix[:4] == b"8BPS"
  41. ##
  42. # Image plugin for Photoshop images.
  43. class PsdImageFile(ImageFile.ImageFile):
  44. format = "PSD"
  45. format_description = "Adobe Photoshop"
  46. _close_exclusive_fp_after_loading = False
  47. def _open(self):
  48. read = self.fp.read
  49. #
  50. # header
  51. s = read(26)
  52. if not _accept(s) or i16(s, 4) != 1:
  53. msg = "not a PSD file"
  54. raise SyntaxError(msg)
  55. psd_bits = i16(s, 22)
  56. psd_channels = i16(s, 12)
  57. psd_mode = i16(s, 24)
  58. mode, channels = MODES[(psd_mode, psd_bits)]
  59. if channels > psd_channels:
  60. msg = "not enough channels"
  61. raise OSError(msg)
  62. if mode == "RGB" and psd_channels == 4:
  63. mode = "RGBA"
  64. channels = 4
  65. self._mode = mode
  66. self._size = i32(s, 18), i32(s, 14)
  67. #
  68. # color mode data
  69. size = i32(read(4))
  70. if size:
  71. data = read(size)
  72. if mode == "P" and size == 768:
  73. self.palette = ImagePalette.raw("RGB;L", data)
  74. #
  75. # image resources
  76. self.resources = []
  77. size = i32(read(4))
  78. if size:
  79. # load resources
  80. end = self.fp.tell() + size
  81. while self.fp.tell() < end:
  82. read(4) # signature
  83. id = i16(read(2))
  84. name = read(i8(read(1)))
  85. if not (len(name) & 1):
  86. read(1) # padding
  87. data = read(i32(read(4)))
  88. if len(data) & 1:
  89. read(1) # padding
  90. self.resources.append((id, name, data))
  91. if id == 1039: # ICC profile
  92. self.info["icc_profile"] = data
  93. #
  94. # layer and mask information
  95. self.layers = []
  96. size = i32(read(4))
  97. if size:
  98. end = self.fp.tell() + size
  99. size = i32(read(4))
  100. if size:
  101. _layer_data = io.BytesIO(ImageFile._safe_read(self.fp, size))
  102. self.layers = _layerinfo(_layer_data, size)
  103. self.fp.seek(end)
  104. self.n_frames = len(self.layers)
  105. self.is_animated = self.n_frames > 1
  106. #
  107. # image descriptor
  108. self.tile = _maketile(self.fp, mode, (0, 0) + self.size, channels)
  109. # keep the file open
  110. self._fp = self.fp
  111. self.frame = 1
  112. self._min_frame = 1
  113. def seek(self, layer):
  114. if not self._seek_check(layer):
  115. return
  116. # seek to given layer (1..max)
  117. try:
  118. name, mode, bbox, tile = self.layers[layer - 1]
  119. self._mode = mode
  120. self.tile = tile
  121. self.frame = layer
  122. self.fp = self._fp
  123. return name, bbox
  124. except IndexError as e:
  125. msg = "no such layer"
  126. raise EOFError(msg) from e
  127. def tell(self):
  128. # return layer number (0=image, 1..max=layers)
  129. return self.frame
  130. def _layerinfo(fp, ct_bytes):
  131. # read layerinfo block
  132. layers = []
  133. def read(size):
  134. return ImageFile._safe_read(fp, size)
  135. ct = si16(read(2))
  136. # sanity check
  137. if ct_bytes < (abs(ct) * 20):
  138. msg = "Layer block too short for number of layers requested"
  139. raise SyntaxError(msg)
  140. for _ in range(abs(ct)):
  141. # bounding box
  142. y0 = i32(read(4))
  143. x0 = i32(read(4))
  144. y1 = i32(read(4))
  145. x1 = i32(read(4))
  146. # image info
  147. mode = []
  148. ct_types = i16(read(2))
  149. types = list(range(ct_types))
  150. if len(types) > 4:
  151. fp.seek(len(types) * 6 + 12, io.SEEK_CUR)
  152. size = i32(read(4))
  153. fp.seek(size, io.SEEK_CUR)
  154. continue
  155. for _ in types:
  156. type = i16(read(2))
  157. if type == 65535:
  158. m = "A"
  159. else:
  160. m = "RGBA"[type]
  161. mode.append(m)
  162. read(4) # size
  163. # figure out the image mode
  164. mode.sort()
  165. if mode == ["R"]:
  166. mode = "L"
  167. elif mode == ["B", "G", "R"]:
  168. mode = "RGB"
  169. elif mode == ["A", "B", "G", "R"]:
  170. mode = "RGBA"
  171. else:
  172. mode = None # unknown
  173. # skip over blend flags and extra information
  174. read(12) # filler
  175. name = ""
  176. size = i32(read(4)) # length of the extra data field
  177. if size:
  178. data_end = fp.tell() + size
  179. length = i32(read(4))
  180. if length:
  181. fp.seek(length - 16, io.SEEK_CUR)
  182. length = i32(read(4))
  183. if length:
  184. fp.seek(length, io.SEEK_CUR)
  185. length = i8(read(1))
  186. if length:
  187. # Don't know the proper encoding,
  188. # Latin-1 should be a good guess
  189. name = read(length).decode("latin-1", "replace")
  190. fp.seek(data_end)
  191. layers.append((name, mode, (x0, y0, x1, y1)))
  192. # get tiles
  193. for i, (name, mode, bbox) in enumerate(layers):
  194. tile = []
  195. for m in mode:
  196. t = _maketile(fp, m, bbox, 1)
  197. if t:
  198. tile.extend(t)
  199. layers[i] = name, mode, bbox, tile
  200. return layers
  201. def _maketile(file, mode, bbox, channels):
  202. tile = None
  203. read = file.read
  204. compression = i16(read(2))
  205. xsize = bbox[2] - bbox[0]
  206. ysize = bbox[3] - bbox[1]
  207. offset = file.tell()
  208. if compression == 0:
  209. #
  210. # raw compression
  211. tile = []
  212. for channel in range(channels):
  213. layer = mode[channel]
  214. if mode == "CMYK":
  215. layer += ";I"
  216. tile.append(("raw", bbox, offset, layer))
  217. offset = offset + xsize * ysize
  218. elif compression == 1:
  219. #
  220. # packbits compression
  221. i = 0
  222. tile = []
  223. bytecount = read(channels * ysize * 2)
  224. offset = file.tell()
  225. for channel in range(channels):
  226. layer = mode[channel]
  227. if mode == "CMYK":
  228. layer += ";I"
  229. tile.append(("packbits", bbox, offset, layer))
  230. for y in range(ysize):
  231. offset = offset + i16(bytecount, i)
  232. i += 2
  233. file.seek(offset)
  234. if offset & 1:
  235. read(1) # padding
  236. return tile
  237. # --------------------------------------------------------------------
  238. # registry
  239. Image.register_open(PsdImageFile.format, PsdImageFile, _accept)
  240. Image.register_extension(PsdImageFile.format, ".psd")
  241. Image.register_mime(PsdImageFile.format, "image/vnd.adobe.photoshop")