web-dev-qa-db-ja.com

PILはio.BytesIOオブジェクトの画像ファイルを識別できません

PILの枕フォークを使用していますが、エラーが発生し続けます

OSError:0x103a47468の画像ファイル<_io.BytesIOオブジェクトを識別できません

画像を開こうとしたとき。 python 3.4でPILをインストールせずにvirtualenvを使用しています。

私は同じ問題に遭遇した他の人に基づいてこれの解決策を見つけようとしましたが、それらの解決策は私にとってはうまくいきませんでした。これが私のコードです:

from PIL import Image
import io

# This portion is part of my test code
byteImg = Image.open("some/location/to/a/file/in/my/directories.png").tobytes()

# Non test code
dataBytesIO = io.BytesIO(byteImg)
Image.open(dataBytesIO) # <- Error here

画像はファイルを最初に開いたときに存在し、バイトに変換されます。これは他のほとんどすべての人に効果があるようですが、なぜ失敗するのかわかりません。

編集:

dataBytesIO.seek(0)

ストリーム経由で画像を保存していないので、解決策としては機能しません(試してみました)。BytesIOをデータでインスタンス化しているだけなので、(これを正しく考えていれば)シークはすでに0になっているはずです。

18
Elan M

(この解決策は著者自身によるものです。ここに移動しました。)

解決:

_# This portion is part of my test code
byteImgIO = io.BytesIO()
byteImg = Image.open("some/location/to/a/file/in/my/directories.png")
byteImg.save(byteImgIO, "PNG")
byteImgIO.seek(0)
byteImg = byteImgIO.read()


# Non test code
dataBytesIO = io.BytesIO(byteImg)
Image.open(dataBytesIO)
_

問題は、Image.tobytes()がバイトオブジェクトを返す方法にありました。それは無効なデータであるように見え、ほとんどすべてのバイトが_\xff\_の形式で現れたため、「エンコーディング」はraw以外にできず、誤ったデータを出力するように見えました。ただし、BytesIOを介してバイトを保存し、.read()関数を使用してイメージ全体を読み取ると、後で必要になったときに実際に使用できる正しいバイトが得られました。

21
sdikby

Dicomファイルの読み取り中に、Dicom圧縮が原因で問題が発生する可能性があります。 gdcmとpydicomの両方がインストールされていることを確認してください。

GDCMは通常、インストールがより難しいものです。同じものを簡単にインストールする最新の方法は

conda install -U conda-forge gdcm
1
SinghG

CR2などのRaw画像ファイルを処理しているときに、同じエラーが発生する場合があります。例: http://www.rawsamples.ch/raws/Canon/g10/RAW_Canon_G10.CR2

実行しようとすると:

byteImg = Image.open("RAW_Canon_G10.CR2")

このエラーが発生します:

OSError: cannot identify image file 'RAW_Canon_G10.CR2'

最初にrawkitを使用して画像を変換する必要があります。これを行う方法の例を次に示します。

from io import BytesIO
from PIL import Image, ImageFile
import numpy
from rawkit import raw
def convert_cr2_to_jpg(raw_image):
    raw_image_process = raw.Raw(raw_image)
    buffered_image = numpy.array(raw_image_process.to_buffer())
    if raw_image_process.metadata.orientation == 0:
        jpg_image_height = raw_image_process.metadata.height
        jpg_image_width = raw_image_process.metadata.width
    else:
        jpg_image_height = raw_image_process.metadata.width
        jpg_image_width = raw_image_process.metadata.height
    jpg_image = Image.frombytes('RGB', (jpg_image_width, jpg_image_height), buffered_image)
    return jpg_image

byteImg = convert_cr2_to_jpg("RAW_Canon_G10.CR2")

GitHubのmateusz-michalikの場合はコードクレジット( https://github.com/mateusz-michalik/cr2-to-jpg/blob/master/cr2-to-jpg.py

0