it-swarm.com.de

PIL kann den Modus F nicht in JPEG schreiben

Ich mache ein JPG-Bild und verwende numpys fft2, um ein neues Bild zu erstellen/zu speichern. Dieser Fehler wird jedoch ausgelöst

"IOError: cannot write mode F as JPEG" 

Gibt es ein Problem mit CMYK- und JPEG-Dateien in PIL ???

p = Image.open('kibera.jpg')
bw_p = p.convert('L')
array_p = numpy.asarray(bw_p)
fft_p = abs(numpy.fft.rfft2(array_p))
new_p = Image.fromarray(fft_p)
new_p.save('kibera0.jpg')
new_p.histogram()
36
JHHP

Versuchen Sie, das Bild in RGB zu konvertieren:

...
new_p = Image.fromarray(fft_p)
if new_p.mode != 'RGB':
    new_p = new_p.convert('RGB')
...
45
semente

Die Antwort von Semente ist richtig für Farbbilder. Für Graustufenbilder können Sie Folgendes verwenden: -

new_p = Image.fromarray(fft_p)
new_p = new_p.convert("L")

Wenn Sie new_p = new_p.convert('RGB') für ein Graustufenbild verwenden, hat das Bild immer noch eine Tiefe von 24 Bit anstelle von 8 Bit und würde die dreifache Größe auf der Festplatte einnehmen, und es wird kein echtes Graustufenbild sein.

20

Ich denke, es kann sein, dass Ihr fft_p Array ist vom Typ Float und das Bild sollte jedes Pixel im Format 0-255 (uint8) haben. Vielleicht können Sie dies versuchen, bevor Sie das Bild aus dem Array erstellen:

fft_p = fft_p.astype(np.uint8)
new_p = Image.fromarray(fft_p)

Beachten Sie jedoch, dass jedes Element im fft_p Das Array sollte im Bereich von 0 bis 255 liegen. Möglicherweise müssen Sie dies vorher verarbeiten, um die gewünschten Ergebnisse zu erzielen. Wenn beispielsweise jedes Element ein Gleitkommawert zwischen 0 und 1 ist, können Sie es mit 255 multiplizieren.

1
xhenryx14