| # Implement 'jpeg' interface using SGI's compression library | |
| # XXX Options 'smooth' and 'optimize' are ignored. | |
| # XXX It appears that compressing grayscale images doesn't work right; | |
| # XXX the resulting file causes weirdness. | |
| from warnings import warnpy3k | |
| warnpy3k("the jpeg module has been removed in Python 3.0", stacklevel=2) | |
| del warnpy3k | |
| class error(Exception): | |
| pass | |
| options = {'quality': 75, 'optimize': 0, 'smooth': 0, 'forcegray': 0} | |
| comp = None | |
| decomp = None | |
| def compress(imgdata, width, height, bytesperpixel): | |
| global comp | |
| import cl | |
| if comp is None: comp = cl.OpenCompressor(cl.JPEG) | |
| if bytesperpixel == 1: | |
| format = cl.GRAYSCALE | |
| elif bytesperpixel == 4: | |
| format = cl.RGBX | |
| if options['forcegray']: | |
| iformat = cl.GRAYSCALE | |
| else: | |
| iformat = cl.YUV | |
| # XXX How to support 'optimize'? | |
| params = [cl.IMAGE_WIDTH, width, cl.IMAGE_HEIGHT, height, \ | |
| cl.ORIGINAL_FORMAT, format, \ | |
| cl.ORIENTATION, cl.BOTTOM_UP, \ | |
| cl.QUALITY_FACTOR, options['quality'], \ | |
| cl.INTERNAL_FORMAT, iformat, \ | |
| ] | |
| comp.SetParams(params) | |
| jpegdata = comp.Compress(1, imgdata) | |
| return jpegdata | |
| def decompress(jpegdata): | |
| global decomp | |
| import cl | |
| if decomp is None: decomp = cl.OpenDecompressor(cl.JPEG) | |
| headersize = decomp.ReadHeader(jpegdata) | |
| params = [cl.IMAGE_WIDTH, 0, cl.IMAGE_HEIGHT, 0, cl.INTERNAL_FORMAT, 0] | |
| decomp.GetParams(params) | |
| width, height, format = params[1], params[3], params[5] | |
| if format == cl.GRAYSCALE or options['forcegray']: | |
| format = cl.GRAYSCALE | |
| bytesperpixel = 1 | |
| else: | |
| format = cl.RGBX | |
| bytesperpixel = 4 | |
| # XXX How to support 'smooth'? | |
| params = [cl.ORIGINAL_FORMAT, format, \ | |
| cl.ORIENTATION, cl.BOTTOM_UP, \ | |
| cl.FRAME_BUFFER_SIZE, width*height*bytesperpixel] | |
| decomp.SetParams(params) | |
| imgdata = decomp.Decompress(1, jpegdata) | |
| return imgdata, width, height, bytesperpixel | |
| def setoption(name, value): | |
| if type(value) is not type(0): | |
| raise TypeError, 'jpeg.setoption: numeric options only' | |
| if name == 'forcegrey': | |
| name = 'forcegray' | |
| if not options.has_key(name): | |
| raise KeyError, 'jpeg.setoption: unknown option name' | |
| options[name] = int(value) | |
| def test(): | |
| import sys | |
| if sys.argv[1:2] == ['-g']: | |
| del sys.argv[1] | |
| setoption('forcegray', 1) | |
| if not sys.argv[1:]: | |
| sys.argv.append('/usr/local/images/data/jpg/asterix.jpg') | |
| for file in sys.argv[1:]: | |
| show(file) | |
| def show(file): | |
| import gl, GL, DEVICE | |
| jpegdata = open(file, 'r').read() | |
| imgdata, width, height, bytesperpixel = decompress(jpegdata) | |
| gl.foreground() | |
| gl.prefsize(width, height) | |
| win = gl.winopen(file) | |
| if bytesperpixel == 1: | |
| gl.cmode() | |
| gl.pixmode(GL.PM_SIZE, 8) | |
| gl.gconfig() | |
| for i in range(256): | |
| gl.mapcolor(i, i, i, i) | |
| else: | |
| gl.RGBmode() | |
| gl.pixmode(GL.PM_SIZE, 32) | |
| gl.gconfig() | |
| gl.qdevice(DEVICE.REDRAW) | |
| gl.qdevice(DEVICE.ESCKEY) | |
| gl.qdevice(DEVICE.WINQUIT) | |
| gl.qdevice(DEVICE.WINSHUT) | |
| gl.lrectwrite(0, 0, width-1, height-1, imgdata) | |
| while 1: | |
| dev, val = gl.qread() | |
| if dev in (DEVICE.ESCKEY, DEVICE.WINSHUT, DEVICE.WINQUIT): | |
| break | |
| if dev == DEVICE.REDRAW: | |
| gl.lrectwrite(0, 0, width-1, height-1, imgdata) | |
| gl.winclose(win) | |
| # Now test the compression and write the result to a fixed filename | |
| newjpegdata = compress(imgdata, width, height, bytesperpixel) | |
| open('/tmp/j.jpg', 'w').write(newjpegdata) |