2

Hello I am using the Python Imaging Library to make a small conversion to an image. The image is a raw binary file with 16 bit unsigned integers. For some reason I cannot get python to work it keeps giving me the following 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 is as follows:

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)

Again my image is a grayscale 16 bit unsigned integers around 11 mbs and written in hexadecimal.

Thanks!

UPDATE:

Code that worked to save file:

def save(filename, contents):  
   fh = open(filename, 'w')  
   fh.write(contents)  
   fh.close() 

save(saveFile, final)
clifgray
  • 4,313
  • 11
  • 67
  • 116
  • What happened? I thought the answer I gave you yesterday worked: http://stackoverflow.com/a/10902279/5987 – Mark Ransom Jun 07 '12 at 17:03
  • @MarkRansom I was switching things around and your code worked great when I just wanted to display it but when I try to save it I cannot do it in the same file format that I wanted to originally. – clifgray Jun 07 '12 at 17:32

1 Answers1

0

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')
Mark Ransom
  • 299,747
  • 42
  • 398
  • 622
  • okay and it works fine when I put the saveFile in as a .png but I have to have it as a .bin to be able to do the next step of processing which is putting it through a bayer filter. so your answer is right but my question is a little more complex than I initially stated – clifgray Jun 07 '12 at 17:43
  • using some of your comments and adding a little bit extra I was able to save the file. Haha now I just need to figure out how to get it to work as L;16B as opposed to just L but that is for another question. – clifgray Jun 08 '12 at 17:58