PIL:スマホで撮った写真をポラロイド写真風?に変換

画像処理

今日は、iPhoneで撮った写真をなんちゃってポラロイドカメラで撮った風に変換してみました。

やりたかったこと

iPhoneで撮った写真をこういった形にしたかったのです。

両端を切り抜いて正方形にし、それっぽい台紙に写真を貼り付けました。台紙の空いた部分にはメッセージを入れることもできますが、せっかくなので今回は写真を撮った日付を入れてみました。


今回使用したのはこの写真。

やりかた

今回も画像ライブラリPILを使用します。
PILの基本的な使い方はこちら。

まずは画像の読み込み。

#画像の読み込み
from PIL import Image,ImageDraw,ImageFont
import os
image_path = "IMG_1553.JPG"
origin_image  = Image.open(image_path)
#保存用のファイル名
save_name = os.path.splitext(os.path.basename(image_path))[0]+"_photo.jpg"
print(save_name)
print("幅、高さ:{}".format(origin_image.size))

幅、高さ:(3264, 2448)と表示されます
・ファイルを読み込んだパスから保存用のファイル名をあらかじめ作成しておきます。方法はいろいろあると思いますがここではシンプルにosモジュールのos.path.splitextとos.basanameを使用して、拡張子なしのパスを取得します。
・iPoneの通常モードで撮ったこの写真は横長です。ポラロイド風にするために中心部分だけを切り取ります。

## 画像の中心を正方形に切り取る
box_size = 400
if origin_image.width > origin_image.height :
    #横長画像
    x_start = (origin_image.width - origin_image.height)//2
    x_end = x_start + origin_image.height
    y_start = 0
    y_end = origin_image.height
    
else:
    #縦長画像
    x_start = 0
    x_end = origin_image.width
    y_start = ( origin_image.height - origin_image.width)//2
    y_end = y_start + origin_image.width
#正方形に画像を切り取る
crop_image = origin_image.crop((x_start,y_start,x_end,y_end)).resize((box_size,box_size))
display(crop_image)

こんな感じになります。
次に、台紙部分を作成して、それに貼り付けていきます。
せっかくなので、オリジナルの画像のExif情報から撮影日のデータを引っ張ってきています。
Exif情報とはデジタルカメラで撮影したときに記録されるメタデータのことです。撮影した写真の撮影日時やカメラの機種名、位置情報などが含まれています。

台紙はちょっとアイボリーっぽくしてみましたが、「台紙の設定」のところのカラーに好みのカラーコードを指定することで白や他の色にも変更できます。
今回は、撮影日のデータを表示させるフォントに「しろくまフォント」さんを使用させていただきました。

フリーフォント しろくま を公開しました(漢字追加2018.5.15)
昨日紹介したFontpainterでフォントを作成したのでフリーフォントにしちゃいます! 漢字を追加しました。(2017.12.27) コンセプト 収録している文字 収録している記号など(93文字)  利用規約 OK  ...
#exifから日付データを取得
exif = origin_image._getexif()
for id, val in exif.items():
    if id == 36867:
       image_date = val.replace(":","/")[:10]

#台紙の設定
canvas_width = int(box_size*1.1)
canvas_height= int(box_size*1.3)
border = int(box_size*0.05)
canvas = Image.new("RGB", (canvas_width,canvas_height), color="#f8f5e3")

#フォントの設定
font = ImageFont.truetype('001Shirokuma-Regular.otf', border)

#台紙に日付を入れる
draw = ImageDraw.Draw(canvas)
draw.text((canvas_width//2, canvas_height-canvas_height//6), image_date, '#4B474D',font=font)

#台紙に写真を貼り付ける
canvas.paste(crop_image, (border, border))
display(canvas)
canvas.save(save_name)

こんな感じになりました。
少しはそれっぽくなったかな?
まとめるとこんな感じです。

#画像の読み込み
from PIL import Image,ImageDraw,ImageFont
import os
image_path = "IMG_1553.JPG"
origin_image  = Image.open(image_path)
#保存用のファイル名
save_name = os.path.splitext(os.path.basename(image_path))[0]+"_photo.jpg"
print("幅、高さ:{}".format(origin_image.size))

box_size = 480

if origin_image.width > origin_image.height :
    #横長画像
    x_start = (origin_image.width - origin_image.height)//2
    x_end = x_start + origin_image.height
    y_start = 0
    y_end = origin_image.height
    
else:
    #縦長画像
    x_start = 0
    x_end = origin_image.width
    y_start = ( origin_image.height - origin_image.width)//2
    y_end = y_start + origin_image.width


#正方形に画像を切り取る
crop_image = origin_image.crop((x_start,y_start,x_end,y_end)).resize((box_size,box_size))

#exifから日付データを取得
exif = origin_image._getexif()
for id, val in exif.items():
    if id == 36867:
       image_date = val.replace(":","/")[:10]


#台紙の設定
canvas_width = int(box_size*1.1)
canvas_height= int(box_size*1.3)
border = int(box_size*0.05)
canvas = Image.new("RGB", (canvas_width,canvas_height), color="#f8f5e3")

#フォントの設定
font = ImageFont.truetype('001Shirokuma-Regular.otf', border)

#台紙に日付を入れる
draw = ImageDraw.Draw(canvas)
draw.text((canvas_width//2, canvas_height-canvas_height//6), image_date, '#4B474D',font=font)

#台紙に写真を貼り付ける
canvas.paste(crop_image, (border, border))
display(canvas)
canvas.save(save_name)

いろいろ加工してみよう

他の写真も同じように加工してみました。思い出の写真も少し違った雰囲気になりますね。

タイトルとURLをコピーしました