blob: 944ce930e1e92d17cbd6ca8b97e4c2769ed81694 [file] [log] [blame]
Guido van Rossum70f14181993-12-29 16:35:41 +00001# 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.
Brett Cannon89f5d9c2008-05-15 03:44:00 +00007from warnings import warnpy3k
8warnpy3k("the jpeg module has been removed in Python 3.0", stacklevel=2)
9del warnpy3k
Guido van Rossum70f14181993-12-29 16:35:41 +000010
Fred Drakedef00382000-08-18 14:59:33 +000011class error(Exception):
Tim Peters182b5ac2004-07-18 06:16:08 +000012 pass
Guido van Rossum70f14181993-12-29 16:35:41 +000013
14options = {'quality': 75, 'optimize': 0, 'smooth': 0, 'forcegray': 0}
15
16comp = None
17decomp = None
18
19def compress(imgdata, width, height, bytesperpixel):
Tim Peters182b5ac2004-07-18 06:16:08 +000020 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
Guido van Rossum70f14181993-12-29 16:35:41 +000041
42def decompress(jpegdata):
Tim Peters182b5ac2004-07-18 06:16:08 +000043 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
Guido van Rossum70f14181993-12-29 16:35:41 +000063
64def setoption(name, value):
Tim Peters182b5ac2004-07-18 06:16:08 +000065 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)
Guido van Rossum70f14181993-12-29 16:35:41 +000072
73def test():
Tim Peters182b5ac2004-07-18 06:16:08 +000074 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)
Guido van Rossum70f14181993-12-29 16:35:41 +000082
83def show(file):
Tim Peters182b5ac2004-07-18 06:16:08 +000084 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)