2017-09-13 286 views
0

ウェブから画像を取得し、Amazon s3にアップロードしたいと考えています。その間、画像の大きさを確認したいと思います。 は、私は、Python 3に次のコードを持っている:PIL画像オブジェクトをAmazon S3 pythonにアップロード

from PIL import Image 
import requests 

# Get response 
response = requests.get(url, stream= True) 

# Open image 
im = Image.open(response.raw) 

# Get size 
size = im.size 

# Upload image to s3 
S3.Client.upload_fileobj(
    im, # This is what i am trying to upload 
    AWS_BUCKET_NAME, 
    key, 
    ExtraArgs={ 
     'ACL': 'public-read' 
    } 
) 

問題はPILの画像オブジェクトは読まサポートしていないということです。 PIL Imageオブジェクトimをアップロードしようとすると、次のエラーが発生します。

ValueError: Fileobj must implement read 

「response.raw」をアップロードしようとすると機能しますが、画像のサイズを取得する必要があります。 PILイメージオブジェクトをファイルライクオブジェクトに変更するにはどうすればよいですか?イメージをs3にアップロードできるうちに次元を取得する簡単な方法はありますか?

質問は次のとおりです。イメージのサイズを取得した後、イメージをs3にアップロードするにはどうすればよいですか?

答えて

3

を使用する必要があります()バックファイルの内容を取得するには、実際のファイルオブジェクトまたはメモリ内のオブジェクトのようなファイルのいずれかにファイルを「保存します」。次に、getValue()を呼び出します。

ファイルの内容を渡し、高さと幅を印刷し、AWSクライアントのput_object関数がBodyパラメータとして受け入れる形式でファイルデータを戻す関数の例を次に示します。

from PIL import Image 
import io 

def modify_image(image, format): 
    pil_image = Image.open(image) 

    # Prints out (1280, 960) 
    print(pil_image.size) 

    in_mem_file = io.BytesIO() 

    # format here would be something like "JPEG". See below link for more info. 
    pil_image.save(in_mem_file, format=format) 
    return in_mem_file.getvalue() 

別々の幅と高さは、ここで属性もあります。http://pillow.readthedocs.io/en/3.4.x/reference/Image.html#attributes

は、ファイル形式の詳細を参照してくださいここでhttp://pillow.readthedocs.io/en/3.4.x/handbook/image-file-formats.html

注:例は、Python 3.6.1

0

あなたが代わりに読んで呼び出し

response = requests.get(url, stream= True) 
f = io.BytesIO(response.content) 
image = Image.open(f) 
+0

を使用していますこれは何も変わりません。画像がうまく開きます。この問題は、イメージをs3にアップロードするときに発生します。 – john

+0

awsに 'f'をロードしようとしましたか? 'im'の代わりに' f'を使用してください – AndMar

+0

はい、私はそれを試みました。まず第一に、 'response'は' read'という属性を持たず、 'response.raw.read()'を意味すると仮定しています。私は空のfile_objをアップロードしようとすると、 'f'が空になったのでImage.open()でオープンしています。 – john

関連する問題