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 / BmpImagePlugin.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2001-12-25  |  6KB  |  148 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.2)
  3.  
  4. __version__ = '0.5'
  5. import string
  6. import Image
  7. import ImageFile
  8. import ImagePalette
  9.  
  10. def i16(c):
  11.     return ord(c[0]) + (ord(c[1]) << 8)
  12.  
  13.  
  14. def i32(c):
  15.     return ord(c[0]) + (ord(c[1]) << 8) + (ord(c[2]) << 16) + (ord(c[3]) << 24)
  16.  
  17. BIT2MODE = {
  18.     1: ('P', '1'),
  19.     4: ('P', 'P;4'),
  20.     8: ('P', 'P'),
  21.     24: ('RGB', 'BGR') }
  22.  
  23. def _accept(prefix):
  24.     return prefix[:2] == 'BM'
  25.  
  26.  
  27. class BmpImageFile(ImageFile.ImageFile):
  28.     format = 'BMP'
  29.     format_description = 'Windows Bitmap'
  30.     
  31.     def _bitmap(self, header = 0, offset = 0):
  32.         if header:
  33.             self.fp.seek(header)
  34.         
  35.         s = self.fp.read(4)
  36.         s = s + self.fp.read(i32(s) - 4)
  37.         if len(s) == 12:
  38.             bits = i16(s[10:])
  39.             self.size = (i16(s[4:]), i16(s[6:]))
  40.             lutsize = 3
  41.             colors = 0
  42.         elif len(s) in [
  43.             40,
  44.             64]:
  45.             bits = i16(s[14:])
  46.             self.size = (i32(s[4:]), i32(s[8:]))
  47.             self.info['compression'] = i32(s[16:])
  48.             lutsize = 4
  49.             colors = i32(s[32:])
  50.         else:
  51.             raise IOError, 'Unknown BMP header type'
  52.         if not colors:
  53.             colors = 1 << bits
  54.         
  55.         
  56.         try:
  57.             (self.mode, rawmode) = BIT2MODE[bits]
  58.         except KeyError:
  59.             raise IOError, 'Unsupported BMP pixel depth'
  60.  
  61.         if self.mode == 'P':
  62.             palette = []
  63.             greyscale = 1
  64.             if colors == 2:
  65.                 indices = (0, 255)
  66.             else:
  67.                 indices = range(colors)
  68.             for i in indices:
  69.                 rgb = self.fp.read(lutsize)[:3]
  70.                 if rgb != chr(i) * 3:
  71.                     greyscale = 0
  72.                 
  73.                 palette.append(rgb)
  74.             
  75.             if greyscale:
  76.                 if colors == 2:
  77.                     self.mode = '1'
  78.                 else:
  79.                     self.mode = rawmode = 'L'
  80.             else:
  81.                 self.mode = 'P'
  82.                 self.palette = ImagePalette.raw('BGR', string.join(palette, ''))
  83.         
  84.         if not offset:
  85.             offset = self.fp.tell()
  86.         
  87.         self.tile = [
  88.             ('raw', (0, 0) + self.size, offset, (rawmode, self.size[0] * bits + 31 >> 3 & -4, -1))]
  89.  
  90.     
  91.     def _open(self):
  92.         s = self.fp.read(14)
  93.         if s[:2] != 'BM':
  94.             raise SyntaxError, 'Not a BMP file'
  95.         
  96.         offset = i32(s[10:])
  97.         self._bitmap()
  98.  
  99.  
  100.  
  101. def o16(i):
  102.     return chr(i & 255) + chr(i >> 8 & 255)
  103.  
  104.  
  105. def o32(i):
  106.     return chr(i & 255) + chr(i >> 8 & 255) + chr(i >> 16 & 255) + chr(i >> 24 & 255)
  107.  
  108. SAVE = {
  109.     '1': ('1', 1, 2),
  110.     'L': ('L', 8, 256),
  111.     'P': ('P', 8, 256),
  112.     'RGB': ('BGR', 24, 0) }
  113.  
  114. def _save(im, fp, filename, check = 0):
  115.     
  116.     try:
  117.         (rawmode, bits, colors) = SAVE[im.mode]
  118.     except KeyError:
  119.         raise IOError, 'cannot write mode %s as BMP' % im.mode
  120.  
  121.     if check:
  122.         return check
  123.     
  124.     stride = (im.size[0] * bits + 7) / 8 + 3 & -4
  125.     header = 40
  126.     offset = 14 + header + colors * 4
  127.     image = stride * im.size[1]
  128.     fp.write('BM' + o32(offset + image) + o32(0) + o32(offset))
  129.     fp.write(o32(header) + o32(im.size[0]) + o32(im.size[1]) + o16(1) + o16(bits) + o32(0) + o32(image) + o32(1) + o32(1) + o32(colors) + o32(colors))
  130.     fp.write('\x00' * (header - 40))
  131.     if im.mode == '1':
  132.         for i in (0, 255):
  133.             fp.write(chr(i) * 4)
  134.         
  135.     elif im.mode == 'L':
  136.         for i in range(256):
  137.             fp.write(chr(i) * 4)
  138.         
  139.     elif im.mode == 'P':
  140.         fp.write(im.im.getpalette('RGB', 'BGRX'))
  141.     
  142.     ImageFile._save(im, fp, [
  143.         ('raw', (0, 0) + im.size, 0, (rawmode, stride, -1))])
  144.  
  145. Image.register_open(BmpImageFile.format, BmpImageFile, _accept)
  146. Image.register_save(BmpImageFile.format, _save)
  147. Image.register_extension(BmpImageFile.format, '.bmp')
  148.