36

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

OSError: イメージ ファイル <_io.BytesIO object at 0x103a47468> を識別できません

画像を開こうとすると。私はpython 3.4でvirtualenvを使用しており、PILをインストールしていません。

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

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 になっているはずです。

4

5 に答える 5

1

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 )

于 2018-08-15T00:14:01.570 に答える