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

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.2)
  3.  
  4. __version__ = '0.7'
  5. import re
  6. import string
  7. import Image
  8. import ImageFile
  9. import ImagePalette
  10. COMMENT = 'Comment'
  11. DATE = 'Date'
  12. EQUIPMENT = 'Digitalization equipment'
  13. FRAMES = 'File size (no of images)'
  14. LUT = 'Lut'
  15. NAME = 'Name'
  16. SCALE = 'Scale (x,y)'
  17. SIZE = 'Image size (x*y)'
  18. MODE = 'Image type'
  19. TAGS = {
  20.     COMMENT: 0,
  21.     DATE: 0,
  22.     EQUIPMENT: 0,
  23.     FRAMES: 0,
  24.     LUT: 0,
  25.     NAME: 0,
  26.     SCALE: 0,
  27.     SIZE: 0,
  28.     MODE: 0 }
  29. OPEN = {
  30.     '0 1 image': ('1', '1'),
  31.     'L 1 image': ('1', '1'),
  32.     'Greyscale image': ('L', 'L'),
  33.     'Grayscale image': ('L', 'L'),
  34.     'RGB image': ('RGB', 'RGB;L'),
  35.     'RLB image': ('RGB', 'RLB'),
  36.     'RYB image': ('RGB', 'RLB'),
  37.     'B1 image': ('1', '1'),
  38.     'B2 image': ('P', 'P;2'),
  39.     'B4 image': ('P', 'P;4'),
  40.     'X 24 image': ('RGB', 'RGB'),
  41.     'L 32 S image': ('I', 'I;32'),
  42.     'L 32 F image': ('F', 'F;32'),
  43.     'RGB3 image': ('RGB', 'RGB;T'),
  44.     'RYB3 image': ('RGB', 'RYB;T'),
  45.     'RGBA image': ('RGBA', 'RGBA;L'),
  46.     'RGBX image': ('RGBX', 'RGBX;L'),
  47.     'CMYK image': ('CMYK', 'CMYK;L'),
  48.     'YCC image': ('YCbCr', 'YCbCr;L') }
  49. for i in [
  50.     '8',
  51.     '8S',
  52.     '16',
  53.     '16S',
  54.     '32',
  55.     '32F']:
  56.     OPEN['L %s image' % i] = ('F', 'F;%s' % i)
  57.     OPEN['L*%s image' % i] = ('F', 'F;%s' % i)
  58.  
  59. for i in [
  60.     '16',
  61.     '16B']:
  62.     OPEN['L %s image' % i] = ('I;%s' % i, 'I;%s' % i)
  63.     OPEN['L*%s image' % i] = ('I;%s' % i, 'I;%s' % i)
  64.  
  65. for i in [
  66.     '32S']:
  67.     OPEN['L %s image' % i] = ('I', 'I;%s' % i)
  68.     OPEN['L*%s image' % i] = ('I', 'I;%s' % i)
  69.  
  70. for i in range(2, 33):
  71.     OPEN['L*%s image' % i] = ('F', 'F;%s' % i)
  72.  
  73. split = re.compile('^([A-Za-z][^:]*):[ \\t]*(.*)[ \\t]*$')
  74.  
  75. class ImImageFile(ImageFile.ImageFile):
  76.     format = 'IM'
  77.     format_description = 'IFUNC Image Memory'
  78.     
  79.     def _open(self):
  80.         if not ('\n' in self.fp.read(100)):
  81.             raise SyntaxError, 'not an IM file'
  82.         
  83.         self.fp.seek(0)
  84.         n = 0
  85.         self.info[MODE] = 'L'
  86.         self.info[SIZE] = (512, 512)
  87.         self.info[FRAMES] = 1
  88.         self.rawmode = 'L'
  89.         while 1:
  90.             s = self.fp.read(1)
  91.             if s == '\r':
  92.                 continue
  93.             
  94.             if not s and s[0] == chr(0) or s[0] == chr(26):
  95.                 break
  96.             
  97.             s = s + self.fp.readline()
  98.             if len(s) > 100:
  99.                 raise SyntaxError, 'not an IM file'
  100.             
  101.             if s[-2:] == '\r\n':
  102.                 s = s[:-2]
  103.             elif s[-1:] == '\n':
  104.                 s = s[:-1]
  105.             
  106.             
  107.             try:
  108.                 m = split.match(s)
  109.             except re.error:
  110.                 v = None
  111.                 raise SyntaxError, 'not an IM file'
  112.  
  113.             if m:
  114.                 (k, v) = m.group(1, 2)
  115.                 if k in [
  116.                     FRAMES,
  117.                     SCALE,
  118.                     SIZE]:
  119.                     i = string.find(v, '*')
  120.                     if i >= 0:
  121.                         v = v[:i] + ',' + v[i + 1:]
  122.                     
  123.                     v = eval(v)
  124.                 elif k == MODE and OPEN.has_key(v):
  125.                     (v, self.rawmode) = OPEN[v]
  126.                 
  127.                 if k == COMMENT:
  128.                     if self.info.has_key(k):
  129.                         self.info[k].append(v)
  130.                     else:
  131.                         self.info[k] = [
  132.                             v]
  133.                 else:
  134.                     self.info[k] = v
  135.                 if TAGS.has_key(k):
  136.                     n = n + 1
  137.                 
  138.             else:
  139.                 raise SyntaxError, 'Syntax error in IM header: ' + s
  140.         if not n:
  141.             raise SyntaxError, 'Not an IM file'
  142.         
  143.         self.size = self.info[SIZE]
  144.         self.mode = self.info[MODE]
  145.         while s and s[0] != chr(26):
  146.             s = self.fp.read(1)
  147.         if not s:
  148.             raise SyntaxError, 'File truncated'
  149.         
  150.         if self.info.has_key(LUT):
  151.             palette = self.fp.read(768)
  152.             greyscale = 1
  153.             linear = 1
  154.             for i in range(256):
  155.                 if palette[i + 256] == palette[i + 256]:
  156.                     pass
  157.                 elif palette[i + 256] == palette[i + 512]:
  158.                     if palette[i] != chr(i):
  159.                         linear = 0
  160.                     
  161.                 else:
  162.                     greyscale = 0
  163.             
  164.             if self.mode == 'L':
  165.                 if greyscale:
  166.                     if not linear:
  167.                         self.lut = map(ord, palette[:256])
  168.                     
  169.                 else:
  170.                     self.mode = self.rawmode = 'P'
  171.                     self.palette = ImagePalette.raw('RGB;L', palette)
  172.             elif self.mode == 'RGB':
  173.                 if not greyscale or not linear:
  174.                     self.lut = map(ord, palette)
  175.                 
  176.             
  177.         
  178.         self.frame = 0
  179.         self._ImImageFile__offset = offs = self.fp.tell()
  180.         self._ImImageFile__fp = self.fp
  181.         if self.rawmode[:2] == 'F;':
  182.             
  183.             try:
  184.                 bits = int(self.rawmode[2:])
  185.                 if bits not in [
  186.                     8,
  187.                     16,
  188.                     32]:
  189.                     self.tile = [
  190.                         ('bit', (0, 0) + self.size, offs, (bits, 8, 3, 0, -1))]
  191.                     return None
  192.             except ValueError:
  193.                 pass
  194.  
  195.         
  196.         if self.rawmode in [
  197.             'RGB;T',
  198.             'RYB;T']:
  199.             size = self.size[0] * self.size[1]
  200.             self.tile = [
  201.                 ('raw', (0, 0) + self.size, offs, ('G', 0, -1)),
  202.                 ('raw', (0, 0) + self.size, offs + size, ('R', 0, -1)),
  203.                 ('raw', (0, 0) + self.size, offs + 2 * size, ('B', 0, -1))]
  204.         else:
  205.             self.tile = [
  206.                 ('raw', (0, 0) + self.size, offs, (self.rawmode, 0, -1))]
  207.  
  208.     
  209.     def seek(self, frame):
  210.         if frame < 0 or frame >= self.info[FRAMES]:
  211.             raise EOFError, 'seek outside sequence'
  212.         
  213.         if self.frame == frame:
  214.             return None
  215.         
  216.         self.frame = frame
  217.         if self.mode == '1':
  218.             bits = 1
  219.         else:
  220.             bits = 8 * len(self.mode)
  221.         size = ((self.size[0] * bits + 7) / 8) * self.size[1]
  222.         offs = self._ImImageFile__offset + frame * size
  223.         self.fp = self._ImImageFile__fp
  224.         self.tile = [
  225.             ('raw', (0, 0) + self.size, offs, (self.rawmode, 0, -1))]
  226.  
  227.     
  228.     def tell(self):
  229.         return self.frame
  230.  
  231.  
  232. SAVE = {
  233.     '1': ('0 1', '1'),
  234.     'L': ('Greyscale', 'L'),
  235.     'P': ('Greyscale', 'P'),
  236.     'I': ('L 32S', 'I;32S'),
  237.     'I;16': ('L 16', 'I;16'),
  238.     'I;16B': ('L 16B', 'I;16B'),
  239.     'F': ('L 32F', 'F;32F'),
  240.     'RGB': ('RGB', 'RGB;L'),
  241.     'RGBA': ('RGBA', 'RGBA;L'),
  242.     'RGBX': ('RGBX', 'RGBX;L'),
  243.     'CMYK': ('CMYK', 'CMYK;L'),
  244.     'YCbCr': ('YCC', 'YCbCr;L') }
  245.  
  246. def _save(im, fp, filename, check = 0):
  247.     
  248.     try:
  249.         (type, rawmode) = SAVE[im.mode]
  250.     except KeyError:
  251.         raise ValueError, 'Cannot save %s images as IM' % im.mode
  252.  
  253.     
  254.     try:
  255.         frames = im.encoderinfo['frames']
  256.     except KeyError:
  257.         frames = 1
  258.  
  259.     if check:
  260.         return check
  261.     
  262.     fp.write('Image type: %s image\r\n' % type)
  263.     if filename:
  264.         fp.write('Name: %s\r\n' % filename)
  265.     
  266.     fp.write('Image size (x*y): %d*%d\r\n' % im.size)
  267.     fp.write('File size (no of images): %d\r\n' % frames)
  268.     if im.mode == 'P':
  269.         fp.write('Lut: 1\r\n')
  270.     
  271.     fp.write('\x00' * (511 - fp.tell()) + '\x1a')
  272.     if im.mode == 'P':
  273.         fp.write(im.im.getpalette('RGB', 'RGB;L'))
  274.     
  275.     ImageFile._save(im, fp, [
  276.         ('raw', (0, 0) + im.size, 0, (rawmode, 0, -1))])
  277.  
  278. Image.register_open('IM', ImImageFile)
  279. Image.register_save('IM', _save)
  280. Image.register_extension('IM', '.im')
  281.