我想在上傳到 s3 之前從影像中洗掉 exif。我發現了一個類似的問題(here),但它保存為一個新檔案(我不想要它)。然后我找到了另一種方法(here),然后我嘗試實作它,測驗時一切正常。但是我部署到prod后,有用戶反映上傳1MB及以上的圖片偶爾會出現問題,必須多試幾次。
所以,我只是想確保我的代碼是否正確?或者也許有一些我可以改進的地方。
from PIL import Image
# I got body from http Request
img = Image.open(body)
img_format = img.format
# Save it in-memory to remove EXIF
temp = io.BytesIO()
img.save(temp, format=img_format)
body = io.BytesIO(temp.getvalue())
# Upload to s3
s3_client.upload_fileobj(body, BUCKET_NAME, file_key)
*我仍在找出這個問題是否是由其他原因引起的。
uj5u.com熱心網友回復:
您應該能夠將像素資料和調色板(如果有)從現有影像復制到新的剝離影像,如下所示:
from PIL import Image
# Load existing image
existing = Image.open(...)
# Create new empty image, same size and mode
stripped = Image.new(existing.mode, existing.size)
# Copy pixels, but not metadata, across
stripped.putdata(existing.getdata())
# Copy palette across, if any
if 'P' in existing.mode: stripped.putpalette(existing.getpalette())
請注意,這將從您的影像中洗掉所有元資料... EXIF、評論、IPTC、8BIM、ICC 顏色組態檔、dpi、著作權、是否是漸進式的、是否是影片的。
另請注意,當您保存它時,它將以 PIL 的默認質量 75 寫入 JPEG 影像,這可能與您的原始影像相同,也可能不同 - 即大小可能會改變。
如果上述剝離過多,您可以像這樣剝離 EXIF:
from PIL import Image
im = Image.open(...)
# Strip just EXIF data
if 'exif' in im.info: del im.info['exif']
保存時,您可以測驗是否為 JPEG,并通過以下方式傳播現有質量:
im.save(..., quality='keep')
注意:如果要驗證任何給定影像中的元資料,在剝離之前和之后,可以在 macOS、Linux 和 Windows 上使用exiftool或ImageMagick,如下所示:
exiftool SOMEIMAGE.JPG
magick identify -verbose SOMEIMAGE.JPG
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/475823.html
上一篇:boto3s3初始化會話回傳憑證
