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) 115