PageRenderTime 19ms CodeModel.GetById 2ms app.highlight 14ms RepoModel.GetById 1ms app.codeStats 0ms

/Lib/plat-irix6/jpeg.py

http://unladen-swallow.googlecode.com/
Python | 114 lines | 97 code | 10 blank | 7 comment | 23 complexity | f77be9595bad234fffc279e0292ec33c MD5 | raw file
  1# Implement 'jpeg' interface using SGI's compression library
  2
  3# XXX Options 'smooth' and 'optimize' are ignored.
  4
  5# XXX It appears that compressing grayscale images doesn't work right;
  6# XXX the resulting file causes weirdness.
  7from warnings import warnpy3k
  8warnpy3k("the jpeg module has been removed in Python 3.0", stacklevel=2)
  9del warnpy3k
 10
 11class error(Exception):
 12    pass
 13
 14options = {'quality': 75, 'optimize': 0, 'smooth': 0, 'forcegray': 0}
 15
 16comp = None
 17decomp = None
 18
 19def compress(imgdata, width, height, bytesperpixel):
 20    global comp
 21    import cl
 22    if comp is None: comp = cl.OpenCompressor(cl.JPEG)
 23    if bytesperpixel == 1:
 24        format = cl.GRAYSCALE
 25    elif bytesperpixel == 4:
 26        format = cl.RGBX
 27    if options['forcegray']:
 28        iformat = cl.GRAYSCALE
 29    else:
 30        iformat = cl.YUV
 31    # XXX How to support 'optimize'?
 32    params = [cl.IMAGE_WIDTH, width, cl.IMAGE_HEIGHT, height,
 33              cl.ORIGINAL_FORMAT, format,
 34              cl.ORIENTATION, cl.BOTTOM_UP,
 35              cl.QUALITY_FACTOR, options['quality'],
 36              cl.INTERNAL_FORMAT, iformat,
 37             ]
 38    comp.SetParams(params)
 39    jpegdata = comp.Compress(1, imgdata)
 40    return jpegdata
 41
 42def decompress(jpegdata):
 43    global decomp
 44    import cl
 45    if decomp is None: decomp = cl.OpenDecompressor(cl.JPEG)
 46    headersize = decomp.ReadHeader(jpegdata)
 47    params = [cl.IMAGE_WIDTH, 0, cl.IMAGE_HEIGHT, 0, cl.INTERNAL_FORMAT, 0]
 48    decomp.GetParams(params)
 49    width, height, format = params[1], params[3], params[5]
 50    if format == cl.GRAYSCALE or options['forcegray']:
 51        format = cl.GRAYSCALE
 52        bytesperpixel = 1
 53    else:
 54        format = cl.RGBX
 55        bytesperpixel = 4
 56    # XXX How to support 'smooth'?
 57    params = [cl.ORIGINAL_FORMAT, format,
 58              cl.ORIENTATION, cl.BOTTOM_UP,
 59              cl.FRAME_BUFFER_SIZE, width*height*bytesperpixel]
 60    decomp.SetParams(params)
 61    imgdata = decomp.Decompress(1, jpegdata)
 62    return imgdata, width, height, bytesperpixel
 63
 64def setoption(name, value):
 65    if type(value) is not type(0):
 66        raise TypeError, 'jpeg.setoption: numeric options only'
 67    if name == 'forcegrey':
 68        name = 'forcegray'
 69    if not options.has_key(name):
 70        raise KeyError, 'jpeg.setoption: unknown option name'
 71    options[name] = int(value)
 72
 73def test():
 74    import sys
 75    if sys.argv[1:2] == ['-g']:
 76        del sys.argv[1]
 77        setoption('forcegray', 1)
 78    if not sys.argv[1:]:
 79        sys.argv.append('/usr/local/images/data/jpg/asterix.jpg')
 80    for file in sys.argv[1:]:
 81        show(file)
 82
 83def show(file):
 84    import gl, GL, DEVICE
 85    jpegdata = open(file, 'r').read()
 86    imgdata, width, height, bytesperpixel = decompress(jpegdata)
 87    gl.foreground()
 88    gl.prefsize(width, height)
 89    win = gl.winopen(file)
 90    if bytesperpixel == 1:
 91        gl.cmode()
 92        gl.pixmode(GL.PM_SIZE, 8)
 93        gl.gconfig()
 94        for i in range(256):
 95            gl.mapcolor(i, i, i, i)
 96    else:
 97        gl.RGBmode()
 98        gl.pixmode(GL.PM_SIZE, 32)
 99        gl.gconfig()
100    gl.qdevice(DEVICE.REDRAW)
101    gl.qdevice(DEVICE.ESCKEY)
102    gl.qdevice(DEVICE.WINQUIT)
103    gl.qdevice(DEVICE.WINSHUT)
104    gl.lrectwrite(0, 0, width-1, height-1, imgdata)
105    while 1:
106        dev, val = gl.qread()
107        if dev in (DEVICE.ESCKEY, DEVICE.WINSHUT, DEVICE.WINQUIT):
108            break
109        if dev == DEVICE.REDRAW:
110            gl.lrectwrite(0, 0, width-1, height-1, imgdata)
111    gl.winclose(win)
112    # Now test the compression and write the result to a fixed filename
113    newjpegdata = compress(imgdata, width, height, bytesperpixel)
114    open('/tmp/j.jpg', 'w').write(newjpegdata)