zimeon / iiif

IIIF Image API reference implementation and Python library
GNU General Public License v3.0
55 stars 15 forks source link

PIL converter fails to handle mode 'I;16B' TIF image #19

Closed zimeon closed 8 years ago

zimeon commented 8 years ago

Reported by @jgreidy:

lib-5433-1:sharedshelf-to-solr jgr25$ php image-to-iiif-s3-test.php --save
--s3path 190/1406367 --force -s 1406367
image url:
Array
(
    [url] => 
http://stor.artstor.org/stor/41f7f2fd-4df0-4d02-a056-ac0f584be3f7
    [ext] => tif
)
Traceback (most recent call last):
  File "/cul/share/iiif/iiif/iiif_static.py", line 82, in <module>
    main()
  File "/cul/share/iiif/iiif/iiif_static.py", line 73, in main
    sg.generate(source, identifier=opt.identifier)
  File "/cul/share/iiif/iiif/iiif/static.py", line 162, in generate
    self.generate_tile(region,size)
  File "/cul/share/iiif/iiif/iiif/static.py", line 183, in generate_tile
    m.derive(srcfile=self.src, request=r,
outfile=os.path.join(self.dst,path))
  File "/cul/share/iiif/iiif/iiif/manipulator.py", line 114, in derive
    self.do_format(self.request.format)
  File "/cul/share/iiif/iiif/iiif/manipulator_pil.py", line 127, in
do_format
    self.image.save(self.outfile,format=format)
  File "build/bdist.macosx-10.9-intel/egg/PIL/Image.py", line 1693, in save
  File "build/bdist.macosx-10.9-intel/egg/PIL/JpegImagePlugin.py", line
571, in _save
IOError: cannot write mode I;16B as JPEG
Caught exception: Error Processing iiif: Command failed: python
/cul/share/iiif/iiif/iiif_static.py --api-version 2.0 -d
/tmp/image-to-iiif-s3/190/1406367/iiif -p
https://s3.amazonaws.com/sharedshelftosolr.library.cornell.edu/public/190/1
406367 /tmp/image-to-iiif-s3/190/1406367/image.tif
zimeon commented 8 years ago

Have repeated the problem with current head of image_api_2.1 branch:

(py3)simeon@RottenApple iiif>wget http://stor.artstor.org/stor/41f7f2fd-4df0-4d02-a056-ac0f584be3f7
...
2016-05-24 13:11:16 (3.26 MB/s) - '41f7f2fd-4df0-4d02-a056-ac0f584be3f7' saved [15036896/15036896]
(py3)simeon@RottenApple iiif>file 41f7f2fd-4df0-4d02-a056-ac0f584be3f7 
41f7f2fd-4df0-4d02-a056-ac0f584be3f7: TIFF image data, big-endian
(py3)simeon@RottenApple iiif>rm -rf /tmp; iiif_static.py --dst=/tmp 41f7f2fd-4df0-4d02-a056-ac0f584be3f7 
rm: /tmp: Permission denied
iiif_static.py: source file: 41f7f2fd-4df0-4d02-a056-ac0f584be3f7
Traceback (most recent call last):
  File "/Users/simeon/miniconda3/envs/py3/lib/python3.5/site-packages/PIL/JpegImagePlugin.py", line 580, in _save
    rawmode = RAWMODE[im.mode]
KeyError: 'I;16B'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
...
  File "/Users/simeon/miniconda3/envs/py3/lib/python3.5/site-packages/iiif-0.6.1-py3.5.egg/iiif/static.py", line 207, in generate
    self.generate_tile(region,size)
  File "/Users/simeon/miniconda3/envs/py3/lib/python3.5/site-packages/iiif-0.6.1-py3.5.egg/iiif/static.py", line 259, in generate_tile
    m.derive(srcfile=self.src, request=r, outfile=os.path.join(self.dst,path))
  File "/Users/simeon/miniconda3/envs/py3/lib/python3.5/site-packages/iiif-0.6.1-py3.5.egg/iiif/manipulator.py", line 113, in derive
    self.do_format(self.request.format)
  File "/Users/simeon/miniconda3/envs/py3/lib/python3.5/site-packages/iiif-0.6.1-py3.5.egg/iiif/manipulator_pil.py", line 166, in do_format
    self.image.save(self.outfile,format=format)
  File "/Users/simeon/miniconda3/envs/py3/lib/python3.5/site-packages/PIL/Image.py", line 1687, in save
    save_handler(self, fp, filename)
  File "/Users/simeon/miniconda3/envs/py3/lib/python3.5/site-packages/PIL/JpegImagePlugin.py", line 582, in _save
    raise IOError("cannot write mode %s as JPEG" % im.mode)
OSError: cannot write mode I;16B as JPEG
(py3)simeon@RottenApple iiif>
zimeon commented 8 years ago

Have added mode conversions in PIL in e8b306c, example above now OK:

(py3)simeon@RottenApple iiif>rm -rf /tmp/dst; ./iiif_static.py --dst=/tmp 41f7f2fd-4df0-4d02-a056-ac0f584be3f7 
iiif_static.py: source file: 41f7f2fd-4df0-4d02-a056-ac0f584be3f7
iiif.static: /tmp / 41f7f2fd-4df0-4d02-a056-ac0f584be3f7/0,0,512,512/512,/0/default.jpg
iiif.static: /tmp / 41f7f2fd-4df0-4d02-a056-ac0f584be3f7/0,512,512,512/512,/0/default.jpg
iiif.static: /tmp / 41f7f2fd-4df0-4d02-a056-ac0f584be3f7/0,1024,512,512/512,/0/default.jpg
iiif.static: /tmp / 41f7f2fd-4df0-4d02-a056-ac0f584be3f7/0,1536,512,512/512,/0/default.jpg
iiif.static: /tmp / 41f7f2fd-4df0-4d02-a056-ac0f584be3f7/0,2048,512,512/512,/0/default.jpg
iiif.static: /tmp / 41f7f2fd-4df0-4d02-a056-ac0f584be3f7/0,2560,512,512/512,/0/default.jpg
...
iiif.static: /tmp / 41f7f2fd-4df0-4d02-a056-ac0f584be3f7/info.json

Where to get some test files? Perhaps look at https://github.com/python-pillow/Pillow/tree/master/Tests/images ... but then have to think what to do about PIL license.

zimeon commented 8 years ago

This is fixed with v1.0.1 on pypi, have tested with a nice fresh install.