Python 取得圖片Exif資訊

本篇 ShengYu 將介紹如何使用 Python 讀取圖片的 Exif 資訊,在做圖片處理時常常會需要根據 Exif 資訊作處理,例如這張圖片有無旋轉,接下就來介紹怎麼使用 python 的 PIL 模組來讀取圖片的 Exif 資訊。

安裝 PIL

基本上新版本的 Python 應該都有內建 PIL,如果還未安裝 PIL 的話請參考這篇

使用範例

以下範例 ShengYu 是使用一張有 exif 的照片來測試,
print(img) 可印出該檔案的基本資料,如模式,大小,記憶體所在位置,
使用 _getexif 會回傳個字典 dict,之後在用迴圈將 exif 字典裡的東西全部印出來。

pil-read-image-exif.py
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PIL import Image
from PIL.ExifTags import TAGS

img = Image.open("IMG_20181205_xxxxxx.jpg")
print(img)
exif = img._getexif()

if exif is not None:
for (tag, value) in exif.items():
key = TAGS.get(tag, tag)
print(key + ' = ' + str(value))

輸出結果如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
ImageWidth = 4048
ImageLength = 3036
ApertureValue = (200, 100)
ExifImageHeight = 3036
DateTimeDigitized = 2018:12:05 11:10:19
MaxApertureValue = (200, 100)
ExifVersion = b'0220'
ColorSpace = 1
Contrast = 0
Saturation = 0
FocalLength = (4670, 1000)
SubjectDistanceRange = 1
ExposureMode = 0
Make = Google
Model = Pixel XL
SubsecTimeOriginal = 253505
Orientation = 1
YCbCrPositioning = 1
SensingMethod = 2
ExposureBiasValue = (0, 6)
XResolution = (72, 1)
YResolution = (72, 1)
ExposureTime = (33333, 1000000)
ExifInteroperabilityOffset = 18588
ExposureProgram = 2
SceneCaptureType = 0
ISOSpeedRatings = 1208
ResolutionUnit = 2
WhiteBalance = 0
MeteringMode = 2
ComponentsConfiguration = b'\x01\x02\x03\x00'
FNumber = (200, 100)
Software = HDR+ 1.0.163413028z
DateTime = 2018:12:05 11:10:19
ShutterSpeedValue = (491, 100)
Flash = 16
SceneType = b'\x01'
Sharpness = 0
ExifImageWidth = 4048
CustomRendered = 1
FlashPixVersion = b'0100'
SubjectDistance = (337, 1000)
DateTimeOriginal = 2018:12:05 11:10:19
SubsecTime = 253505
ExifOffset = 230
SubsecTimeDigitized = 253505
BrightnessValue = (-169, 100)
MakerNote = b'HDRP...'

PIL.ExifTags 參數的詳細細節請參考這裡

其他參考資料
https://zh.wikipedia.org/wiki/EXIF

相關主題
Python 旋轉圖片 rotate
Python 縮放圖片 resize
Python 裁切裁剪圖片 crop
Python 圖片模糊化 blur
Python 在圖片上繪製文字

Python 圖片貼上 paste

本篇 ShengYu 將介紹如何使用 Python 讀取圖片並且將圖片貼在另一張圖片上,在做影像處理時有時會需要對圖片作剪下貼上的處理,接下來介紹怎麼使用 python 的 PIL 模組來作圖片貼上。

安裝 PIL

基本上新版本的 Python 應該都有內建 PIL,如果還未安裝 PIL 的話請參考這篇

範例1:把 lena 的縮圖貼在 lena 圖片上

以下範例 ShengYu 是使用 Image.open() 讀取 lena.jpg 這張圖片,
Image.open() 會回傳一個 Image 物件,
然後我們使用先前介紹過的圖片縮圖,把它讀取進來,
接著來到本篇的重點使用 paste() 將縮圖貼在 (150, 50) 的位置上,
最後使用 show() 將這張圖片顯示出來,就可以看到結果囉!

paste-image.py
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PIL import Image

img = Image.open("lena.jpg")
print(img.size)
img2 = Image.open("lena-thumbnail.jpg")
print(img2.size)

img.paste(img2, (150, 50))
img.show()

結果如下圖所示:

範例2:把 crop 下的範圍貼在 lena 圖片上

這範例先使用 crop 裁剪一個範圍,
接著使用 paste() 將 crop 的範圍貼在 (150, 50) 的位置上,
最後使用 show() 將這張圖片顯示出來,就可以看到結果囉!

crop-paste-image.py
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PIL import Image

img = Image.open("lena.jpg")
print(img.size)

img2 = img.crop((0, 0, 300, 300))
img.paste(img2, (150, 50))
img.show()

結果如下圖所示:

範例3:把 crop 下的範圍作模糊化再貼在 lena 圖片上

這範例先使用 crop() 裁剪一個範圍,
然後使用先前介紹過的模糊化 filter() 將範圍模糊化,
接著使用 paste() 將 crop 的範圍貼在 (150, 50) 的位置上,
最後使用 show() 將這張圖片顯示出來,就可以看到結果囉!

crop-filter-paste-image.py
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PIL import Image, ImageFilter

img = Image.open("lena.jpg")
print(img.size)

img2 = img.crop((0, 0, 300, 300))
img3 = img2.filter(ImageFilter.BLUR)
img.paste(img3, (150, 50))
img.show()

結果如下圖所示:

Image.paste 參數的詳細細節請參考這裡

相關主題
Python 旋轉圖片 rotate
Python 縮放圖片 resize
Python 裁切裁剪圖片 crop
Python 圖片模糊化 blur
Python 在圖片上繪製文字

Python 讀取圖片並顯示

本篇 ShengYu 將介紹如何使用 Python PIL 讀取圖片並且將圖片顯示出來,在做影像處理時常常會需要對圖片作處理,而第一步最常遇到要怎麼讀取圖片跟顯示圖片,接下來介紹怎麼使用 python 的 PIL 模組來讀取圖片跟顯示。

安裝 PIL

基本上新版本的 Python 應該都有內建 PIL,如果還未安裝 PIL 的話請參考這篇

使用範例

以下範例 ShengYu 是使用 Image.open() 讀取 lena.jpg 這張圖片,
Image.open() 會回傳一個 Image 物件,
之後取出 Image 物件的 size 用 print 把這張圖片的寬和高印出來,
最後再使用 show() 將這張圖片顯示出來。

read-image-and-show-image.py
1
2
3
4
5
6
7
8
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PIL import Image

img = Image.open("lena.jpg")
(w, h) = img.size
print('w=%d, h=%d' % (w, h))
img.show()

結果如下圖所示:
左邊為原圖,右邊為縮放後的圖。

Image.open 參數的詳細細節請參考這裡
Image.show 參數的詳細細節請參考這裡

相關主題
Python 第一支 Python 程式
Python 縮放圖片 resize
Python 裁切裁剪圖片 crop
Python 圖片模糊化 blur
Python 在圖片上繪製文字
Python 旋轉圖片 rotate

Python 在圖片上繪製文字

本篇 ShengYu 將介紹如何使用 Python 在圖片上繪製文字,在做影像處理時常常會需要在圖片上繪製文字,這邊我們使用 python 的 PIL 模組來在圖片上繪製文字。

安裝 PIL

基本上新版本的 Python 應該都有內建 PIL,如果還未安裝 PIL 的話請參考這篇

使用範例

以下範例 ShengYu 是準備在 lena.jpg 這張圖片上繪製文字,
先透過 ImageFont.truetype() 讀入要使用的字型,
之後再用 ImageDraw.Draw.text() 繪製 “Hello” 白色的文字,顯示出來。

draw-text-on-image.py
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PIL import Image, ImageDraw, ImageFont

img = Image.open("lena.jpg")
print(img.size)

font = ImageFont.truetype('Pillow/Tests/fonts/FreeMono.ttf', 36)
draw = ImageDraw.Draw(img)
draw.text((10, 10), 'Hello', font=font, fill=(255,255,255))

print(img.size)
img.show()

結果如下圖所示:
左邊為原圖,右邊為縮放後的圖。

ImageDraw.Draw.text 參數的詳細細節請參考這裡

相關主題
Python 第一支 Python 程式
Python 圖片模糊化 blur
Python 旋轉圖片 rotate
Python 縮放圖片 resize
Python 裁切裁剪圖片 crop

Python 製作圖片縮圖 thumbnail

本篇 ShengYu 將介紹如何使用 Python 來製作圖片縮圖,這邊我們使用 python 的 PIL 模組來製作圖片的縮圖。

安裝 PIL

基本上新版本的 Python 應該都有內建 PIL,如果還未安裝 PIL 的話請參考這篇

使用範例

以下範例 ShengYu 是將 lena.jpg 這張圖片透過 thumbnail() 作縮圖,之後顯示並且存檔。

thumbnail-image.py
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PIL import Image

img = Image.open("lena.jpg")
print(img.size)
img.show()

img.thumbnail((256, 256))
print(img.size)
img.show()
img.save("lena-thumbnail.jpg")

結果如下圖所示:
左邊為原圖,右邊為縮放後的圖。

thumbnail 和 resize 的差異

先前介紹過 resize 圖片縮放怎麼使用了,在這篇使用 thumbnail 作圖片縮圖,怎麼這兩個有點像呢?是不是 thumbnail 內部就是使用 resize 呢?
thumbnail() 跟 resize() 的不同處是,resize() 可以放大跟縮小,且可以不等比例縮放,而 thumbnail() 只能縮小,且只能等比例縮小,依據輸入參數裡的最短邊為主。
例如,我故意使用 Image.thumbnail((256, 200)),最後是縮成200x200的大小。
故意使用 Image.thumbnail((600, 600)),最後是縮成512x512的大小。
thumbnail() 會修改物件本身的的影像,而不像 resize() 是產生一個新的影像物件,所以速度會比 Image.resize() 快。

Image.thumbnail 參數的詳細細節請參考這裡

相關主題
Python 縮放圖片 resize
Python 圖片模糊化 blur
Python 旋轉圖片 rotate
Python 裁切裁剪圖片 crop
Python 在圖片上繪製文字

Python 如何安裝 PIL

本篇 ShengYu 將介紹 Python 如何安裝PIL,簡單的介紹 PIL 模組,以及 Pillow 與 PIL 之間的關係。

PIL 簡介

PIL(Python Imaging Library)是Python一個强大方便的影像處理函式庫。只支援到 Python 2.7。
PIL官方網站連結已失效。

Pillow 與 PIL 的關係

Pillow 是 PIL 的一个衍生的分支專案,但如今已经發展成為比 PIL 本身更活躍的影像處理函式庫。支援 Python2.7.x,和 Python3.5 以上。
Pillow 7.0.0 在 2020-01-02 釋出,且不支援 Python2.7。
目前最新版本是8.1.0(2021.01.03釋出)。

Pillow 的 Github:https://github.com/python-pillow/Pillow
Pillow 的官方文件:https://pillow.readthedocs.org/en/latest/handbook/index.html
Pillow 的文件中譯(2.4.0):https://pillow-cn.readthedocs.io/zh_CN/latest/
PyPI 的 Pillow:https://pypi.org/project/Pillow/

Python 3.x 安裝 Pillow

Python 安裝 Pillow 方法如下,
在命列列下使用 PIP 安裝,

1
$ pip install Pillow

或在命列列下使用 easy_install 安裝,

1
$ easy_install Pillow

安裝完成後,在 python 裡使用 from PIL import Image 就引用 PIL 函式庫了,Pillow 由 PIL 衍生而來,所以是 import PIL 而不是 Pillow 唷。

接下來就可以開始練習寫第一支PIL圖片處理程式囉!

安裝的 Pillow 模組會保存在 python 目錄下的 site-packages。

相關主題
Python 第一支 Python 程式
Python PIL 讀取圖片並顯示
Python 圖片模糊化 blur
Python 縮放圖片 resize
Python 在圖片上繪製文字

Python 圖片平滑化 smooth

本篇 ShengYu 將介紹如何使用 Python 來作圖片平滑化,在做影像處理時常常會需要用到圖片平滑化的功能,這邊我們使用 python 的 PIL 模組來作圖片的平滑化。

安裝 PIL

基本上新版本的 Python 應該都有內建 PIL,如果還未安裝 PIL 的話請參考這篇

使用範例

以下範例 ShengYu 是將 lena.jpg 這張圖片作平滑化,之後顯示並且存檔。

smooth-image.py
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PIL import Image, ImageFilter

img = Image.open("lena.jpg")
img.show()

new_img = img.filter(ImageFilter.SMOOTH)
new_img.save("lena-smooth.jpg")
new_img.show()

結果如下圖所示:
左邊為原圖,右邊為縮放後的圖。

Image.filter 參數的詳細細節請參考這裡

相關主題
Python 圖片模糊化 blur
Python 縮放圖片 resize
Python 旋轉圖片 rotate
Python 裁切裁剪圖片 crop
Python 在圖片上繪製文字

Python 圖片模糊化 blur

本篇 ShengYu 將介紹如何使用 Python 來作圖片模糊化,在做影像處理時常常會需要用到圖片模糊化的功能,這邊我們使用 python 的 PIL 模組來作圖片的模糊化。

安裝 PIL

基本上新版本的 Python 應該都有內建 PIL,如果還未安裝 PIL 的話請參考這篇

使用範例

以下範例 ShengYu 是將 lena.jpg 這張圖片作模糊化,之後顯示並且存檔。

blur-image.py
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PIL import Image, ImageFilter

img = Image.open("lena.jpg")
img.show()

new_img = img.filter(ImageFilter.BLUR)
new_img.save("lena-blur.jpg")
new_img.show()

結果如下圖所示:
左邊為原圖,右邊為縮放後的圖。

其他參數說明

這邊列出 ImageFilter Module 其他的參數,

Filter名稱 說明
ImageFilter.BLUR 模糊
ImageFilter.CONTOUR 輪廓
ImageFilter.DETAIL
ImageFilter.EDGE_ENHANCE 邊界加強
ImageFilter.EDGE_ENHANCE_MORE 邊界加強(閥值更大)
ImageFilter.EMBOSS 浮雕
ImageFilter.FIND_EDGES 邊界
ImageFilter.SMOOTH 平滑
ImageFilter.SMOOTH_MORE 平滑(閥值更大)
ImageFilter.SHARPEN 銳化

Image.filter 參數的詳細細節請參考這裡
ImageFilter Module 的詳細細節請參考這裡

相關主題
Python 圖片平滑化 smooth
Python 縮放圖片 resize
Python 旋轉圖片 rotate
Python 裁切裁剪圖片 crop
Python 在圖片上繪製文字

Python 水平翻轉、垂直翻轉圖片

本篇 ShengYu 將介紹如何使用 Python 來水平翻轉、垂直翻轉圖片,在做影像處理時常常會需要用水平翻轉、垂直翻轉圖片的功能,這邊我們使用 python 的 PIL 模組來作圖片的水平翻轉、垂直翻轉。

安裝 PIL

基本上新版本的 Python 應該都有內建 PIL,如果還未安裝 PIL 的話請參考這篇

水平翻轉範例

以下範例是 ShengYu 將 lena.jpg 這張圖片透過 transpose() 函式並帶入參數 Image.FLIP_LEFT_RIGHT 來作水平左右翻轉,最後顯示並且存檔。

另外也可使用 ImageOps.mirror() 也有同樣效果。

flip-image-horizontal.py
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PIL import Image

img = Image.open("lena.jpg")
img.show()

new_img = img.transpose(Image.FLIP_LEFT_RIGHT)
new_img.save("lena-horizontal.jpg")
new_img.show()

結果如下圖所示:
左邊為原圖,右邊為水平翻轉後的圖。

垂直翻轉範例

以下範例是 ShengYu 將 lena.jpg 這張圖片透過 transpose() 函式並帶入參數 Image.FLIP_TOP_BOTTOM 來作垂直上下翻轉,最後顯示並且存檔。

transpose() 參數帶入 Image.ROTATE_180 參數也是一樣垂直上下翻轉的效果。
另外也可以使用 ImageOps.flip(),效果也是一樣的。

flip-image-vertical.py
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PIL import Image

img = Image.open("lena.jpg")
img.show()

new_img = img.transpose(Image.FLIP_TOP_BOTTOM)
new_img.save("lena-vertical.jpg")
new_img.show()

結果如下圖所示:
左邊為原圖,右邊為垂直翻轉後的圖。

常用參數說明

這邊列出 transpose() 函式常用的參數,
Image.FLIP_LEFT_RIGHT︰水平左右翻轉
Image.FLIP_TOP_BOTTOM︰垂直上下翻轉
Image.ROTATE_90︰逆時針旋轉90度
Image.ROTATE_180︰逆時針旋轉180度
Image.ROTATE_270︰逆時針旋轉270度

Image.transpose 參數的詳細細節請參考這裡
ImageOps.mirror 參數的詳細細節請參考這裡
ImageOps.flip 參數的詳細細節請參考這裡

相關主題
Python 旋轉圖片 rotate
Python 縮放圖片 resize
Python 裁切裁剪圖片 crop
Python 圖片模糊化 blur
Python 在圖片上繪製文字

Python 裁切裁剪圖片 crop

本篇 ShengYu 將介紹如何使用 Python 來裁切裁剪圖片,在做影像處理時常常會需要用裁切裁剪圖片的功能,這邊我們使用 python 的 PIL 模組來作圖片的裁切裁剪。

安裝 PIL

基本上新版本的 Python 應該都有內建 PIL,如果還未安裝 PIL 的話請參考這篇

使用範例

以下範例是 ShengYu 將 lena.jpg 這張圖片(512x512)透過 crop() 函式裁切裁剪範圍從(0,0)位置到(256,512)位置,最後顯示並且存檔。

crop-image.py
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PIL import Image

img = Image.open("lena.jpg")
print(img.size)
img.show()

new_img = img.crop((0, 0, 256, 512)) # (left, upper, right, lower)
new_img.show()
new_img.save("lena-crop.jpg")

結果如下圖所示:
左邊為原圖,右邊為裁切裁剪後的圖。

Image.crop 參數的詳細細節請參考這裡

相關主題
Python 圖片模糊化 blur
Python 旋轉圖片 rotate
Python 縮放圖片 resize
Python 在圖片上繪製文字