python - Hvorfor får jeg 'Ikke nok Image Data' fra Pillow på Windows, mens den samme kode fungerer godt på Linux?

Indlæg af Hanne Mølgaard Plasc

Problem



Vi forsøger at porte støttefilen af ​​en hjemmearbejdsopgave, der kører godt på Linux til Windows. En del af opgaven kræver, at eleverne manipulerer røde billeddata, og supportfilerne bruger Python til at konvertere mellem rå data og billedfiler. Koden til konvertering af billedfiler til rå data er:


import os, sys
from PIL import Image
from struct import *

fileName = sys.argv[1]
try:
    myImg = Image.open(fileName)
    width,height = myImg.size
    sys.stdout.write(pack("ii",width,height))
    rgbImg = myImg.convert("RGB")
    pixels = rgbImg.getdata()
    for (r,g,b) in pixels:
        sys.stdout.write(pack("BBB", r,g,b)) 
except IOError, e:
    print >> sys.stderr, "\%s: \%s

Cannot open or understand \%s" \% (sys.argv[0], str(e), fileName)


Mens koden til konvertering er:


import os, sys
from PIL import Image
from struct import *

fileName = sys.argv[1]
try:
    dimensions = sys.stdin.read(2*4)
    width,height = unpack("ii", dimensions)

    pixels = sys.stdin.read(3*width*height)
    myImg = Image.frombytes("RGB", (width, height), pixels, "raw", "RGB", 0, 1)
    myImg.save(fileName, "PNG")
except IOError, e:
    print >> sys.stderr, "\%s: \%s

Cannot open or write to \%s" \% (sys.argv[0], str(e), fileName)


Standardudgange og -indgange omdirigeres til filer i testcenterets kode. Koden fungerer fint på Linux, men fungerer ikke godt på Windows. Vi får altid følgende fejl, når vi prøver at skrive billedfiler på Windows:


Traceback (most recent call last):
  File "image-rewrite.py", line 16, in <module>
    myImg = Image.frombytes("RGB", (width, height), pixels, "raw", "RGB", 0, 1)
  File "C:Python27libsite-packagesPILImage.py", line 2100, in frombytes
    im.frombytes(data, decoder\_name, args)
  File "C:Python27libsite-packagesPILImage.py", line 742, in frombytes
    raise ValueError("not enough image data")
ValueError: not enough image data


Har du nogen ide om, hvad der er galt foregår? Mange tak.

Bedste reference


Brug af stdin/stdout til at sende binære data på Windows er en dårlig idé. Windows bruger CRLF (' ') som slutningen af ​​linjemarkøren, og det bliver oversat til på input og oversat tilbage på output; denne oversættelsesproces kan spille kaos med binære data.


I stedet skal du bruge navngivne filer og åbne dem i binær tilstand.





BTW, i Python 3 kan du ikke læse/skrive binære data direkte fra/til sys.stdin/sys.stdout, selv på Linux. I stedet skal du bruge read/write metoderne til sys.stdin.buffer/sys.stdout.buffer.