Python PIL 圖片開啟/儲存時怎麼方向不對啊

起因

吃完大餐後的隔天,整理著照片並準備寫文章時

用的是自己寫的python flask的圖片轉檔( JPG、PNG…等轉為WEBP )

卻發現有幾張照片怎麼轉出來都不對

像是這樣,明明拍的時候是正的啊,怎麼轉換完後就變成倒下來了

難不成!! 它也喝醉了嗎 !?

(先不要嫌畫面醜醜的,目前只有在 localhost 方便自己用而已哈哈)

而後面的程式差不多是長這樣的,就是個簡單的 img.save 成 webp格式而已

img.show( ) 這句是測試時確認打開時的樣子 ➡ 結果就發現打開時就已經轉向了,難怪轉換後方向也不對 !

def image_to_webp(input_file,output_file, quality=80):
    with Image.open(input_file) as img:
        img.save(output_file, 'webp', quality=quality)
        img.show()

當下先放棄了,隔了幾天後,在四處尋找後,終於找到了關鍵字 – 「EXIF」

EXIF 是什麼

全名為 「Exchangeable image file format」,是專門為數位相機的相片設定的檔案格式,可以記錄相片許多的屬性及拍攝資訊。

而資訊又包含了 製造廠商、相機型號、解析度、圖像方向…等

找到了! 這就是我們需要的的圖像方向!

Exif可以附加於JPEG、TIFF、RIFF等檔案之中,所以平常有些類型的圖檔也會包含這些資訊

那讓我們用 python 來檢視看看那張圖片的EXIF吧

from PIL import Image, ExifTags

def image_to_webp(input_file,output_file, quality=80):
    with Image.open(input_file) as img:
        img_exif = img.getexif()
        print(type(img_exif))

        if img_exif is not None:
            for key, val in img_exif.items():
                if key in ExifTags.TAGS:
                    print(f'{ExifTags.TAGS[key]}:{val}')

一樣是改寫原有的程式,然後參考了stackoverflow上的範例 (文章最後面有提供⬇)

這樣子我們就可以得到

燈燈! 就是這些資訊

包括了手機型號啊,圖片大小…等

而我們要看的就是 Orientation 這個屬性,也就是轉向,6 代表的是順時針旋轉90度

所以其實圖片轉換出來,沒吃到 EXIF 的屬性,故變成了沒轉的樣子

如何修正

既然知道是缺了EXIF,那就簡單了

def image_to_webp(input_file,output_file, quality=80):
    with Image.open(input_file) as img:
        img = ImageOps.exif_transpose(img)  #20230828 修正方向
        img.save(output_file, 'webp', quality=quality)

就在讀取檔案的時候補上EXIF給它,這樣後面的動作都沒問題了


結論

沒甚麼特別的結論,不過要是早一點知道,我禮拜六就不用花了好幾十分鐘用著線上功能慢慢一張一張轉向了

( 我寫的功能是支援一次多張轉換格式的,所以要是那時候修好就不用5分鐘就全部轉好了 )

太難過了Q口Q

參考文章 :

🧡幫我點一個小小的廣告或留言,都是對我的支持(每天都只有詐騙跟色情留言…)

✅如有任何疑問,歡迎透過留言或messenger讓我知道 !

寫過的筆記們

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *