|
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. |
|
7 from warnings import warnpy3k |
|
8 warnpy3k("the jpeg module has been removed in Python 3.0", stacklevel=2) |
|
9 del warnpy3k |
|
10 |
|
11 class error(Exception): |
|
12 pass |
|
13 |
|
14 options = {'quality': 75, 'optimize': 0, 'smooth': 0, 'forcegray': 0} |
|
15 |
|
16 comp = None |
|
17 decomp = None |
|
18 |
|
19 def 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 |
|
42 def 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 |
|
64 def 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 |
|
73 def 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 |
|
83 def 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) |