From jef.mangelschots@invensys.com Thu Apr 3 18:47:13 2003 From: jef.mangelschots@invensys.com (jef.mangelschots@invensys.com) Date: Thu, 3 Apr 2003 10:47:13 -0800 Subject: [Image-SIG] installation problem Message-ID: I have a problem installing PIL (typicall for a newbee) I have installed Python 2.2.1 in c:\python22 using ActiveState's ActivePython-2.2.1-222.msi I have downloaded PIL version 1.2 (py22b1-pil-1.1.2-20011022.exe) and ran the installation. Everything was ok. It installed PIL in C:\Py22 I followed the instruction from ReportLab to copy the files in c:\py22\DLLs into c:\python22\DLLs these were the files _imaging.pyd and _imagingtk.pyd (there were no other files) I tested whether the operation was ok with ">>>from PIL import Image" but got the following error message: "ImportError: No module named PIL" I also tried: ">>>import Image" I got the following error message: "ImportError: No module named Image" I then tried ">>>import _imaging" and got the following response (I started python with parameter -v): import _imaging # dynamically loaded from c:\python22\DLLs\_imaging.pyd I assume I am missing some libraries or DLL's or am having the wrong ones. Who knows what I am doing wrong ? Regards Jef mangelschots From jmhodge@bgnet.bgsu.edu Thu Apr 3 19:31:50 2003 From: jmhodge@bgnet.bgsu.edu (Jeff Hodges) Date: 03 Apr 2003 14:31:50 -0500 Subject: [Image-SIG] compile errors Message-ID: <1049398310.26926.7.camel@Gecko> When I attempt to install PIL on my box it fails on compilation. I'm running gcc 3.2.2 glibc 2.3.2, tcl/tk 8.4.2 and python 2.2 (of course). Here are the errors. building '_imagingtk' extension Tk/tkImaging.c: In function `PyImagingPhoto': Tk/tkImaging.c:165: too few arguments to function `Tk_PhotoPutBlock' Tk/tkImaging.c:175: too few arguments to function `Tk_PhotoPutBlock' Tk/tkImaging.c:182: too few arguments to function `Tk_PhotoPutBlock' Tk/tkImaging.c: In function `TkImaging_Init': Tk/tkImaging.c:192: warning: passing arg 3 of `Tcl_CreateCommand' from incompatible pointer type gcc -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fPIC -IlibImaging -I/usr/include/python2.2 -c _imagingtk.c -o build/temp.linux-i686-2.2/_imagingtk.o -O3 -mcpu=athlon-tbird -march=athlon-tbird -funroll-loops gcc -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fPIC -IlibImaging -I/usr/include/python2.2 -c Tk/tkImaging.c -o build/temp.linux-i686-2.2/tkImaging.o -O3 -mcpu=athlon-tbird -march=athlon-tbird -funroll-loops error: command 'gcc' failed with exit status 1 What the heck did i do wrong? :) all it did was python setup.py install. Thanks! -- Jeff From jmhodge@bgnet.bgsu.edu Thu Apr 3 19:41:07 2003 From: jmhodge@bgnet.bgsu.edu (Jeff Hodges) Date: 03 Apr 2003 14:41:07 -0500 Subject: [Image-SIG] Re: compile errors Message-ID: <1049398864.26926.13.camel@Gecko> Um.. im an idiot, i meant i just did a straight ./configure, make, cd .., python setup.py build and it failed on the build From schutte@fel.tno.nl Fri Apr 4 06:45:43 2003 From: schutte@fel.tno.nl (K Schutte) Date: Fri, 04 Apr 2003 08:45:43 +0200 Subject: [Image-SIG] installation problem References: Message-ID: <3E8D2A17.4386955A@fel.tno.nl> Except .dll files there also should be .py files in the PIL distribution. Place those files at a place where python looks for them; that is in PYTHONPATH (set in environment) and in standard locations. For my python22 distribution this is in c:\Python22\Lib\site-packages. Given what you describe it is my guess that it works when you move the stuff in c:\Py22\Lib to c:\python22\lib. Good luck, Klamer jef.mangelschots@invensys.com wrote: > > I have a problem installing PIL (typicall for a newbee) > > I have installed Python 2.2.1 in c:\python22 using ActiveState's > ActivePython-2.2.1-222.msi > > I have downloaded PIL version 1.2 (py22b1-pil-1.1.2-20011022.exe) and ran > the installation. Everything was ok. It installed PIL in C:\Py22 > > I followed the instruction from ReportLab to copy the files in c:\py22\DLLs > into c:\python22\DLLs > these were the files _imaging.pyd and _imagingtk.pyd (there were no other > files) > > I tested whether the operation was ok with ">>>from PIL import Image" > but got the following error message: "ImportError: No module named PIL" > > I also tried: ">>>import Image" > I got the following error message: "ImportError: No module named Image" > > I then tried ">>>import _imaging" > and got the following response (I started python with parameter -v): > import _imaging # dynamically loaded from c:\python22\DLLs\_imaging.pyd > > I assume I am missing some libraries or DLL's or am having the wrong ones. > Who knows what I am doing wrong ? > > Regards > Jef mangelschots > > _______________________________________________ > Image-SIG maillist - Image-SIG@python.org > http://mail.python.org/mailman/listinfo/image-sig -- Klamer Schutte, E-mail: Schutte@fel.tno.nl Electro-Optical Systems, TNO Physics and Electronics Laboratory Tel: +31-70-3740469 -- Fax: +31-70-3740654 -- Mobile: +31-6-51316671 From fredrik@pythonware.com Fri Apr 4 09:36:25 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Fri, 4 Apr 2003 11:36:25 +0200 Subject: [Image-SIG] Re: compile errors References: <1049398310.26926.7.camel@Gecko> Message-ID: Jeff Hodges wrote: > When I attempt to install PIL on my box it fails on compilation. I'm > running gcc 3.2.2 glibc 2.3.2, tcl/tk 8.4.2 and python 2.2 (of course). > Here are the errors. > > building '_imagingtk' extension > Tk/tkImaging.c: In function `PyImagingPhoto': > Tk/tkImaging.c:165: too few arguments to function `Tk_PhotoPutBlock' > Tk/tkImaging.c:175: too few arguments to function `Tk_PhotoPutBlock' > Tk/tkImaging.c:182: too few arguments to function `Tk_PhotoPutBlock' > Tk/tkImaging.c: In function `TkImaging_Init': > Tk/tkImaging.c:192: warning: passing arg 3 of `Tcl_CreateCommand' from > incompatible pointer type > gcc -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fPIC -IlibImaging > -I/usr/include/python2.2 -c _imagingtk.c -o > build/temp.linux-i686-2.2/_imagingtk.o -O3 -mcpu=athlon-tbird > -march=athlon-tbird -funroll-loops > gcc -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fPIC -IlibImaging > -I/usr/include/python2.2 -c Tk/tkImaging.c -o > build/temp.linux-i686-2.2/tkImaging.o -O3 -mcpu=athlon-tbird > -march=athlon-tbird -funroll-loops > error: command 'gcc' failed with exit status 1 > > What the heck did i do wrong? :) all it did was python setup.py > install. Thanks! the Tk folks have changed the Tk_PhotoPutBlock interface in 8.4.x. to fix this, you have to add a TK_PHOTO_COMPOSITE_OVERLAY parameter to all three Tk_PhotoPutBlock calls in tkImaging.c. to make it work under older versions as well, change all Tk_PhotoPutBlock(...); calls to Tk_PhotoPutBlock(... #if (TK_MAJOR_VERSION == 8 && TK_MINOR_VERSION >= 4 || TK_MAJOR_VERSION > 8) , TK_PHOTO_COMPOSITE_OVERLAY #endif ); (untested) alternatively (but also untested), you can add a #define USE_COMPOSITELESS_PHOTO_PUT_BLOCK to the top of the file (before including the Tcl and Tk libraries) From jef.mangelschots@invensys.com Fri Apr 4 20:59:45 2003 From: jef.mangelschots@invensys.com (jef.mangelschots@invensys.com) Date: Fri, 4 Apr 2003 12:59:45 -0800 Subject: FW: [Image-SIG] installation problem Message-ID: Package Manager works great, but is there any documentation with the packages you install ? if so, where do I find how to use them ? Regards Jef -------------------------------------------------------------------------------------------------- Jef Mangelschots Voice: (909) 987-4673 Ext.212 Design Engineer Fax: (909) 606-2557 Web: http://www.safetran.com/ Email: jef.mangelschots@invensys.com |---------+----------------------------> | | Jef Mangelschots | | | | | | 04/04/2003 12:42 | | | PM | | | | |---------+----------------------------> >--------------------------------------------------------------------------------------------------------------------------------------------------| | | | To: | | cc: | | Subject: Re: FW: [Image-SIG] installation problem(Document link: Jef Mangelschots) | >--------------------------------------------------------------------------------------------------------------------------------------------------| this works great. thanks Jef -------------------------------------------------------------------------------------------------- Jef Mangelschots Voice: (909) 987-4673 Ext.212 Design Engineer Fax: (909) 606-2557 Web: http://www.safetran.com/ Email: jef.mangelschots@invensys.com |---------+----------------------------> | | "Larry Bates" | | | | | | | | | 04/04/2003 09:15 | | | AM | | | Please respond to| | | lbates | | | | |---------+----------------------------> >--------------------------------------------------------------------------------------------------------------------------------------------------| | | | To: | | cc: | | Subject: FW: [Image-SIG] installation problem | >--------------------------------------------------------------------------------------------------------------------------------------------------| Jef, The easiest way is to use PPM (Python Package Manager) that comes with Active State's install. Do following: Start-Programs-ActiveState-Python Package Manager type-"install PIL" This will install Python Imaging Library in the correct place and you should be good to go. There are many other packages that can be installed this way that you may want to consider. You can get a list by typing 'search *'. Some I use are: egenix-ms-base (good date/time modules) dynwin & calldll (used to call windows .DLL modules) HTMLgen (used to generate HTML pages) Good Luck, Larry -----Original Message----- From: image-sig-admin@python.org [mailto:image-sig-admin@python.org]On Behalf Of jef.mangelschots@invensys.com Sent: Thursday, April 03, 2003 12:47 PM To: image-sig@python.org Subject: [Image-SIG] installation problem I have a problem installing PIL (typicall for a newbee) I have installed Python 2.2.1 in c:\python22 using ActiveState's ActivePython-2.2.1-222.msi I have downloaded PIL version 1.2 (py22b1-pil-1.1.2-20011022.exe) and ran the installation. Everything was ok. It installed PIL in C:\Py22 I followed the instruction from ReportLab to copy the files in c:\py22\DLLs into c:\python22\DLLs these were the files _imaging.pyd and _imagingtk.pyd (there were no other files) I tested whether the operation was ok with ">>>from PIL import Image" but got the following error message: "ImportError: No module named PIL" I also tried: ">>>import Image" I got the following error message: "ImportError: No module named Image" I then tried ">>>import _imaging" and got the following response (I started python with parameter -v): import _imaging # dynamically loaded from c:\python22\DLLs\_imaging.pyd I assume I am missing some libraries or DLL's or am having the wrong ones. Who knows what I am doing wrong ? Regards Jef mangelschots From python@bizniche.com Mon Apr 7 09:06:05 2003 From: python@bizniche.com (Matt Graham) Date: Mon, 07 Apr 2003 02:06:05 -0600 Subject: [Image-SIG] PIL losing attributes... Message-ID: <3E91316D.3080304@bizniche.com> Hi. I'm using PIL to do some image manipulations. I like that the PIL objects have attributes like format, size etc. My problem is...when I apply some filter, say ImageChops.invert, or Image.transpose, it looses the addributes. For example > if DEBUG: print "Before transpose, format is: " + str(pil.format) > pil = pil.transpose(Image.FLIP_LEFT_RIGHT) > if DEBUG: print "After transpose, format is: " + str(pil.format) the first output prints "JPEG" or "GIF" or whatever. after the transpose, the output is "None" I tried this with and without the str() wrapper. So...I'm guessing that the copy that returned from the transpose (or other filters) is part of the problem maybe? Do I need to use some kind of copy constructor or something? The same thing happens with the size attribute, or the info dictionary that I add. Any hints at all on this would be very appreciated. It's really throwing a wrench into my app. Thanks, Matt From feix@rutchem.rutgers.edu Mon Apr 7 23:49:32 2003 From: feix@rutchem.rutgers.edu (Fei Xu) Date: Mon, 7 Apr 2003 18:49:32 -0400 Subject: [Image-SIG] write text on a picture Message-ID: HI! Everyone: I am using pytohn image library to draw a picture with some text on it. I can draw things like circles, etc, which means my python library works well. But I can't write text on it. >>>write.text((0, 0, 100,100), 'red') Traceback (most recent call last): File "", line 1, in ? File "/usr/local/lib/python2.2/site-packages/PIL/ImageDraw.py", line 155, in text font = self.getfont() File "/usr/local/lib/python2.2/site-packages/PIL/ImageDraw.py", line 61, in getfont self.font = ImageFont.load_path("BDF/courR14.pil") File "/usr/local/lib/python2.2/site-packages/PIL/ImageFont.py", line 161, in load_path raise IOError, "cannot find font file" IOError: cannot find font file I can't find the directory BDF. I am a beginner in python library. So I don't know whether I used wrong command or my library is incomplete. And in the PIL handbook the chapter on how to write is a little confusing. So would you like to tell me how to solve this problem. If you know some cookbook about it, please let me know. Thanks a lot! Fei From nieder@mail.ru Tue Apr 8 01:18:49 2003 From: nieder@mail.ru (Ricardo Niederberger Cabral) Date: Mon, 7 Apr 2003 21:18:49 -0300 Subject: [Image-SIG] write text on a picture In-Reply-To: References: Message-ID: <20030407211849.287178c5.nieder@mail.ru> On Mon, 7 Apr 2003 18:49:32 -0400 Fei Xu wrote: > HI! Everyone: I am using pytohn image library to draw a picture with some > text on it. I can draw things like circles, etc, which means my python > library works well. But I can't write text on it. > >>>write.text((0, 0, 100,100), 'red') Traceback (most recent call last): Try something like: ifo=ImageFont.load("courB12.pil") draw.text((0,0),caption,(100,100,100),font=ifo) where: (0,0) is the text coordinate (100,100,100) is the text color RGB triple caption is a string "courB12.pil" is the filename of an existing pil font file. (you may need to include full path if not in current dir) (I believe a corresponding courB12.pbm must also exist at the same path) You can get some pil fonts at http://effbot.org/pil/pilfonts.zip Best regards, --- rnc From jbreiden@parc.com Wed Apr 9 04:41:42 2003 From: jbreiden@parc.com (Jeff Breidenbach) Date: Tue, 8 Apr 2003 20:41:42 PDT Subject: [Image-SIG] suspected bug in PIL 1.1.3 bmp reader Message-ID: <1049859702.27356.7.camel@rode> Hi all, I have an uncompressed BMP file, that I believe to be valid, that PIL chokes on. I can call Image.open no problem, but PIL fails for any sort of operation beyond that. My Python/PIL installation works fine with other image files and my best guess is this is a bug. Any thoughts? Cheers, Jeff --- image file --- http://www.jab.org/www/foo.bmp ----- python trasnscript --- Python 2.2.2 (#1, Mar 21 2003, 23:01:54) [GCC 3.2.3 20030316 (Debian prerelease)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import Image >>> a = Image.open("foo.bmp") >>> a.save("bar.bmp") Traceback (most recent call last): File "", line 1, in ? File "/usr/lib/python2.2/site-packages/PIL/Image.py", line 730, in save self.load() File "/usr/lib/python2.2/site-packages/PIL/ImageFile.py", line 140, in load d = Image._getdecoder(self.mode, d, a, self.decoderconfig) File "/usr/lib/python2.2/site-packages/PIL/Image.py", line 253, in _getdecoder return apply(decoder, (mode,) + args + extra) ValueError: unknown raw mode --- platform --- Debian Linux :: PIL :: Version: 1.1.3-4 Debian Linux :: Python :: Version: 2.2.2-6 --- commentary on image file from ImageMagick --- identify -verbose foo.bmp Image: foo.bmp Format: BMP (Microsoft Windows bitmap image) Geometry: 875x875 Class: PseudoClass Type: bilevel Depth: 8 bits-per-pixel component Colors: 2 0: (255,255,255) grey100 1: ( 0, 0, 0) black Resolution: 118.11x118.11 pixels/centimeter Filesize: 95.8k Interlace: None Background Color: grey100 Border Color: #DFDFDF Matte Color: grey74 Dispose: Undefined Iterations: 0 Compression: signature: 66aa824917da6a9a028a826d620dac2336694250c8277790a00af77e44b56ecf Tainted: False User Time: 0.020u Elapsed Time: 0:01 -- Jeff Breidenbach Palo Alto Research Center (PARC) From fredrik@pythonware.com Thu Apr 10 12:47:22 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Thu, 10 Apr 2003 13:47:22 +0200 Subject: [Image-SIG] Re: A question about PIL attributes References: <001401c2febb$5ec42ed0$a200000a@mattg> Message-ID: "Matt G" wrote: > Hi. I'm using the Python Image Library to do some image manipulations. I like that the PIL > objects have attributes like format, size, info (dictionary) etc. My problem is...when I > apply some filter, say ImageChops.invert, or Image.transpose, it looses > the addributes. For example > > if DEBUG: print "Before transpose, format is: " + str(pil.format) > pil = pil.transpose(Image.FLIP_LEFT_RIGHT) > if DEBUG: print "After transpose, format is: " + str(pil.format) > > the first output prints "JPEG" or "GIF" or whatever. > > after the transpose, the output is "None" the "format" attribute is only set on image objects that are read directly from a file; once you start processing the image, the format is no longer defined. if you need to keep track of the original format, just copy the attribute to a separate variable: format = pil.format pil = pil.transport(...) ... pil.save(outfile, format=format) From tony@tcapp.com Sun Apr 13 08:19:57 2003 From: tony@tcapp.com (Tony Cappellini) Date: Sun, 13 Apr 2003 00:19:57 -0700 Subject: [Image-SIG] PIL 1.1.3 installation problems on Windows 2000 Message-ID: <5.1.0.14.0.20030413001528.0468d238@smtp.sbcglobal.net> --=====================_911250==_ Content-Type: text/plain; charset="us-ascii"; format=flowed When I run the installer for PIL 1.1.3 on Win2K, the screen which is supposed to allow me to select which Python distribution to use, is BLANK. (see attached screenshot) I only have Py 2.2.2 on my system. I've already run the register script, on the download page, and it tells me Py20 is already registered. Is there a fix/workaround for this problem ? thanks Tony --=====================_911250==_ Content-Type: image/jpeg; name="pil_bug.jpg"; x-mac-type="4A504547"; x-mac-creator="4A565752" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="pil_bug.jpg" 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 ZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZRlGUf+UlB6FpbnCUjLPN PRn3ZOWfpzPTLPLLkKEM9Of6fV9T9sf9yUI55L5xyivJF5tyePrk8oj+19TiOL1XW5y+ES/rgJwz y5n0oLU9PzwJy8E3/eX6PufVy9XI+4lkiUvl54f4j/atT7X0VwyIQ+Fj9pJaZcCUpLJMm46db9Xy zj/8mX04tkZT7n04eT1eRvCMpSlm0R9Lbb+cP9H6Jy8E/wCuGMZZZ5HDOOfXP9GMpfCMv+XgfaTy /bkfy/8Agc/uZ5f0fyS3P3Sb7kY/LFH5ZGHyRyk23h6vniOXyfdlJ6Zn+Kk4v5FL6XpRlnnL/d9c yc5Nd8f2ya7Mzz4n8s9z+We5lKcmv7eOaeTP3Sb7maeTP3Sb74en1yy+M8PT65ZfGeGUfqSSM5yb f/Qr4FXsVexV7FXsVexV7FXsVexV7FXsVexV7FXsVexV7FXsVexV7FXsVexV7FXsVexV7FXsVexV 7FXsVexV7FXsVexV7FXsVexV7FXsVexV7FXsVexV7FXsVexV7FXsceg+GLKcnms+DLS3MnOW5/JL c/kluXluXluXluXluXluXZdl2XZdl2XZdlmWZZlmWZZlmWZZlmWZZlmas1ZqzVmpqampqampqaj5 jccyffoPhl0XRm2jWJrE1iaxORyORyORyORyORyORyORyORyORyORyORy9g18nLYn36CvPT59+gr zhxNGaM0ZozRmjNGaM0ZozRjy5dBn36CvOEfySw4D49hZnPU1OL45GWfI/rMzHmx8eQ+Rx19nPv0 FecI/kl0GffoK84R/JLoM+/QV5wj+SWHFlkWRZFkWRZFkWRZFkWRZFkWRZFkWRZFkWRZFkWRZFkW RZFkcMJ9+grzhH8ksI+/n36CvOEfySwj7+ffoK84R/JLCPv59+grzhH8ksI+/n36CvOEcVGOppFr LPNMTXpSembJZ+n9uuTE8kllnm2NyjwTPTLXGWEffz79BXnCOKcnyYn+2MfhC9LX24Phkf8AEvg8 9M+Z6PXGLaXYyi1LRNfJJ/T4r04ywj7+ffoK84Rxm56+ob+koRl6uKl8HCUV6ZDayazeZCP0/pxa ceJomvToS9P2/R6OHyLCWEffz79BXnCOPE4mhocEaGmMsI+/n36CvOEfySwj7+ffoK84R/JLCPv5 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 ZOg48H4HRdUnQbYST9HQnQSVbUHVEHo7xOjabrcToOY3i99ijb+n1e5DkYNrThKG2/P7/QlYlMCQ rrIo3DT5HIDbfcRec4XXQzOQFHp13aoVpLWpyBCbUtzEoSSoRmi8Yu6HIDSzV0vfYoc7JKHfocmc mcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmc mcmcmcmcmcmcmMm9OVP/AIwf/9oADAMBAAIAAwAAABBsOPc9+NOc/wDDTnf/AA8x/wC9PM/+tON/ 8vON+9vMP98Mww4EEYE4EokEEEEEEEEEEEEEEEEEEEEEEEEEEEFaOfYAQwNYHMIEEEEEEEEEEEEE EEEEEEEEEEEEEEETgtDRTchMbIsEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0woQwAQgA0Ec8M8sc8E0kE4wEEEEEEEEEEEEEEEEMBOOP FEGGFFGGHNNOONNOOFYEEEEEEEEEEEEEEEEBPDDDDAogQwwgAgEEEEEEEFQEEEEEEEEEEEEEEEEA IEEEEGsEEEEEEEEEEEEEEFQEEEEEEEEEEEEEEEEAIEEEEGvTzzzzzzzzzzzzz5QEEEEEEEEEEEEE EEEAIEEEEGtbzzzzzzzzzzzzzxQEEEEEEEEEEEEEEEEAIcwwgGtbzzzzzzzzzzzzzxQEEEEEEEEE EEEEEEEAIe6HIGtbzzzzzzzzzzzzzxQEEEEEEEEEEEEEEEEAJLDDACtbzzzzzzzzzzzzzxQEEEEE EEEEEEEEEEEAIEEEEGtbzzzzzzzzzzzzzxQEEEEEEEEEEEEEEEEAIEEEEGtf77777777777779QE EEEEEEEEEEEEEEEAIEEEEGswwgkQwwwwwwwwwhQEEEEEEEEEEEEEEEEAAMMMMOCCACAAAAAAAAAA ARQEEEEEEEEEEEEEEEEAwwwwwwwwwwwwwwwwwwwwwxQEEEEEEEEEEEEEEEEAEEEEEEEEEEEFESag zAiwgTYEEEEEEEEEEEEEEEFPLLLLLLLLLLLLLLLLLLLLLKMEEEEEEEEEEEEEEEEEEEEEEEEEEEEE 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 5/8Axg//2Q== --=====================_911250==_-- From fredrik@pythonware.com Sun Apr 13 13:23:22 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Sun, 13 Apr 2003 14:23:22 +0200 Subject: [Image-SIG] Re: PIL 1.1.3 installation problems on Windows 2000 References: <5.1.0.14.0.20030413001528.0468d238@smtp.sbcglobal.net> Message-ID: Tony Cappellini wrote: > When I run the installer for PIL 1.1.3 on Win2K, the screen which is > supposed to allow me to select which Python distribution to use, is > BLANK. (see attached screenshot) > > I only have Py 2.2.2 on my system. > > I've already run the register script, on the download page, and it tells me > Py20 is already registered. assuming the download page you're talking about is the one on effbot.org, note that 1) there's no 1.1.3 kit for Python 2.2 on that page. (if the installer is called "-py2.1", it's for Python 2.1, not for Python 2.2). 2) there's no way the registry script can print "py20" if you run it under Python 2.2. maybe you have more Python versions installed than you know about? From fredrik@pythonware.com Sun Apr 13 13:27:20 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Sun, 13 Apr 2003 14:27:20 +0200 Subject: [Image-SIG] Re: Image.open doesn't close file before raising IOError "cannot identify image file" References: <1048673505.3e817ce1445d8@www.mailshell.com> Message-ID: "aut imagesig" wrote: > try: > im = Image.open(filename) > except IOError: > os.remove(filename) that doesn't work if the file doesn't exist. a more robust solution (which doesn't require any changes to the library) is to open the file at the application level: try: file = open(filename, "rb") except IOError: # the file doesn't appear to exist ... else: try: im = Image.open(file) except IOError: # not an image file; get rid of it file.close() os.remove(filename) From fredrik@pythonware.com Sun Apr 13 23:23:42 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Mon, 14 Apr 2003 00:23:42 +0200 Subject: [Image-SIG] Re: ImageDraw colors (was: Misc observations...) References: <200303291514.h2TFEJ908230@firewall.darkqueen.org> Message-ID: Cameron Blackwood wrote: > ImageDraw > --------- > Giving that working out the actual colors seems to be > secret hacker knowledge (I guess it had to be RGB or BGR so > its not that secret ;), but why not have a method like color32(r,g,b) > that returned the 'magic int' that is needed for 32 bit colors? > > Ie: > draw.line( ((10,10),(200,200)), fill=draw.color_rgb(200,10,50) ) > is neater than: > draw.line( ((10,10),(200,200)), fill=(b<<16)+(g<<8)+r ) using a tuple is even easier: draw.line( (10,10,200,200), fill=(200,10,50) ) in 1.1.4, you can use CSS3-style colour names as well; see http://www.effbot.org/zone/pil-imagedraw.htm From tony@tcapp.com Mon Apr 14 00:51:23 2003 From: tony@tcapp.com (Tony Cappellini) Date: Sun, 13 Apr 2003 16:51:23 -0700 (PDT) Subject: [Image-SIG] Installation problem with PIL 1.1.3 on Windows 2000 / Python 2.2.2 In-Reply-To: <20030413234102.26570.27628.Mailman@mail.python.org> Message-ID: <20030413164454.O47504-100000@yamato.yamato.com> When I run the installer for PIL 1.1.3 on Win2K, the screen which is supposed to allow me to select which Python distribution to use, is BLANK, and the installer just hangs there. The NExt button is disabled, but I can click CANCEL. I only have Py 2.2.2 on my system, I don't know why this program has a problem with this. I have installed many Python packages already, without any problems at all. I've already run the register script, on the download page, and it tells me Py20 is already registered. Is there a fix/workaround for this problem ? IS this a common occurrence on Windows? thanks From DrTebi" Hello, Following are two examples, the first doesn't work, the second does. The working example is fine, but my problem is that I want to actually use the thumb data for a shell script (to be exact: I am using the XFS file system on a Gentoo Unix system and am trying to write a python script that will set a "thumbnail" attribute as binary data to the original image). What am I understanding wrong with tostring() ? First Example ------------- # this doesn't work import Image img = Image.open('1882.jpg') img.thumbnail((128,128)) thumb = img.tostring() print """Content-type: image/jpeg\r\n""" print thumb Second Example -------------- # this works import Image import sys img = Image.open('1882.jpg') img.thumbnail((128,128)) print """Content-type: image/jpeg\r\n""" img.save(sys.stdout, "JPEG") Thanks for any help, DrTebi From fredrik@pythonware.com Wed Apr 16 06:14:07 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Wed, 16 Apr 2003 07:14:07 +0200 Subject: [Image-SIG] Re: how can I use img.tostring() References: <000701c303c3$b97d2b80$aa00a8c0@LIQUIDGROUND.COM> Message-ID: "DrTebi" wrote: > Following are two examples, the first doesn't work, the second does. > The working example is fine, but my problem is that I want to actually use > the thumb data for a shell script (to be exact: I am using the XFS file > system on a Gentoo Unix system and am trying to write a python script that > will set a "thumbnail" attribute as binary data to the original image). > > What am I understanding wrong with tostring() ? > > First Example > ------------- > # this doesn't work > import Image > > img = Image.open('1882.jpg') > img.thumbnail((128,128)) > > thumb = img.tostring() > > print """Content-type: image/jpeg\r\n""" > print thumb tostring returns raw pixel data. if you want to save a file to an interchange format, save it to a StringIO buffer: file = StringIO.StringIO() img.save(file, "JPEG") thumb = file.getvalue() From DrTebi" Great, thanks so much, it works now. This is what I was trying to accomplish: import Image from popen2 import popen2 import StringIO original = 'princesa.jpg' img = Image.open(original) img.thumbnail((200,200)) file = StringIO.StringIO() img.save(file, "JPEG") thumb = file.getvalue() # this now works ;) pout, pin = popen2('attr -q -s thumbnail ' + original) pin.write(thumb) pin.close() It's still a little baby, but I think the idea of using extended attributes and putting the thumbnail of an image into an attribute is a very nifty thing... By the way, I am surprised how fast the Image library is. Doing the same with PHP, which usually uses the GD library, was significally slower. Is there a specific reason for this? DrTebi From dthibault@esperion.com Mon Apr 21 15:14:04 2003 From: dthibault@esperion.com (David Thibault) Date: Mon, 21 Apr 2003 10:14:04 -0400 Subject: [Image-SIG] IOError: decoder group3 not available Message-ID: <45B255AB58EB904C840B6D0AF4E3A1CC0D2A45@independence.esperion.com> Hello all, I've got multipage TIFF files that I need to convert to PDF using PIL and reportlab. I think I'd be all set except I seem to be hitting an old bug. I saw this: http://mail.python.org/pipermail/image-sig/2002-February/001736.html and it seems to be the exact problem I'm running into. Has anyone ever figured this out? These tiff's are mode 1 and I get the exact error in the subject line if I try to convert them to RGB or if I try to convert them to JPG. I was hoping to take each tiff, pull out each page, convert it to jpg, then add it to the PDF file so that it would minimize the size of the files. However, anything that will work programmatically will make me happy... Regards, Dave From astewart@layton-graphics.com Mon Apr 21 18:11:32 2003 From: astewart@layton-graphics.com (D. Alan Stewart) Date: Mon, 21 Apr 2003 13:11:32 -0400 Subject: [Image-SIG] IOError: decoder group3 not available References: <45B255AB58EB904C840B6D0AF4E3A1CC0D2A45@independence.esperion.com> Message-ID: <3EA42644.4060003@layton-graphics.com> From what you've said it sounds like your TIFF has 1-bit per pixel images compressed, Group 3/4 compressed. You would need to decompress eash image, convert it to 8-bit per pixel grayscale (which will be 8 times the size of the original uncompressed image; RGB would be 24 times the original size), and then JPG compress it. I doubt this will produce a compressed image smaller than the Group 3 image you have now. The PDF specification supports Group 3 image compression, why not just transfer the compressed image as is to the PDF and not hassle with all this? See section 3.3.5 of the 1.4 PDF Specification for a description of the CCITTFaxDecode filter.... David Thibault wrote: >Hello all, > >I've got multipage TIFF files that I need to convert to PDF using PIL and >reportlab. I think I'd be all set except I seem to be hitting an old bug. >I saw this: >http://mail.python.org/pipermail/image-sig/2002-February/001736.html and it >seems to be the exact problem I'm running into. Has anyone ever figured >this out? These tiff's are mode 1 and I get the exact error in the subject >line if I try to convert them to RGB or if I try to convert them to JPG. I >was hoping to take each tiff, pull out each page, convert it to jpg, then >add it to the PDF file so that it would minimize the size of the files. >However, anything that will work programmatically will make me happy... > >Regards, >Dave > >_______________________________________________ >Image-SIG maillist - Image-SIG@python.org >http://mail.python.org/mailman/listinfo/image-sig > > > -- D. Alan Stewart Senior Software Developer Layton Graphics, Inc. Marietta, GA U.S.A. 770/973-4312 http://www.layton-graphics.com From dthibault@esperion.com Mon Apr 21 18:36:34 2003 From: dthibault@esperion.com (David Thibault) Date: Mon, 21 Apr 2003 13:36:34 -0400 Subject: [Image-SIG] IOError: decoder group3 not available Message-ID: <45B255AB58EB904C840B6D0AF4E3A1CC0D2A48@independence.esperion.com> If I try to import the TIFF image directly to PDF I get the following error: ---------------------------------------------------------- Traceback (most recent call last): File "./tiff2pdf.py", line 8, in ? c.drawImage(im,0,0) File "/usr/local/zope/lib/python2.1/reportlab/pdfgen/canvas.py", line 513, in drawImage rawdata = image.convert('RGB').tostring() File "/usr/local/zope/lib/python2.1/PIL/Image.py", line 427, in convert self.load() File "/usr/local/zope/lib/python2.1/PIL/ImageFile.py", line 140, in load d = Image._getdecoder(self.mode, d, a, self.decoderconfig) File "/usr/local/zope/lib/python2.1/PIL/Image.py", line 243, in _getdecoder raise IOError, "decoder %s not available" % decoder_name IOError: decoder tiff_ccitt not available ---------------------------------------------------------- Note that now it's complaining about a different decoder not being available... Here's the code that causes this problem: ---------------------------------------------------------- #!/usr/local/zope/bin/python from reportlab.pdfgen import canvas from PIL import Image im = Image.open('multipage2.tif') c = canvas.Canvas('test.pdf') c.drawImage(im,0,0) c.showPage() c.save() ----------------------------------------------------------- Regards, Dave -----Original Message----- From: D. Alan Stewart [mailto:astewart@layton-graphics.com] Sent: Monday, April 21, 2003 1:12 PM To: David Thibault Cc: image-sig@python.org Subject: Re: [Image-SIG] IOError: decoder group3 not available From what you've said it sounds like your TIFF has 1-bit per pixel images compressed, Group 3/4 compressed. You would need to decompress eash image, convert it to 8-bit per pixel grayscale (which will be 8 times the size of the original uncompressed image; RGB would be 24 times the original size), and then JPG compress it. I doubt this will produce a compressed image smaller than the Group 3 image you have now. The PDF specification supports Group 3 image compression, why not just transfer the compressed image as is to the PDF and not hassle with all this? See section 3.3.5 of the 1.4 PDF Specification for a description of the CCITTFaxDecode filter.... David Thibault wrote: >Hello all, > >I've got multipage TIFF files that I need to convert to PDF using PIL and >reportlab. I think I'd be all set except I seem to be hitting an old bug. >I saw this: >http://mail.python.org/pipermail/image-sig/2002-February/001736.html and it >seems to be the exact problem I'm running into. Has anyone ever figured >this out? These tiff's are mode 1 and I get the exact error in the subject >line if I try to convert them to RGB or if I try to convert them to JPG. I >was hoping to take each tiff, pull out each page, convert it to jpg, then >add it to the PDF file so that it would minimize the size of the files. >However, anything that will work programmatically will make me happy... > >Regards, >Dave > >_______________________________________________ >Image-SIG maillist - Image-SIG@python.org >http://mail.python.org/mailman/listinfo/image-sig > > > -- D. Alan Stewart Senior Software Developer Layton Graphics, Inc. Marietta, GA U.S.A. 770/973-4312 http://www.layton-graphics.com From grahamd@dscpl.com.au Tue Apr 22 05:18:06 2003 From: grahamd@dscpl.com.au (grahamd@dscpl.com.au) Date: Mon, 21 Apr 2003 22:18:06 -0600 (MDT) Subject: [Image-SIG] Bug in BdfFontFile.py. Message-ID: <1050985086.31382@dscpl.com.au> From grahamd@dscpl.com.au Tue Apr 22 05:22:45 2003 From: grahamd@dscpl.com.au (grahamd@dscpl.com.au) Date: Mon, 21 Apr 2003 22:22:45 -0600 (MDT) Subject: [Image-SIG] Bug in BdfFontFile.py. Message-ID: <1050985365.31626@dscpl.com.au> Whoops, sorry for the last message being empty. :-) Towards the end of the BdfFontFile.py file, the code should read: if ch >= 0 and ch <= 255: self.glyph[ch] = xy, dst, src, im Currently the code doesn't check for an upper bound of "255" for "ch". This means that if the BDF file throws up a larger value, Python raises an exception because the FontFile base class only creates the "glyph" array with 256 entries. This problem can occur when you take an MS arial ttf file, send it through the "ttf2bdf" command from "freetype-1" contrib directory and then run the "pilfont.py" script on the BDF files to generate PIL fonts. I thought I had tried to report this some time back, but it seems the problem still exists in 1.1.4a2 available from unstable branch of fink for the Mac, so maybe I didn't get around to reporting it after all. From fredrik@pythonware.com Tue Apr 22 15:06:10 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Tue, 22 Apr 2003 16:06:10 +0200 Subject: [Image-SIG] Re: IOError: decoder group3 not available References: <45B255AB58EB904C840B6D0AF4E3A1CC0D2A45@independence.esperion.com> Message-ID: David Thibault wrote: > I've got multipage TIFF files that I need to convert to PDF using PIL and > reportlab. I think I'd be all set except I seem to be hitting an old bug. > I saw this: > http://mail.python.org/pipermail/image-sig/2002-February/001736.html and it > seems to be the exact problem I'm running into. Has anyone ever figured > this out? These tiff's are mode 1 and I get the exact error in the subject > line if I try to convert them to RGB or if I try to convert them to JPG. PIL's TIFF reader identifies various CCITT encodings, but PIL doesn't include codecs for this format. This means that you can open the file, but you cannot read the pixels from it. I suggest using the "tiffcp" utility shipped with libtiff (www.libtiff.org) to "decompress" the file before reading it with PIL: def tiffopen(filename): os.system("tiffcp -c none %s temp.tif" % filename) im = Image.open("temp.tif") os.remove("temp.tif") # on windows, you have to load the data first return im im = tiffopen("myfile.tif") for frame in ImageSequence.Iterator(im): ... From dthibault@esperion.com Tue Apr 22 15:22:01 2003 From: dthibault@esperion.com (David Thibault) Date: Tue, 22 Apr 2003 10:22:01 -0400 Subject: [Image-SIG] Re: IOError: decoder group3 not available Message-ID: <45B255AB58EB904C840B6D0AF4E3A1CC0D2A4B@independence.esperion.com> Thanks, I'll try that! Dave -----Original Message----- From: Fredrik Lundh [mailto:fredrik@pythonware.com] Sent: Tuesday, April 22, 2003 10:06 AM To: image-sig@python.org Subject: [Image-SIG] Re: IOError: decoder group3 not available David Thibault wrote: > I've got multipage TIFF files that I need to convert to PDF using PIL and > reportlab. I think I'd be all set except I seem to be hitting an old bug. > I saw this: > http://mail.python.org/pipermail/image-sig/2002-February/001736.html and it > seems to be the exact problem I'm running into. Has anyone ever figured > this out? These tiff's are mode 1 and I get the exact error in the subject > line if I try to convert them to RGB or if I try to convert them to JPG. PIL's TIFF reader identifies various CCITT encodings, but PIL doesn't include codecs for this format. This means that you can open the file, but you cannot read the pixels from it. I suggest using the "tiffcp" utility shipped with libtiff (www.libtiff.org) to "decompress" the file before reading it with PIL: def tiffopen(filename): os.system("tiffcp -c none %s temp.tif" % filename) im = Image.open("temp.tif") os.remove("temp.tif") # on windows, you have to load the data first return im im = tiffopen("myfile.tif") for frame in ImageSequence.Iterator(im): ... _______________________________________________ Image-SIG maillist - Image-SIG@python.org http://mail.python.org/mailman/listinfo/image-sig From fredrik@pythonware.com Tue Apr 22 16:46:21 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Tue, 22 Apr 2003 17:46:21 +0200 Subject: [Image-SIG] ANN: PIL 1.1.4 alpha 4 (win32 only) Message-ID: PIL 1.1.4 alpha 4 installers for Python 2.1 and 2.2 on Windows are now available from: http://effbot.org/downloads#pil A list of changes can be found here: http://effbot.org/zone/pil-changes-114.htm ...and a draft handbook can be found here: http://effbot.org/books/imagingbook/ The source release will be available later this week, if everything goes according to plans. enjoy /F From fredrik@pythonware.com Tue Apr 22 17:06:35 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Tue, 22 Apr 2003 18:06:35 +0200 Subject: [Image-SIG] Re: suspected bug in PIL 1.1.3 bmp reader References: <1049859702.27356.7.camel@rode> Message-ID: Jeff Breidenbach wrote: > I have an uncompressed BMP file, that I believe to be valid, that PIL > chokes on. I can call Image.open no problem, but PIL fails for any > sort of operation beyond that. My Python/PIL installation works > fine with other image files and my best guess is this is a > bug. Any thoughts? this might work: in PIL/BmpImagePlugin.py, change if greyscale: if colors == 2: self.mode = "1" else: self.mode = rawmode = "L" to if greyscale: if colors == 2: self.mode = rawmode = "1" # <-- here! else: self.mode = rawmode = "L" From fredrik@pythonware.com Tue Apr 22 18:51:22 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Tue, 22 Apr 2003 19:51:22 +0200 Subject: [Image-SIG] ANN: PIL 1.1.4 alpha 4 (source) References: Message-ID: > The source release will be available later this week, if > everything goes according to plans. alright, here it is: http://effbot.org/downloads#Imaging enjoy /F From dereks@realloc.net Wed Apr 23 01:53:52 2003 From: dereks@realloc.net (Derek Simkowiak) Date: Tue, 22 Apr 2003 17:53:52 -0700 Subject: [Image-SIG] WAL file format Message-ID: <3EA5E420.4050908@realloc.net> Hello, I need the ability to load Id Software "WAL" files. WAL images are the file format used by Id Software for Quake2 texture maps. They are an indexed image format (like GIF) and do not have any compression, and the file format includes several copies of the image for use as a "mipmap". Looking in the appendix, that format does not appear to be supported. I currently have some C code that will load WAL files. I have been using it successfully for some time. It is basic, and only loads the "master" copy of the image (it does not look at the mipmaps, because all modern video cards generate their own mipmaps through OpenGL or DirectX). I am re-architecting my 3D game engine to use PIL, so that I can support all the other image types as textures. But since PIL does not support WAL files, I'm in a bad spot. I would like to contribute my C code to the PIL library. This way I can use PIL for all my image loading, including the existing WAL images. Does this interest the maintainers? Does anyone know of any other Python code that loads WAL images? Thanks, Derek Simkowiak dereks@realloc.net From fredrik@pythonware.com Wed Apr 23 06:09:58 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Wed, 23 Apr 2003 07:09:58 +0200 Subject: [Image-SIG] Re: WAL file format References: <3EA5E420.4050908@realloc.net> Message-ID: Derek Simkowiak wrote: > I need the ability to load Id Software "WAL" files. WAL images are the > file format used by Id Software for Quake2 texture maps. They are an > indexed image format (like GIF) and do not have any compression, and the > file format includes several copies of the image for use as a "mipmap". > > Looking in the appendix, that format does not appear to be supported. > > I currently have some C code that will load WAL files. I have been > using it successfully for some time. It is basic, and only loads the > "master" copy of the image (it does not look at the mipmaps, because all > modern video cards generate their own mipmaps through OpenGL or DirectX). > > I am re-architecting my 3D game engine to use PIL, so that I can > support all the other image types as textures. But since PIL does not > support WAL files, I'm in a bad spot. reading uncompressed formats with PIL is usually trivial. this document tells you how to write a "real" image plugin: http://www.pythonware.com/library/pil/handbook/writing-your-own-file-decoder.htm here's a 5-minute hack (a single function, not an ImagePlugin) that might work. if it doesn't, feel free to tweak as necessary: # WAL reader (untested), based on specification available from: # http://www.flipcode.com/tutorials/tut_q2levels.shtml import Image def i32(c, o=0): return ord(c[o])+(ord(c[o+1])<<8)+(ord(c[o+2])<<16)+(ord(c[o+3])<<24) ## # Load first texture from a WAL file. # # @param filename WAL file name. # @param palette Palette to use for this file. The palette is # a list of 768 colour values, given as [R, G, B, R, G, B, ...] # @return An image instance. def load(filename, palette): fp = open(filename, "rb") # read header fields header = fp.read(32+24+32+12) name = header[:32] size = i32(header, 32), i32(header, 36) offset = i32(header, 40) # load pixel data fp.seek(offset) # or maybe fp.seek(offset, 1) ? im = Image.fromstring("P", size, fp.read(size[0] * size[1])) im.putpalette(palette) return im From fredrik@pythonware.com Wed Apr 23 09:15:28 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Wed, 23 Apr 2003 10:15:28 +0200 Subject: [Image-SIG] Re: WAL file format References: <3EA5E420.4050908@realloc.net> Message-ID: > here's a 5-minute hack (a single function, not an ImagePlugin) that > might work. if it doesn't, feel free to tweak as necessary: here's a slightly improved (and slighly tested) version, which also includes a default palette: import Image def i32(c, o=0): return ord(c[o])+(ord(c[o+1])<<8)+(ord(c[o+2])<<16)+(ord(c[o+3])<<24) ## # Load first texture from a WAL file. # # @param filename WAL file name, or an opened file handle. # @param palette Palette to use for this file. The palette is a list # of 768 colour values, given as [R, G, B, R, G, B, ...]. If # omitted, the palette defaults to a standard QUAKE2 palette. # You can use the putpalette method to override the # palette. # @return An image instance. def load(filename, palette=None): if hasattr(filename, "read"): fp = filename else: import __builtin__ fp = __builtin__.open(filename, "rb") if not palette: palette = QUAKE2PALETTE # read header fields header = fp.read(32+24+32+12) size = i32(header, 32), i32(header, 36) offset = i32(header, 40) # load pixel data fp.seek(offset) im = Image.fromstring("P", size, fp.read(size[0] * size[1])) im.format = "WAL" # strings are null-terminated im.info["name"] = header[:32].split("\0", 1)[0] next_name = header[56:56+32].split("\0", 1)[0] if next_name: im.info["next_name"] = next_name if palette: im.putpalette(palette) else: im.putpalette(quake2palette) return im QUAKE2PALETTE = ( "\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" "\x1e\x1e\x22\x22\x22\x26\x26\x26\x29\x29\x29\x2c\x2c\x2c\x2f\x2f" "\x2f\x32\x32\x32\x35\x35\x35\x37\x37\x37\x3a\x3a\x3a\x3c\x3c\x3c" "\x24\x1e\x13\x22\x1c\x12\x20\x1b\x12\x1f\x1a\x10\x1d\x19\x10\x1b" "\x17\x0f\x1a\x16\x0f\x18\x14\x0d\x17\x13\x0d\x16\x12\x0d\x14\x10" "\x0b\x13\x0f\x0b\x10\x0d\x0a\x0f\x0b\x0a\x0d\x0b\x07\x0b\x0a\x07" "\x23\x23\x26\x22\x22\x25\x22\x20\x23\x21\x1f\x22\x20\x1e\x20\x1f" "\x1d\x1e\x1d\x1b\x1c\x1b\x1a\x1a\x1a\x19\x19\x18\x17\x17\x17\x16" "\x16\x14\x14\x14\x13\x13\x13\x10\x10\x10\x0f\x0f\x0f\x0d\x0d\x0d" "\x2d\x28\x20\x29\x24\x1c\x27\x22\x1a\x25\x1f\x17\x38\x2e\x1e\x31" "\x29\x1a\x2c\x25\x17\x26\x20\x14\x3c\x30\x14\x37\x2c\x13\x33\x28" "\x12\x2d\x24\x10\x28\x1f\x0f\x22\x1a\x0b\x1b\x14\x0a\x13\x0f\x07" "\x31\x1a\x16\x30\x17\x13\x2e\x16\x10\x2c\x14\x0d\x2a\x12\x0b\x27" "\x0f\x0a\x25\x0f\x07\x21\x0d\x01\x1e\x0b\x01\x1c\x0b\x01\x1a\x0b" "\x01\x18\x0a\x01\x16\x0a\x01\x13\x0a\x01\x10\x07\x01\x0d\x07\x01" "\x29\x23\x1e\x27\x21\x1c\x26\x20\x1b\x25\x1f\x1a\x23\x1d\x19\x21" "\x1c\x18\x20\x1b\x17\x1e\x19\x16\x1c\x18\x14\x1b\x17\x13\x19\x14" "\x10\x17\x13\x0f\x14\x10\x0d\x12\x0f\x0b\x0f\x0b\x0a\x0b\x0a\x07" "\x26\x1a\x0f\x23\x19\x0f\x20\x17\x0f\x1c\x16\x0f\x19\x13\x0d\x14" "\x10\x0b\x10\x0d\x0a\x0b\x0a\x07\x33\x22\x1f\x35\x29\x26\x37\x2f" "\x2d\x39\x35\x34\x37\x39\x3a\x33\x37\x39\x30\x34\x36\x2b\x31\x34" "\x27\x2e\x31\x22\x2b\x2f\x1d\x28\x2c\x17\x25\x2a\x0f\x20\x26\x0d" "\x1e\x25\x0b\x1c\x22\x0a\x1b\x20\x07\x19\x1e\x07\x17\x1b\x07\x14" "\x18\x01\x12\x16\x01\x0f\x12\x01\x0b\x0d\x01\x07\x0a\x01\x01\x01" "\x2c\x21\x21\x2a\x1f\x1f\x29\x1d\x1d\x27\x1c\x1c\x26\x1a\x1a\x24" "\x18\x18\x22\x17\x17\x21\x16\x16\x1e\x13\x13\x1b\x12\x12\x18\x10" "\x10\x16\x0d\x0d\x12\x0b\x0b\x0d\x0a\x0a\x0a\x07\x07\x01\x01\x01" "\x2e\x30\x29\x2d\x2e\x27\x2b\x2c\x26\x2a\x2a\x24\x28\x29\x23\x27" "\x27\x21\x26\x26\x1f\x24\x24\x1d\x22\x22\x1c\x1f\x1f\x1a\x1c\x1c" "\x18\x19\x19\x16\x17\x17\x13\x13\x13\x10\x0f\x0f\x0d\x0b\x0b\x0a" "\x30\x1e\x1b\x2d\x1c\x19\x2c\x1a\x17\x2a\x19\x14\x28\x17\x13\x26" "\x16\x10\x24\x13\x0f\x21\x12\x0d\x1f\x10\x0b\x1c\x0f\x0a\x19\x0d" "\x0a\x16\x0b\x07\x12\x0a\x07\x0f\x07\x01\x0a\x01\x01\x01\x01\x01" "\x28\x29\x38\x26\x27\x36\x25\x26\x34\x24\x24\x31\x22\x22\x2f\x20" "\x21\x2d\x1e\x1f\x2a\x1d\x1d\x27\x1b\x1b\x25\x19\x19\x21\x17\x17" "\x1e\x14\x14\x1b\x13\x12\x17\x10\x0f\x13\x0d\x0b\x0f\x0a\x07\x07" "\x2f\x32\x29\x2d\x30\x26\x2b\x2e\x24\x29\x2c\x21\x27\x2a\x1e\x25" "\x28\x1c\x23\x26\x1a\x21\x25\x18\x1e\x22\x14\x1b\x1f\x10\x19\x1c" "\x0d\x17\x1a\x0a\x13\x17\x07\x10\x13\x01\x0d\x0f\x01\x0a\x0b\x01" "\x01\x3f\x01\x13\x3c\x0b\x1b\x39\x10\x20\x35\x14\x23\x31\x17\x23" "\x2d\x18\x23\x29\x18\x3f\x3f\x3f\x3f\x3f\x39\x3f\x3f\x31\x3f\x3f" "\x2a\x3f\x3f\x20\x3f\x3f\x14\x3f\x3c\x12\x3f\x39\x0f\x3f\x35\x0b" "\x3f\x32\x07\x3f\x2d\x01\x3d\x2a\x01\x3b\x26\x01\x39\x21\x01\x37" "\x1d\x01\x34\x1a\x01\x32\x16\x01\x2f\x12\x01\x2d\x0f\x01\x2a\x0b" "\x01\x27\x07\x01\x23\x01\x01\x1d\x01\x01\x17\x01\x01\x10\x01\x01" "\x3d\x01\x01\x19\x19\x3f\x3f\x01\x01\x01\x01\x3f\x16\x16\x13\x10" "\x10\x0f\x0d\x0d\x0b\x3c\x2e\x2a\x36\x27\x20\x30\x21\x18\x29\x1b" "\x10\x3c\x39\x37\x37\x32\x2f\x31\x2c\x28\x2b\x26\x21\x30\x22\x20" ) From David McDonnell" I've just started to use python 2.2 and have installed PIL 1.1.4a4 (win 32 installer, this was the only version i could get to install correctly). I was trying to use the example code from the PIL handbook (1.1.3). # split the image into individual bands source = im.split() R, G, B = 0, 1, 2 # select regions where red is less than 100 mask = source[R].point(lambda i: i 100 and 255) # process the green band out = source[G].point(lambda i: i * 0.7) # paste the processed band back, but only where red was 100 source[G].paste(out, None, mask) # build a new multiband image im = Image.merge(im.mode, source) but i get a syntax error: File "C:\Python22\Scripts\dave_demo\PILtest.py", line 8 mask = source[R].point(lambda i: i 100 and 255) ^ SyntaxError: invalid syntax anyone got any ideas? Also if anyone can explain to me how lambda works etc or point to me to the right place in the docs etc i'd really appreciate it, cos i cant find anything that i can actually understand about it. Cheers Dave __________________________________ David McDonnell - 3D Artist - Blinkworks dave@blinkworks.com.au www.blinkworks.com.au __________________________________ From fredrik@pythonware.com Thu Apr 24 10:33:45 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Thu, 24 Apr 2003 11:33:45 +0200 Subject: [Image-SIG] Re: Getting an error in Point operations code from the pil-handbook. References: <002e01c30a3c$109f0b80$7800a8c0@david> Message-ID: David McDonnell wrote: > # select regions where red is less than 100 > > mask = source[R].point(lambda i: i 100 and 255) where did you get this code? in the pythonware.com version, it says: mask = source[R].point(lambda i: i < 100 and 255) note the missing "<" in your version. as for lambda, it's just another way to write a simple function: ...point(lambda i: i < 100 and 255) is the same thing as def somename(i): return i < 100 and 255 ...point(somename) with the exception that you don't have to make up a name. as for what the "i < 100 and 255" does, that's briefly explained in the pil introduction (just below the code sample). if you don't want to use lambdas and strange expressions, you can spell it all out as: def mymapfunction(i): if i < 100: return 255 return 0 ...point(mymapfunction) alternatively, you can pass in a list of values, instead of a mapping function: lut = [] for i in range(255): if i < 100: lut.append(255) else: lut.append(0) ...point(lut) for more on lambdas, see the Python language reference (available from www.python.org) From fredrik@pythonware.com Sat Apr 26 11:13:57 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Sat, 26 Apr 2003 12:13:57 +0200 Subject: [Image-SIG] ANN: PIL 1.1.4 beta 1 (win32) Message-ID: PIL 1.1.4 beta 1 installers for Windows are now available from: http://effbot.org/downloads#pil I've prepared installers for Python 2.1, 2.2 and 2.3 (beta 1). A list of changes can be found below: ...and a draft handbook can be found here: http://effbot.org/books/imagingbook/ The source release will be available within a few days (I'm waiting for certain contributors to provide me with improved build files for certain non-windows/non-unix platforms...) enjoy /F *** Changes from release 1.1.3 to 1.1.4 *** (see http://effbot.org/zone/pil-changes-114.htm ) (1.1.4 beta 1 released) + Added experimental EXIF support for JPEG files. To extract EXIF information from a JPEG file, open the file as usual, and call the "_getexif" method. If successful, this method returns a dictionary mapping EXIF TIFF tags to values. If the file does not contain EXIF data, the "_getexif" method returns None. The "ExifTags" module contains a dictionary mapping tags to tag names. The "_getexit" interface will most likely change in future versions. + Fixed a bug when using the "transparency" option with the GIF writer. + Added limited support for "bitfield compression" in BMP files and DIB buffers, for 15-bit, 16-bit, and 32-bit images. This also fixes a problem with ImageGrab module when copying screen- dumps from the clipboard on 15/16/32-bit displays. + Added experimental WAL (Quake 2 textures) loader. To use this loader, import WalImageFile and call the "open" method in that module. (1.1.4a4 released) + Added updated SANE driver (Andrew Kuchling, Abel Deuring) + Use Python's "mmap" module on non-Windows platforms to read some uncompressed formats using memory mapping. Also added a "frombuffer" method that allows you to access the contents of an existing string or buffer object as if it were an image object. + Fixed a memory leak that could appear when processing mode "P" images (from Pier Paolo Glave) + Ignore Unicode characters in the BDF loader (from Graham Dumpleton) (1.1.4a3 released; windows only) + Added experimental RGBA-on-RGB drawing support. To use RGBA colours on an RGB image, pass "RGBA" as the second string to the ImageDraw.Draw constructor. + Added support for non-ASCII strings (Latin-1) and Unicode to the truetype font renderer. + The ImageWin "Dib" object can now be constructed directly from an image object. + The ImageWin module now allows you use window handles as well as device contexts. To use a window handle, wrap the handle in an ImageWin.HWND object, and pass in this object instead of the device context. (1.1.4a2 released) + Improved support for 16-bit unsigned integer images (mode "I;16"). This includes TIFF reader support, and support for "getextrema" and "point" (from Klamer Shutte). + Made the BdfFontFile reader a bit more robust (from Kevin Cazabon and Dmitry Vasiliev) + Changed TIFF writer to always write Compression tag, even when using the default compression (from Greg Couch). + Added "show" support for Mac OS X (from Dan Wolfe). + Added clipboard support to the "ImageGrab" module (Windows only). The "grabclipboard" function returns an Image object, a list of filenames (not in 1.1.4), or None if neither was found. (1.1.4a1 released) + Improved support for drawing RGB data in palette images. You can now use RGB tuples or colour names (see below) when drawing in a mode "P" image. The drawing layer automatically assigns color indexes, as long as you don't use more than 256 unique colours. + Moved self test from MiniTest/test.py to ./selftest.py. + Added support for CSS3-style color strings to most places that accept colour codes/tuples. This includes the "ImageDraw" module, the Image "new" function, and the Image "paste" method. Colour strings can use one of the following formats: "#f00", "#ff0000", "rgb(255,0,0)", "rgb(100%,0%,0%)", "hsl(0, 100%, 50%)", or "red" (most X11-style colour names are supported). See the documentation for the "ImageColor" module for more information. + Fixed DCX decoder (based on input from Larry Bates) + Added "IptcImagePlugin.getiptcinfo" helper to extract IPTC/NAA newsphoto properties from JPEG, TIFF, or IPTC files. + Support for TrueType/OpenType fonts has been added to the standard distribution. You need the freetype 2.0 library. + Made the PCX reader a bit more robust when reading 2-bit and 4-bit PCX images with odd image sizes. + Added "Kernel" class to the ImageFilter module. This class allows you to filter images with user-defined 3x3 and 5x5 convolution kernels. + Added "putdata" support for mode "I", "F" and "RGB". + The GIF writer now supports the transparency option (from Denis Benoit). + A HTML version of the module documentation is now shipped with the source code distribution. You'll find the files in the Doc subdirectory. + Added support for Palm pixmaps (from Bill Janssen). This change was listed for 1.1.3, but the "PalmImagePlugin" driver didn't make it into the distribution. + Improved decoder error messages. -end- From tony@tcapp.com Sat Apr 26 19:29:19 2003 From: tony@tcapp.com (Tony Cappellini) Date: Sat, 26 Apr 2003 11:29:19 -0700 Subject: [Image-SIG] PIL 1.1.3 installation problems on Windows 2000 Message-ID: <5.1.0.14.0.20030426112909.045796a8@smtp.sbcglobal.net> --=====================_8351368==_ Content-Type: text/plain; charset="us-ascii"; format=flowed When I run the installer for PIL 1.1.3 on Win2K, the screen which is supposed to allow me to select which Python distribution to use, is BLANK. (see attached screenshot) I only have Py 2.2.2 on my system. I've already run the register script, on the download page, and it tells me Py20 is already registered. Is there a fix/workaround for this problem ? thanks Tony --=====================_8351368==_ Content-Type: image/jpeg; name="pil_bug.jpg"; x-mac-type="4A504547"; x-mac-creator="4A565752" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="pil_bug.jpg" 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 ZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZRlGUf+UlB6FpbnCUjLPN PRn3ZOWfpzPTLPLLkKEM9Of6fV9T9sf9yUI55L5xyivJF5tyePrk8oj+19TiOL1XW5y+ES/rgJwz y5n0oLU9PzwJy8E3/eX6PufVy9XI+4lkiUvl54f4j/atT7X0VwyIQ+Fj9pJaZcCUpLJMm46db9Xy zj/8mX04tkZT7n04eT1eRvCMpSlm0R9Lbb+cP9H6Jy8E/wCuGMZZZ5HDOOfXP9GMpfCMv+XgfaTy /bkfy/8Agc/uZ5f0fyS3P3Sb7kY/LFH5ZGHyRyk23h6vniOXyfdlJ6Zn+Kk4v5FL6XpRlnnL/d9c yc5Nd8f2ya7Mzz4n8s9z+We5lKcmv7eOaeTP3Sb7maeTP3Sb74en1yy+M8PT65ZfGeGUfqSSM5yb f/Qr4FXsVexV7FXsVexV7FXsVexV7FXsVexV7FXsVexV7FXsVexV7FXsVexV7FXsVexV7FXsVexV 7FXsVexV7FXsVexV7FXsVexV7FXsVexV7FXsVexV7FXsVexV7FXsceg+GLKcnms+DLS3MnOW5/JL c/kluXluXluXluXluXluXZdl2XZdl2XZdlmWZZlmWZZlmWZZlmWZZlmas1ZqzVmpqampqampqaj5 jccyffoPhl0XRm2jWJrE1iaxORyORyORyORyORyORyORyORyORyORyORy9g18nLYn36CvPT59+gr zhxNGaM0ZozRmjNGaM0ZozRjy5dBn36CvOEfySw4D49hZnPU1OL45GWfI/rMzHmx8eQ+Rx19nPv0 FecI/kl0GffoK84R/JLoM+/QV5wj+SWHFlkWRZFkWRZFkWRZFkWRZFkWRZFkWRZFkWRZFkWRZFkW RZFkcMJ9+grzhH8ksI+/n36CvOEfySwj7+ffoK84R/JLCPv59+grzhH8ksI+/n36CvOEcVGOppFr LPNMTXpSembJZ+n9uuTE8kllnm2NyjwTPTLXGWEffz79BXnCOKcnyYn+2MfhC9LX24Phkf8AEvg8 9M+Z6PXGLaXYyi1LRNfJJ/T4r04ywj7+ffoK84Rxm56+ob+koRl6uKl8HCUV6ZDayazeZCP0/pxa ceJomvToS9P2/R6OHyLCWEffz79BXnCOPE4mhocEaGmMsI+/n36CvOEfySwj7+ffoK84R/JLCPv5 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 ZOg48H4HRdUnQbYST9HQnQSVbUHVEHo7xOjabrcToOY3i99ijb+n1e5DkYNrThKG2/P7/QlYlMCQ rrIo3DT5HIDbfcRec4XXQzOQFHp13aoVpLWpyBCbUtzEoSSoRmi8Yu6HIDSzV0vfYoc7JKHfocmc mcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmc mcmcmcmcmcmcmMm9OVP/AIwf/9oADAMBAAIAAwAAABBsOPc9+NOc/wDDTnf/AA8x/wC9PM/+tON/ 8vON+9vMP98Mww4EEYE4EokEEEEEEEEEEEEEEEEEEEEEEEEEEEFaOfYAQwNYHMIEEEEEEEEEEEEE EEEEEEEEEEEEEEETgtDRTchMbIsEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0woQwAQgA0Ec8M8sc8E0kE4wEEEEEEEEEEEEEEEEMBOOP FEGGFFGGHNNOONNOOFYEEEEEEEEEEEEEEEEBPDDDDAogQwwgAgEEEEEEEFQEEEEEEEEEEEEEEEEA IEEEEGsEEEEEEEEEEEEEEFQEEEEEEEEEEEEEEEEAIEEEEGvTzzzzzzzzzzzzz5QEEEEEEEEEEEEE EEEAIEEEEGtbzzzzzzzzzzzzzxQEEEEEEEEEEEEEEEEAIcwwgGtbzzzzzzzzzzzzzxQEEEEEEEEE EEEEEEEAIe6HIGtbzzzzzzzzzzzzzxQEEEEEEEEEEEEEEEEAJLDDACtbzzzzzzzzzzzzzxQEEEEE EEEEEEEEEEEAIEEEEGtbzzzzzzzzzzzzzxQEEEEEEEEEEEEEEEEAIEEEEGtf77777777777779QE EEEEEEEEEEEEEEEAIEEEEGswwgkQwwwwwwwwwhQEEEEEEEEEEEEEEEEAAMMMMOCCACAAAAAAAAAA ARQEEEEEEEEEEEEEEEEAwwwwwwwwwwwwwwwwwwwwwxQEEEEEEEEEEEEEEEEAEEEEEEEEEEEFESag zAiwgTYEEEEEEEEEEEEEEEFPLLLLLLLLLLLLLLLLLLLLLKMEEEEEEEEEEEEEEEEEEEEEEEEEEEEE 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 5/8Axg//2Q== --=====================_8351368==_-- From fredrik@pythonware.com Sat Apr 26 21:53:06 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Sat, 26 Apr 2003 22:53:06 +0200 Subject: [Image-SIG] Re: PIL 1.1.3 installation problems on Windows 2000 References: <5.1.0.14.0.20030426112909.045796a8@smtp.sbcglobal.net> Message-ID: Tony Cappellini wrote: > When I run the installer for PIL 1.1.3 on Win2K, the screen which is > supposed to allow me to select > which Python distribution to use, is BLANK. (see attached screenshot) > > I only have Py 2.2.2 on my system. > > I've already run the register script, on the download page, and it tells me > Py20 is already registered. > > Is there a fix/workaround for this problem ? you asked the same question two weeks ago, and got this reply, which still applies: From: "Fredrik Lundh" To: image-sig@python.org Date: Sun, 13 Apr 2003 14:23:22 +0200 Subject: Re: PIL 1.1.3 installation problems on Windows 2000 Tony Cappellini wrote: > When I run the installer for PIL 1.1.3 on Win2K, the screen which is > supposed to allow me to select which Python distribution to use, is > BLANK. (see attached screenshot) > > I only have Py 2.2.2 on my system. > > I've already run the register script, on the download page, and it tells me > Py20 is already registered. assuming the download page you're talking about is the one on effbot.org, note that 1) there's no 1.1.3 kit for Python 2.2 on that page. (if the installer is called "-py2.1", it's for Python 2.1, not for Python 2.2). 2) there's no way the registry script can print "py20" if you run it under Python 2.2. maybe you have more Python versions installed than you know about? From mvanderheijden@fininfo.fr Mon Apr 28 12:17:34 2003 From: mvanderheijden@fininfo.fr (VAN DER HEIJDEN Maarten) Date: Mon, 28 Apr 2003 13:17:34 +0200 Subject: [Image-SIG] missing fonts Message-ID: <59720C230F8BC54098777277F5E106888E1740@fininfomail.fininfo.grp> Hello, I tried to write text with ImageDraw. But it seems that the following file is missing: "BDF/courR14.pil". Somebody knows how to use fonts in PIL? For exemple fonts already available under windows. C:\python22\Samples>c:\python22\python.exe painter.py test2.bmp Traceback (most recent call last): File "painter.py", line 71, in ? draw.text( (100,100), "Hallo" ) File "C:\python22\PIL\ImageDraw.py", line 155, in text font = self.getfont() File "C:\python22\PIL\ImageDraw.py", line 61, in getfont self.font = ImageFont.load_path("BDF/courR14.pil") File "c:\python22\PIL\ImageFont.py", line 136, in load_path raise IOError, "cannot find font file" IOError: cannot find font file Thanks in advance, Maarten This message and any attachments (the "message") is intended solely for the addressees and is confidential. If you receive this message in error, please delete it and immediately notify the sender. Any use not in accord with its purpose, any dissemination or disclosure, either whole or partial, is prohibited except formal approval. Neither FININFO (nor any of its subsidiaries or affiliates) shall be liable for the message if modified, altered, falsified, edited or diffused without authorization. From mvanderheijden@fininfo.fr Mon Apr 28 12:29:06 2003 From: mvanderheijden@fininfo.fr (VAN DER HEIJDEN Maarten) Date: Mon, 28 Apr 2003 13:29:06 +0200 Subject: [Image-SIG] RE: missing fonts Message-ID: <59720C230F8BC54098777277F5E106888E17D5@fininfomail.fininfo.grp> > -----Message d'origine----- > De: VAN DER HEIJDEN Maarten=20 > Date: 28 avr. 03 13:28 > =C0: 'image-sig@python.org' > Objet: TR: missing fonts >=20 >=20 >=20 > -----Message d'origine----- > De: VAN DER HEIJDEN Maarten=20 > Date: 28 avr. 03 13:17 > =C0: 'image-sig@python.org' > Objet: missing fonts >=20 > Hello, >=20 >=20 > I tried to write text with ImageDraw. But it seems that the following > file is missing: > "BDF/courR14.pil". >=20 > Somebody knows how to use fonts in PIL? For exemple fonts already > available under windows. >=20 > C:\python22\Samples>c:\python22\python.exe painter.py test2.bmp > Traceback (most recent call last): > File "painter.py", line 71, in ? > draw.text( (100,100), "Hallo" ) > File "C:\python22\PIL\ImageDraw.py", line 155, in text > font =3D self.getfont() > File "C:\python22\PIL\ImageDraw.py", line 61, in getfont > self.font =3D ImageFont.load_path("BDF/courR14.pil") > File "c:\python22\PIL\ImageFont.py", line 136, in load_path > raise IOError, "cannot find font file" > IOError: cannot find font file >=20 > Thanks in advance, Maarten >=20 Ce message et toutes les pi=E8ces jointes (ci-apr=E8s le "message") sont = =E9tablis =E0 l'intention exclusive de ses destinataires et sont confidenti= els. Si vous recevez ce message par erreur, merci de le d=E9truire et d'en = avertir imm=E9diatement l'exp=E9diteur. Toute utilisation de ce message non= conforme =E0 sa destination, modification, diffusion ou toute publication,= totale ou partielle, est interdite, sauf autorisation expresse.FININFO (et= ses filiales) d=E9cline(nt) toute responsabilit=E9 au titre de ce message,= dans l'hypoth=E8se ou il aurait =E9t=E9 modifi=E9, alt=E9r=E9, falsifi=E9 = ou encore =E9dit=E9 ou diffus=E9 sans autorisation. ----------------------------------------------------- This message and any attachments (the "message") is intended solely for the addressees and is confidential. If you receive this=20 message in error, please delete it and immediately notify the=20 sender. Any use not in accord with its purpose, any dissemination=20 or disclosure, either whole or partial, is prohibited except formal=20 approval. Neither FININFO (nor any of its subsidiaries or affiliates)=20 shall be liable for the message if modified, altered, falsified, edited=20 or diffused without authorization.=20 From mihamina.rakotomandimby@laposte.net Mon Apr 28 19:09:18 2003 From: mihamina.rakotomandimby@laposte.net (Rakotomandimby Mihamina) Date: Mon, 28 Apr 2003 20:09:18 +0200 Subject: [Image-SIG] compiling 1.1.3 on slack 9. Message-ID: <20030428200918.02555527.mihamina.rakotomandimby@laposte.net> Hi all , I'm trying to compile Imaging 1.1.3 on a slackware 9 . the first ./configure , make , cd .. steps are OK . but , this is not OK . I'm not very used with Python .. would you help me please ? bash-2.05b# python setup.py build running build running build_py not copying PIL/__init__.py (output up-to-date) not copying PIL/ArgImagePlugin.py (output up-to-date) not copying PIL/BdfFontFile.py (output up-to-date) not copying PIL/BmpImagePlugin.py (output up-to-date) not copying PIL/ContainerIO.py (output up-to-date) not copying PIL/CurImagePlugin.py (output up-to-date) not copying PIL/DcxImagePlugin.py (output up-to-date) not copying PIL/EpsImagePlugin.py (output up-to-date) not copying PIL/FliImagePlugin.py (output up-to-date) not copying PIL/FontFile.py (output up-to-date) not copying PIL/FpxImagePlugin.py (output up-to-date) not copying PIL/GbrImagePlugin.py (output up-to-date) not copying PIL/GdImageFile.py (output up-to-date) not copying PIL/GifImagePlugin.py (output up-to-date) not copying PIL/GimpGradientFile.py (output up-to-date) not copying PIL/GimpPaletteFile.py (output up-to-date) not copying PIL/IcoImagePlugin.py (output up-to-date) not copying PIL/Image.py (output up-to-date) not copying PIL/ImageChops.py (output up-to-date) not copying PIL/ImageDraw.py (output up-to-date) not copying PIL/ImageEnhance.py (output up-to-date) not copying PIL/ImageFile.py (output up-to-date) not copying PIL/ImageFileIO.py (output up-to-date) not copying PIL/ImageFilter.py (output up-to-date) not copying PIL/ImageFont.py (output up-to-date) not copying PIL/ImageOps.py (output up-to-date) not copying PIL/ImagePalette.py (output up-to-date) not copying PIL/ImagePath.py (output up-to-date) not copying PIL/ImageSequence.py (output up-to-date) not copying PIL/ImageStat.py (output up-to-date) not copying PIL/ImageTk.py (output up-to-date) not copying PIL/ImageWin.py (output up-to-date) not copying PIL/ImImagePlugin.py (output up-to-date) not copying PIL/ImtImagePlugin.py (output up-to-date) not copying PIL/IptcImagePlugin.py (output up-to-date) not copying PIL/JpegImagePlugin.py (output up-to-date) not copying PIL/McIdasImagePlugin.py (output up-to-date) not copying PIL/MicImagePlugin.py (output up-to-date) not copying PIL/MpegImagePlugin.py (output up-to-date) not copying PIL/MspImagePlugin.py (output up-to-date) not copying PIL/OleFileIO.py (output up-to-date) not copying PIL/PaletteFile.py (output up-to-date) not copying PIL/PcdImagePlugin.py (output up-to-date) not copying PIL/PcfFontFile.py (output up-to-date) not copying PIL/PcxImagePlugin.py (output up-to-date) not copying PIL/PdfImagePlugin.py (output up-to-date) not copying PIL/PixarImagePlugin.py (output up-to-date) not copying PIL/PngImagePlugin.py (output up-to-date) not copying PIL/PpmImagePlugin.py (output up-to-date) not copying PIL/PsdImagePlugin.py (output up-to-date) not copying PIL/PSDraw.py (output up-to-date) not copying PIL/SgiImagePlugin.py (output up-to-date) not copying PIL/SunImagePlugin.py (output up-to-date) not copying PIL/TarIO.py (output up-to-date) not copying PIL/TgaImagePlugin.py (output up-to-date) not copying PIL/TiffImagePlugin.py (output up-to-date) not copying PIL/TiffTags.py (output up-to-date) not copying PIL/WmfImagePlugin.py (output up-to-date) not copying PIL/XbmImagePlugin.py (output up-to-date) not copying PIL/XpmImagePlugin.py (output up-to-date) not copying PIL/XVThumbImagePlugin.py (output up-to-date) running build_ext skipping '_imaging' extension (up-to-date) building '_imagingtk' extension skipping _imagingtk.c (build/temp.linux-i686-2.2/_imagingtk.o up-to-date) gcc -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fPIC -IlibImaging -I/usr/include/python2.2 -c Tk/tkImaging.c -o build/temp.linux-i686-2.2/tkImaging.o Tk/tkImaging.c: In function `PyImagingPhoto': Tk/tkImaging.c:165: too few arguments to function `Tk_PhotoPutBlock' Tk/tkImaging.c:175: too few arguments to function `Tk_PhotoPutBlock' Tk/tkImaging.c:182: too few arguments to function `Tk_PhotoPutBlock' Tk/tkImaging.c: In function `TkImaging_Init': Tk/tkImaging.c:192: warning: passing arg 3 of `Tcl_CreateCommand' from incompatible pointer type error: command 'gcc' failed with exit status 1 bash-2.05b# -- http://mrakotom.free.fr tel: +33 2 38 76 43 65 France From fredrik@pythonware.com Mon Apr 28 21:20:55 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Mon, 28 Apr 2003 22:20:55 +0200 Subject: [Image-SIG] Re: compiling 1.1.3 on slack 9. References: <20030428200918.02555527.mihamina.rakotomandimby@laposte.net> Message-ID: Rakotomandimby Mihamina wrote: > I'm trying to compile Imaging 1.1.3 on a slackware 9 . > the first ./configure , make , cd .. steps are OK . > but , this is not OK . > gcc -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fPIC > -IlibImaging -I/usr/include/python2.2 -c Tk/tkImaging.c -o > build/temp.linux-i686-2.2/tkImaging.o Tk/tkImaging.c: In function > `PyImagingPhoto': Tk/tkImaging.c:165: too few arguments to function > `Tk_PhotoPutBlock' Tk/tkImaging.c:175: too few arguments to function > `Tk_PhotoPutBlock' Tk/tkImaging.c:182: too few arguments to function > `Tk_PhotoPutBlock' Tk/tkImaging.c: In function `TkImaging_Init': > Tk/tkImaging.c:192: warning: passing arg 3 of `Tcl_CreateCommand' from > incompatible pointer type error: command 'gcc' failed with exit status 1 > bash-2.05b# the Tcl/Tk developers are a bunch of clueless amateurs. for a workaround, see: http://mail.python.org/pipermail/image-sig/2003-April/002177.html From fredrik@pythonware.com Tue Apr 29 11:01:43 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Tue, 29 Apr 2003 12:01:43 +0200 Subject: [Image-SIG] ANN: PIL 1.1.4 beta 1 (source) References: Message-ID: the PIL 1.1.4 beta 1 source kit are now available from: http://effbot.org/downloads#imaging enjoy /F From fredrik@pythonware.com Tue Apr 29 12:00:12 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Tue, 29 Apr 2003 13:00:12 +0200 Subject: [Image-SIG] Re: missing fonts References: <59720C230F8BC54098777277F5E106888E1740@fininfomail.fininfo.grp> Message-ID: "VAN DER HEIJDEN Maarten" wrote: > I tried to write text with ImageDraw. But it seems that the > following file is missing: > "BDF/courR14.pil". > > Somebody knows how to use fonts in PIL? For exemple fonts > already available under windows. PIL's source distribution contains a single sample font, but most binary distributions don't seem to include even that one. you can get a small collection of bitmap fonts from http://effbot.org/download (look for pilfonts) to use a bitmap font, load it using ImageFont.load: font = ImageFont.load("courR14.pil") to use a truetype font (requires PIL 1.1.4), load it using the ImageFont.truetype function: font = ImageFont.truetype("arial.ttf") draw.text(xy, text, font=font) From mvanderheijden@fininfo.fr Tue Apr 29 13:39:13 2003 From: mvanderheijden@fininfo.fr (VAN DER HEIJDEN Maarten) Date: Tue, 29 Apr 2003 14:39:13 +0200 Subject: [Image-SIG] documentation and the arguments one can pass into class methods Message-ID: <59720C230F8BC54098777277F5E10688930852@fininfomail.fininfo.grp> Hello, still being new to PIL, I have a very basic question. How to find the arguments on can pas to methods? Lets take as an example the method : ImageDraw.line(xy, options ) The PIL user guide doesn't give a list of all the options one can pass. Do I need to look in the class definition of ImageDraw or another class used by ImageDraw is using ? I will not send simple questions to this mailing list anymore, if I can find my way in the code or the documentation Thanks in advance, Maarten This message and any attachments (the "message") is intended solely for the addressees and is confidential. If you receive this message in error, please delete it and immediately notify the sender. Any use not in accord with its purpose, any dissemination or disclosure, either whole or partial, is prohibited except formal approval. Neither FININFO (nor any of its subsidiaries or affiliates) shall be liable for the message if modified, altered, falsified, edited or diffused without authorization. From fredrik@pythonware.com Tue Apr 29 13:47:55 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Tue, 29 Apr 2003 14:47:55 +0200 Subject: [Image-SIG] Re: documentation and the arguments one can pass into class methods References: <59720C230F8BC54098777277F5E10688930852@fininfomail.fininfo.grp> Message-ID: "VAN DER HEIJDEN Maarten" wrote: > Lets take as an example the method : ImageDraw.line(xy, options ) The PIL > user guide doesn't give a list of all the options one can pass. here's the text for the line method. note the last paragraph: line(xy, options) draws a line between the coordinates in the xy list. The coordinate list can be any sequence object containing either 2-tuples [ (x, y), ... ] or numeric values [ x, y, ... ]. It should contain at least two coordinates. The fill option gives the colour to use for the line. the 1.1.4 draft handbook contains additional info on option types (see the sections "concepts" and "options"): http://effbot.org/books/imagingbook/imagedraw.htm From mvanderheijden@fininfo.fr Tue Apr 29 13:57:12 2003 From: mvanderheijden@fininfo.fr (VAN DER HEIJDEN Maarten) Date: Tue, 29 Apr 2003 14:57:12 +0200 Subject: [Image-SIG] Re: documentation and the arguments one can pass into class methods Message-ID: <59720C230F8BC54098777277F5E10688930952@fininfomail.fininfo.grp> Thanks, Maarten > -----Message d'origine----- > De: Fredrik Lundh [SMTP:fredrik@pythonware.com] > Date: 29 avr. 03 14:48 > =C0: image-sig@python.org > Objet: [Image-SIG] Re: documentation and the arguments one can pass > into class methods >=20 > "VAN DER HEIJDEN Maarten" wrote: >=20 > > Lets take as an example the method : ImageDraw.line(xy, options ) The > PIL > > user guide doesn't give a list of all the options one can pass. >=20 > here's the text for the line method. note the last paragraph: >=20 > line(xy, options) draws a line between the coordinates in > the xy list. >=20 > The coordinate list can be any sequence object containing > either 2-tuples [ (x, y), ... ] or numeric values [ x, y, ... ]. > It should contain at least two coordinates. >=20 > The fill option gives the colour to use for the line. >=20 > the 1.1.4 draft handbook contains additional info on option types > (see the sections "concepts" and "options"): >=20 > http://effbot.org/books/imagingbook/imagedraw.htm >=20 > >=20 >=20 >=20 >=20 > _______________________________________________ > Image-SIG maillist - Image-SIG@python.org > http://mail.python.org/mailman/listinfo/image-sig Ce message et toutes les pi=E8ces jointes (ci-apr=E8s le "message") sont = =E9tablis =E0 l'intention exclusive de ses destinataires et sont confidenti= els. Si vous recevez ce message par erreur, merci de le d=E9truire et d'en = avertir imm=E9diatement l'exp=E9diteur. Toute utilisation de ce message non= conforme =E0 sa destination, modification, diffusion ou toute publication,= totale ou partielle, est interdite, sauf autorisation expresse.FININFO (et= ses filiales) d=E9cline(nt) toute responsabilit=E9 au titre de ce message,= dans l'hypoth=E8se ou il aurait =E9t=E9 modifi=E9, alt=E9r=E9, falsifi=E9 = ou encore =E9dit=E9 ou diffus=E9 sans autorisation. ----------------------------------------------------- This message and any attachments (the "message") is intended solely for the addressees and is confidential. If you receive this=20 message in error, please delete it and immediately notify the=20 sender. Any use not in accord with its purpose, any dissemination=20 or disclosure, either whole or partial, is prohibited except formal=20 approval. Neither FININFO (nor any of its subsidiaries or affiliates)=20 shall be liable for the message if modified, altered, falsified, edited=20 or diffused without authorization.=20 From dereks@realloc.net Wed Apr 30 05:16:05 2003 From: dereks@realloc.net (Derek Simkowiak) Date: Tue, 29 Apr 2003 21:16:05 -0700 Subject: [Image-SIG] MiniTest/test.py failure Message-ID: <3EAF4E05.5090409@realloc.net> It looks to me like MiniTest/test.py is broken. I was able to compile and install successfully. I haven't used PIL yet but the whole build looked good: [dereks@localhost dereks]$ python Python 2.2.2 (#2, Feb 5 2003, 10:40:08) [GCC 3.2.1 (Mandrake Linux 9.1 3.2.1-5mdk)] on linux-i386 Type "help", "copyright", "credits" or "license" for more information. >>> import _imaging >>> import Image >>> I didn't see any errors during the build or installation. And yet: [dereks@localhost Imaging-1.1.3]$ python MiniTest/test.py ***************************************************************** Failure in example: type(im.im) # internal image attribute from line #31 of test.testimage Expected: Got: 1 items had failures: 1 of 40 in test.testimage ***Test Failed*** 1 failures. *** 1 tests of 40 failed. This looks like the kind of failure I can safely ignore. Is that correct? Thank You, Derek Simkowiak From fredrik@pythonware.com Wed Apr 30 06:36:27 2003 From: fredrik@pythonware.com (Fredrik Lundh) Date: Wed, 30 Apr 2003 07:36:27 +0200 Subject: [Image-SIG] Re: MiniTest/test.py failure References: <3EAF4E05.5090409@realloc.net> Message-ID: Derek Simkowiak wrote: > It looks to me like MiniTest/test.py is broken. I was able to compile > and install successfully. I haven't used PIL yet but the whole build > looked good: > > [dereks@localhost dereks]$ python > Python 2.2.2 (#2, Feb 5 2003, 10:40:08) > [GCC 3.2.1 (Mandrake Linux 9.1 3.2.1-5mdk)] on linux-i386 > Type "help", "copyright", "credits" or "license" for more information. > >>> import _imaging > >>> import Image > >>> > > I didn't see any errors during the build or installation. And yet: > > [dereks@localhost Imaging-1.1.3]$ python MiniTest/test.py > ***************************************************************** > Failure in example: type(im.im) # internal image attribute > from line #31 of test.testimage > Expected: > Got: > 1 items had failures: > 1 of 40 in test.testimage > ***Test Failed*** 1 failures. > *** 1 tests of 40 failed. > > This looks like the kind of failure I can safely ignore. Is that correct? this problem only occurs if you run the test suite under 2.2. you can safely ignore it. From dereks@realloc.net Wed Apr 30 23:00:20 2003 From: dereks@realloc.net (Derek Simkowiak) Date: Wed, 30 Apr 2003 15:00:20 -0700 Subject: [Image-SIG] Image.putpalette() bug Message-ID: <3EB04774.2060908@realloc.net> This is a multi-part message in MIME format. --------------040708060501040601070102 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit I was testing my WalImagePlugin.py file, and got a strange message when I tried to "show()" it: [dereks@localhost src]$ cat wal_test.py #!/usr/bin/env python import Image import WalImagePlugin wal_image = Image.open('PAK_DATA/textures/e1u1/basemap.wal') wal_image.show() [dereks@localhost src]$ ./wal_test.py Traceback (most recent call last): File "./wal_test.py", line 7, in ? wal_image.show() File "/usr/lib/python2.2/site-packages/PIL/Image.py", line 770, in show _showxv(self, title, command) File "/usr/lib/python2.2/site-packages/PIL/Image.py", line 1079, in _showxv file = self.convert(base)._dump(format=format) File "/usr/lib/python2.2/site-packages/PIL/Image.py", line 345, in _dump self.load() File "/usr/lib/python2.2/site-packages/PIL/Image.py", line 414, in load self.im.putpalette(self.palette.rawmode, self.palette.data) ValueError: unrecognized image mode [dereks@localhost src]$ I did some digging and found this: [root@localhost PIL]# grep -n "putpalette(" Image.py 414: self.im.putpalette(self.palette.rawmode, self.palette.data) 663: def putpalette(self, data, rawmode="RGB"): Notice that in load(), where my test dies, it passes rawmode as arg1 and data as arg2. But in the method definition, data is arg1 and rawmode is arg2. The file WmfImagePlugin.py also calls putpalette() with (rawmode, data) instead of the other way around. So I did the following change, hoping to fix my problem: [root@localhost PIL]# diff -w ./Image.py ./Image-dist.py 414c414 < self.im.putpalette(self.palette.data, self.palette.rawmode) --- > self.im.putpalette(self.palette.rawmode, self.palette.data) But it did not. I noticed that the string "unrecognized image mode" is only in the c module "_imaging.so", under the C string constant "wrong_mode", and not in the Python code. In _imaging.c, I found this: _putpalette(ImagingObject* self, PyObject* args) { [...] if (!PyArg_ParseTuple(args, "ss#", &rawmode, &palette, &palettesize)) return NULL; if (strcmp(self->image->mode, "L") != 0 && strcmp(self->image->mode, "P")) { PyErr_SetString(PyExc_ValueError, wrong_mode); return NULL; } [...] } It looks like the C module still expects rawmode first, and palette second. Presumably, we need rawmode to be second, so that we can use the default arg of "RGB". So I made this change: [root@localhost Imaging-1.1.3]# diff ./_imaging.c _imaging-dist.c 1080c1080 < if (!PyArg_ParseTuple(args, "s#s", &palette, &palettesize, &rawmode)) --- > if (!PyArg_ParseTuple(args, "ss#", &rawmode, &palette, &palettesize)) That is, I changed the C code to match the arg list "putpalette()" in Image.py. Unfortunately, it did not fix my problem. after a recompile, I still get the same results: [dereks@localhost src]$ ./wal_test.py Traceback (most recent call last): File "./wal_test.py", line 7, in ? wal_image.show() File "/usr/lib/python2.2/site-packages/PIL/Image.py", line 770, in show _showxv(self, title, command) File "/usr/lib/python2.2/site-packages/PIL/Image.py", line 1079, in _showxv file = self.convert(base)._dump(format=format) File "/usr/lib/python2.2/site-packages/PIL/Image.py", line 345, in _dump self.load() File "/usr/lib/python2.2/site-packages/PIL/Image.py", line 414, in load self.im.putpalette(self.palette.data, self.palette.rawmode) ValueError: unrecognized image mode [dereks@localhost src]$ A little more investigation revealed that the reason I'm getting the "ValueError: unrecognized image mode" is that in _imaging.c, in the function _putpalette(), at this test at the beginning of the function: if (strcmp(self->image->mode, "L") != 0 && strcmp(self->image->mode, "P")) { PyErr_SetString(PyExc_ValueError, wrong_mode); return NULL; } ...the value of self->image->mode is "RGB", which, being neither "L" nor "P", results in the exception. I do not know why it is "RGB", or what function sets it to that. But it seems that there are two problems with the code: First, inconsistent argument order for "putpalette()". Here are the diffs that I think will fix this first problem, which will allow "RGB" to be the default value of the second argument: [root@localhost PIL]# diff Image.py Image-dist.py 414c414 < self.im.putpalette(self.palette.data, self.palette.rawmode) --- > self.im.putpalette(self.palette.rawmode, self.palette.data) [root@localhost PIL]# diff WmfImagePlugin.py WmfImagePlugin-dist.py 271c271 < self.im.putpalette(string.join(palette, ""), "RGB") --- > self.im.putpalette("RGB", string.join(palette, "")) [root@localhost PIL]# cd .. [root@localhost Imaging-1.1.3]# diff _imaging.c _imaging-dist.c 1080c1080 < if (!PyArg_ParseTuple(args, "s#s", &palette, &palettesize, &rawmode)) --- > if (!PyArg_ParseTuple(args, "ss#", &rawmode, &palette, &palettesize)) [root@localhost Imaging-1.1.3]# The second problem is the question, why can my Image have "self->image->mode" set to "RGB" when I hit the function "putpalette()" in _imaging.c? This one I have not been able to find yet, but appears to be a bug within PIL itself, since the _open() of my WalImagePlugin explicitly sets self->mode to "P". Note: I have attached WalImagePlugin.py for reference, but I do not expect the problem to be there. Note2: I'll post my WalImagePlugin.py to this list again when it is tested, and includes support for the Quake 33% and 66% transparency flag. Please advise. Thank You, Derek Simkowiak --------------040708060501040601070102 Content-Type: text/plain; name="WalImagePlugin.py" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="WalImagePlugin.py" #!/usr/bin/env python import Image, ImageFile import string # Turns character byte data read from disk into an integer value. # c is a PyString (of byte data), o is offset from the beginning def i32(c, o=0): return ord(c[o])+(ord(c[o+1])<<8)+(ord(c[o+2])<<16)+(ord(c[o+3])<<24) class WalImageFile(ImageFile.ImageFile): format = "WAL" format_description = "Id Software Quake WAL texture map" def _open(self): # The Quake2 default pallete is normally found # in the file "pics/colormap.pcx" within PAK0.PAK. # The palette is a list of 768 colour values, # given as [R, G, B, R, G, B, ...] self.mode = "P" # Pallete mode header = self.fp.read(32+24+32+12) self.size = i32(header, 32), i32(header, 36) offset = i32(header, 40) region = (0, 0) + self.size parameters = (self.mode, 0, 1) # A one-element list: self.tile = [ ("raw", region, offset, parameters), ] # Set WAL-specific information from the header: # (Note: strings are null-terminated) self.info["name"] = header[:32].split("\0", 1)[0] self.info["next_name"] = header[56:56+32].split("\0", 1)[0] self.info["flags"] = i32(header, (32+24+32) + 0) self.info["contents"] = i32(header, (32+24+32) + 4) self.info["value"] = i32(header, (32+24+32) + 8) def load_end(self): self.putpalette(QUAKE2PALETTE) Image.register_open("WAL", WalImageFile) Image.register_extension("WAL", ".wal") QUAKE2PALETTE = ( "\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" "\x1e\x1e\x22\x22\x22\x26\x26\x26\x29\x29\x29\x2c\x2c\x2c\x2f\x2f" "\x2f\x32\x32\x32\x35\x35\x35\x37\x37\x37\x3a\x3a\x3a\x3c\x3c\x3c" "\x24\x1e\x13\x22\x1c\x12\x20\x1b\x12\x1f\x1a\x10\x1d\x19\x10\x1b" "\x17\x0f\x1a\x16\x0f\x18\x14\x0d\x17\x13\x0d\x16\x12\x0d\x14\x10" "\x0b\x13\x0f\x0b\x10\x0d\x0a\x0f\x0b\x0a\x0d\x0b\x07\x0b\x0a\x07" "\x23\x23\x26\x22\x22\x25\x22\x20\x23\x21\x1f\x22\x20\x1e\x20\x1f" "\x1d\x1e\x1d\x1b\x1c\x1b\x1a\x1a\x1a\x19\x19\x18\x17\x17\x17\x16" "\x16\x14\x14\x14\x13\x13\x13\x10\x10\x10\x0f\x0f\x0f\x0d\x0d\x0d" "\x2d\x28\x20\x29\x24\x1c\x27\x22\x1a\x25\x1f\x17\x38\x2e\x1e\x31" "\x29\x1a\x2c\x25\x17\x26\x20\x14\x3c\x30\x14\x37\x2c\x13\x33\x28" "\x12\x2d\x24\x10\x28\x1f\x0f\x22\x1a\x0b\x1b\x14\x0a\x13\x0f\x07" "\x31\x1a\x16\x30\x17\x13\x2e\x16\x10\x2c\x14\x0d\x2a\x12\x0b\x27" "\x0f\x0a\x25\x0f\x07\x21\x0d\x01\x1e\x0b\x01\x1c\x0b\x01\x1a\x0b" "\x01\x18\x0a\x01\x16\x0a\x01\x13\x0a\x01\x10\x07\x01\x0d\x07\x01" "\x29\x23\x1e\x27\x21\x1c\x26\x20\x1b\x25\x1f\x1a\x23\x1d\x19\x21" "\x1c\x18\x20\x1b\x17\x1e\x19\x16\x1c\x18\x14\x1b\x17\x13\x19\x14" "\x10\x17\x13\x0f\x14\x10\x0d\x12\x0f\x0b\x0f\x0b\x0a\x0b\x0a\x07" "\x26\x1a\x0f\x23\x19\x0f\x20\x17\x0f\x1c\x16\x0f\x19\x13\x0d\x14" "\x10\x0b\x10\x0d\x0a\x0b\x0a\x07\x33\x22\x1f\x35\x29\x26\x37\x2f" "\x2d\x39\x35\x34\x37\x39\x3a\x33\x37\x39\x30\x34\x36\x2b\x31\x34" "\x27\x2e\x31\x22\x2b\x2f\x1d\x28\x2c\x17\x25\x2a\x0f\x20\x26\x0d" "\x1e\x25\x0b\x1c\x22\x0a\x1b\x20\x07\x19\x1e\x07\x17\x1b\x07\x14" "\x18\x01\x12\x16\x01\x0f\x12\x01\x0b\x0d\x01\x07\x0a\x01\x01\x01" "\x2c\x21\x21\x2a\x1f\x1f\x29\x1d\x1d\x27\x1c\x1c\x26\x1a\x1a\x24" "\x18\x18\x22\x17\x17\x21\x16\x16\x1e\x13\x13\x1b\x12\x12\x18\x10" "\x10\x16\x0d\x0d\x12\x0b\x0b\x0d\x0a\x0a\x0a\x07\x07\x01\x01\x01" "\x2e\x30\x29\x2d\x2e\x27\x2b\x2c\x26\x2a\x2a\x24\x28\x29\x23\x27" "\x27\x21\x26\x26\x1f\x24\x24\x1d\x22\x22\x1c\x1f\x1f\x1a\x1c\x1c" "\x18\x19\x19\x16\x17\x17\x13\x13\x13\x10\x0f\x0f\x0d\x0b\x0b\x0a" "\x30\x1e\x1b\x2d\x1c\x19\x2c\x1a\x17\x2a\x19\x14\x28\x17\x13\x26" "\x16\x10\x24\x13\x0f\x21\x12\x0d\x1f\x10\x0b\x1c\x0f\x0a\x19\x0d" "\x0a\x16\x0b\x07\x12\x0a\x07\x0f\x07\x01\x0a\x01\x01\x01\x01\x01" "\x28\x29\x38\x26\x27\x36\x25\x26\x34\x24\x24\x31\x22\x22\x2f\x20" "\x21\x2d\x1e\x1f\x2a\x1d\x1d\x27\x1b\x1b\x25\x19\x19\x21\x17\x17" "\x1e\x14\x14\x1b\x13\x12\x17\x10\x0f\x13\x0d\x0b\x0f\x0a\x07\x07" "\x2f\x32\x29\x2d\x30\x26\x2b\x2e\x24\x29\x2c\x21\x27\x2a\x1e\x25" "\x28\x1c\x23\x26\x1a\x21\x25\x18\x1e\x22\x14\x1b\x1f\x10\x19\x1c" "\x0d\x17\x1a\x0a\x13\x17\x07\x10\x13\x01\x0d\x0f\x01\x0a\x0b\x01" "\x01\x3f\x01\x13\x3c\x0b\x1b\x39\x10\x20\x35\x14\x23\x31\x17\x23" "\x2d\x18\x23\x29\x18\x3f\x3f\x3f\x3f\x3f\x39\x3f\x3f\x31\x3f\x3f" "\x2a\x3f\x3f\x20\x3f\x3f\x14\x3f\x3c\x12\x3f\x39\x0f\x3f\x35\x0b" "\x3f\x32\x07\x3f\x2d\x01\x3d\x2a\x01\x3b\x26\x01\x39\x21\x01\x37" "\x1d\x01\x34\x1a\x01\x32\x16\x01\x2f\x12\x01\x2d\x0f\x01\x2a\x0b" "\x01\x27\x07\x01\x23\x01\x01\x1d\x01\x01\x17\x01\x01\x10\x01\x01" "\x3d\x01\x01\x19\x19\x3f\x3f\x01\x01\x01\x01\x3f\x16\x16\x13\x10" "\x10\x0f\x0d\x0d\x0b\x3c\x2e\x2a\x36\x27\x20\x30\x21\x18\x29\x1b" "\x10\x3c\x39\x37\x37\x32\x2f\x31\x2c\x28\x2b\x26\x21\x30\x22\x20" ) --------------040708060501040601070102--