Python 將大頭照平鋪在 4x6 的相片圖檔

護照、身份證等證件申辦,常常都還是需要提供實體照片~

想要透過便利商店洗大頭照的照片,查起來超貴,但是 4*6 的照片相對便宜很多~

於是~ 來將大頭照合進 4x6 的照片,再去洗出來,在靠剪刀即可~

照片尺寸(英吋) 與 實際尺寸(厘米) (300dpi)

  • 10x15:25.4x38.1
  • 10x12:25.4x30.5
  • 8x10 :20.3x25.4
  • 6x8 :15.2x20.3
  • 5x8 :12.7x20.3
  • 5x7 :12.7x17.7
  • 4x6 :10.1x15.2
  • 3.5x5:8.9x12.7

Python 將大頭照平鋪在 4x6 的相片圖檔

  • 1吋照片的尺寸:
    • 2.5cm * 3.5cm
    • 295px * 413px
  • 2吋照片的尺寸:
    • 3.5cm * 5.3cm
    • 413px * 626px

其它常用照片尺寸:

  • 照片類型(英吋) 尺寸(厘米)
    • 身份證 (22mm x 32mm)
    • 駕駛證 (22mm x 32mm)
    • 黑白小一寸 (22mm x 32mm)
    • 彩色小一寸 (27mm x 38mm)
    • 彩色大一寸 (40mm x 55mm)
    • 普通證件照 (33mm x 48mm)

查到我以前做這件事情,是使用:軟體: PhotoCap 輕鬆製作大頭照

不過現在沒有 Windows 可以用,得要使用 GIMP 或者 靠程式直接生成~

發現靠程式才是最快的,直接把照片檔案進去,直接執行輸出就是成品~

資料準備

  • your-photo.png 大頭照照片檔案
  • passport_photos_4x6.jpg 輸出結果

程式(passport-2inch-to-4x6.py)

#!/usr/bin/python3
# 將 PNG 的照片縮成 2吋,再排入 4*6 的照片方便一次印出
# pip install Pillow
from PIL import Image

# 載入大頭照
original_image = Image.open("your-photo.png")

# 設定解析度(300 DPI)與尺寸
dpi = 300
passport_width = int(2 * dpi)   # 2 吋寬
passport_height = int(2 * dpi)  # 2 吋高
passport_size = (passport_width, passport_height)
passport_canvas = Image.new("RGB", passport_size, "white") # 2x2 吋的白底畫布

# 保持原圖比例 縮放以塞入 2x2 吋畫布
original_aspect = original_image.width / original_image.height
target_aspect = passport_width / passport_height

if original_aspect > target_aspect:
    # 原圖過寬,限制寬度
    new_width = passport_width
    new_height = int(passport_width / original_aspect)
else:
    # 原圖過高,限制高度
    new_height = passport_height
    new_width = int(passport_height * original_aspect)

resized_image = original_image.resize((new_width, new_height), Image.Resampling.LANCZOS) # 縮圖

# 將縮圖貼在畫布中央( // = math.floor(取整數、商數) )
offset_x = (passport_width - new_width) // 2
offset_y = (passport_height - new_height) // 2
passport_canvas.paste(resized_image, (offset_x, offset_y))

# 建立一張 4x6 吋的白底畫布
output_width = int(6 * dpi)
output_height = int(4 * dpi)
output_image = Image.new("RGB", (output_width, output_height), "white")

# 計算可放置的行數與列數
cols = output_width // passport_width
rows = output_height // passport_height

# 貼上多張 2x2 照片
for row in range(rows):
    for col in range(cols):
        x = col * passport_width
        y = row * passport_height
        output_image.paste(passport_canvas, (x, y))

# 儲存輸出圖片
output_image.save("passport_photos_4x6.jpg", dpi=(300, 300))
Tsung: 對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
whatsapp
line