28

元の画像の EXIF データ (撮影日、カメラ モデルなどに関するメタデータ) を失うことなく、Python で jpg 画像のサイズを変更する必要があります。Python と画像に関するすべての Google 検索は、現在使用している PIL ライブラリを指していますが、メタデータを保持できないようです。私がこれまでに持っているコード (PIL を使用) は次のとおりです。

img = Image.open('foo.jpg')
width,height = 800,600
if img.size[0] < img.size[1]:
    width,height = height,width

resized_img = img.resize((width, height), Image.ANTIALIAS) # best down-sizing filter
resized_img.save('foo-resized.jpg')

何か案は?または私が使用できる他のライブラリ?

4

11 に答える 11

15

実際には、PIL のみを使用して EXIF データを画像から別の画像にコピーする非常に簡単な方法があります。ただし、exif タグの変更は許可されていません。

image = Image.open('test.jpg')
exif = image.info['exif']
# Your picture process here
image = image.rotate(90)
image.save('test_rotated.jpg', 'JPEG', exif=exif)

ご覧のとおり、save 関数は、保存時に生の exif データを新しい画像にコピーすることを許可する exif 引数を取ることができます。それがあなたがしたいすべてであれば、実際には他のライブラリは必要ありません。保存オプションに関するドキュメントが見つからないようです。それがPillowに固有のものなのか、PILでの作業なのかさえわかりません。(誰かが何らかのリンクを持っている場合は、コメントに投稿していただければ幸いです)

于 2014-02-27T09:13:16.497 に答える
12
import jpeg
jpeg.setExif(jpeg.getExif('foo.jpg'), 'foo-resized.jpg') 

http://www.emilas.com/jpeg/

于 2008-12-30T17:00:10.660 に答える
10

pyexiv2 を使用して、ソース イメージから EXIF データをコピーできます。次の例では、PIL ライブラリを使用して画像のサイズを変更し、pyexiv2 でコピーした EXIF データと画像サイズ EXIF フィールドに新しいサイズを設定しています。

def resize_image(source_path, dest_path, size):
    # resize image
    image = Image.open(source_path)
    image.thumbnail(size, Image.ANTIALIAS)
    image.save(dest_path, "JPEG")

    # copy EXIF data
    source_image = pyexiv2.Image(source_path)
    source_image.readMetadata()
    dest_image = pyexiv2.Image(dest_path)
    dest_image.readMetadata()
    source_image.copyMetadataTo(dest_image)

    # set EXIF image size info to resized size
    dest_image["Exif.Photo.PixelXDimension"] = image.size[0]
    dest_image["Exif.Photo.PixelYDimension"] = image.size[1]
    dest_image.writeMetadata()

# resizing local file
resize_image("41965749.jpg", "resized.jpg", (600,400))
于 2010-11-24T19:57:13.070 に答える
4

ImageMagickを使用しないのはなぜですか?
これは非常に標準的なツールです(たとえば、Gallery 2で使用される標準的なツールです)。私はこれを使用したことはありませんが、Pythonインターフェイスも備えており(または、単にコマンドを生成することもできます)、何よりも、すべての変換間でEXIF情報を維持する必要があります。

于 2008-12-30T19:27:17.557 に答える
3

pyexiv2 v0.3.2 の場合、API ドキュメントでは copy メソッドを参照して、EXIF データをあるイメージから別のイメージに引き継ぐことができます。この場合、元の画像の EXIF データがリサイズされた画像になります。

@Maksym Kozlenkoを離れて、EXIFデータをコピーするための更新されたコードは次のとおりです。

    source_image = pyexiv2.ImageMetadata(source_path)
    source_image.read()

    dest_image = pyexiv2.ImageMetadata(dest_path)
    dest_image.read()

    source_image.copy(dest_image,exif=True)
    dest_image.write()
于 2013-07-09T13:24:08.497 に答える
1

ファイルを保存した後、pyexiv2 を使用してファイルを変更できます。

于 2008-12-31T15:59:57.600 に答える
0
from PIL import Image
img_path = "/tmp/img.jpg"
img = Image.open(img_path)
exif = img.info['exif']
img.save("output_"+img_path, exif=exif)

Pillow 2.5.3 でテスト済み

于 2014-09-04T07:18:15.457 に答える
0

私のシナリオでは、画像にはexifセグメントさえ含まれていません。

pyexiv2 は Mac にインストールするのが難しく、代わりにモジュール pexif https://github.com/bennoleslie/pexif/blob/master/pexif.pyを使用します。画像に「exif セグメントを追加」するには、exif 情報が含まれていないため、exif セグメントを所有する画像に含まれる exif 情報を追加しました。

from pexif import JpegFile

#get exif segment from an image
jpeg = JpegFile.fromFile(path_with_exif)
jpeg_exif = jpeg.get_exif()

#import the exif segment above to the image file which does not contain exif segment
jpeg = JpegFile.fromFile(path_without_exif)
exif = jpeg.import_exif(jpeg_exif)
jpeg.writeFile(path_without_exif)
于 2015-05-14T11:55:44.933 に答える
-1

PIL は EXIF データを処理しますね。PIL.ExifTags を見てください。

于 2008-12-30T17:01:28.927 に答える