سؤال

أنا بحاجة إلى تغيير حجم الصور jpg مع بيثون دون أن تفقد الصورة الأصلية هي EXIF البيانات (البيانات الوصفية عن تاريخ اتخاذها ، طراز الكاميرا.... الخ).جميع عمليات البحث في 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')

أي أفكار ؟ أو غيرها من المكتبات التي يمكنني استخدامه ؟

هل كانت مفيدة؟

المحلول

import jpeg
jpeg.setExif(jpeg.getExif('foo.jpg'), 'foo-resized.jpg') 

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

نصائح أخرى

يمكنك استخدام pyexiv2 إلى نسخ بيانات EXIF من مصدر الصورة.في المثال التالي صورة حجمها باستخدام بيل مكتبة, EXIF البيانات المنسوخة مع pyexiv2 وحجم الصورة 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))

هو في الواقع هناك طريقة بسيطة حقا من نسخ بيانات 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)

كما يمكنك أن ترى, حفظ وظيفة يمكن أن تأخذ exif الحجة الذي يسمح لنسخ الخام exif البيانات في صورة جديدة عند الحفظ.أنت لا تحتاج إلى أي lib إذا كان هذا ما تريد القيام به.أنا لا يمكن أن يبدو للعثور على أي وثائق بشأن خيارات الحفظ و أنا حتى لا أعرف إذا كان هذا هو تحديدا إلى وسادة أو العمل مع بيل أيضا.(إذا كان شخص ما لديه نوع من الارتباط ، سأستمتع اذا كان نشرها في التعليقات)

لماذا لا تستخدم يماغيماغيك?
هو تماما أداة قياسية (على سبيل المثال ، هو الأداة القياسية المستخدمة من قبل معرض 2);لم يسبق استخدامها ، ومع ذلك فقد بيثون واجهة وكذلك (أو يمكنك أيضا ببساطة تفرخ الأمر) والأهم من ذلك كله ، يجب الحفاظ على EXIF المعلومات بين جميع التحول.

بالنسبة pyexiv2 v0.3.2 ، وثائق API يشير إلى نسخ طريقة ترحيل بيانات 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()

يمكنك استخدام pyexiv2 تعديل الملف بعد حفظه.

هنا محدثة الجواب اعتبارا من عام 2018. piexif هو محض بيثون مكتبة لي تثبيت بسهولة عبر النقطة (pip تثبيت piexif) و عملت بشكل جميل (شكرا لك يا مشرفي!). https://pypi.org/project/piexif/

استخدام بسيط جدا ، سطر واحد سوف تكرار الإجابة المقبولة و نسخ جميع العلامات EXIF من الصورة الأصلية إلى تغيير حجم الصورة:

import piexif
piexif.transplant("foo.jpg", "foo-resized.jpg")

لم أجربه بعد ولكن يبدو أنك يمكن أن تؤدي أيضا modifcations بسهولة باستخدام الحمل ، تفريغ ، وإدراج الوظائف كما هو موضح في ربط الوثائق.

بيل مقابض بيانات EXIF, أليس كذلك ؟ ابحث في PIL.ExifTags.

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)

اختبار في وسادة 2.5.3

يبدو @Depado الحل لا يعمل بالنسبة لي في بلدي السيناريو الصورة لا تحتوي على exif الجزء.

pyexiv2 من الصعب تثبيت على بلدي ماك, بدلا من استخدام وحدة 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top