pythonimagepython-imaging-librarybinary-datagrayscale

What mode for a 16 bit unsigned raw binary image file?


Using the Python Imaging Library to make a conversion to an image I get an error:

    Traceback (most recent call last):
  File "C:\Users\Patrick\workspace\colorCorrect\src\editGrayscale.py", line 24, in <module>
    changed.save(saveFile)
  File "C:\Python27\lib\site-packages\PIL\Image.py", line 1423, in save
    raise KeyError(ext) # unknown extension
KeyError: '.bin'

My code:

import Image
#file to save:  C:\Users\name\imagedata\visiblespec.bin

fileName = raw_input("Enter a file name: ")
saveFile = raw_input("Enter a new save file name: ")

with open(fileName, 'rb') as f:
im = Image.fromstring('L', (3032, 2016), f.read()) # also try 'L;16B', 'I;16', and 'I;16B'
changed = im.point(lambda i: i/2)
changed.save(saveFile)

Image is a grayscale 16 bit unsigned integer 11 MB binary file.


Solution

  • All of the valid modes for PIL are listed in the source file unpack.c, near the bottom of the file. I'd start with the ones containing 16.

    Given your edits there are other problems. First is that PIL.Image needs to determine an encoder for writing out the file, and it does this using the filename extension. Your .bin file extension is non-standard so there's no way to know which format to use. Try something like .png.

    Second problem is that not every file type supports every image format. You may need to convert the image before you save it.

    changed.convert('L').save(saveFile)
    

    Given your last comment you just want to write the values back out to a raw format file. You can try the 'raw' format or just use tostring to write to a file yourself.

    changed.save(saveFile, 'raw')