[python] Pillowを使ってみたときのメモ

pythonの画像処理ライブラリ「Pillow」を使ってみたときのメモ。

目次

Pillowのインストール

pip install Pillow

クリップボードの画像をファイルに保存

from datetime import datetime
from PIL import Image, ImageGrab

# クリップボードから画像データを取得
clip_img = ImageGrab.grabclipboard()

# 画像データじゃない場合は終了
if clip_img is None:
    print('no data')
    exit

# なんか他とかぶらない名前をつける
timestr = datetime.now().strftime('%Y%m%d%H%M%S')

# 画像データを保存
clip_img.convert('RGB').save(f'{timestr}.jpg')

ImageGrab.grabclipboard()でクリップボードから画像データを取り出せる。
クリップボードにあるデータが画像データではない場合、Noneが返ってくるみたいなのでその時は処理終了。

領域選択したときの画像のモードはRGBAになるらしくjpegで保存できなかったので間にconvertメソッドを使ってRGBに変更している。これでjpegで保存できるようになる。
png形式でいい場合はconvertはいらない。

↓convertがないとこんなエラーがでて保存できない

例外が発生しました: OSError
cannot write mode RGBA as JPEG
KeyError: ‘RGBA’

そのあとにsaveメソッドを実行すればOK(パラメータは保存するファイル名)。
何枚も保存することを想定して現在時刻をファイル名にしている。

あとsaveするときに、

clip_img.convert('RGB').save(f'{timestr}.webp', 'webp')

みたいにするとwebp形式で保存できる。

jpegをwebpに変換

from PIL import Image
import os

# 変換したいjpegファイルを入れるフォルダパス
inputfile_path = "input"

# webpに変換したファイルを出力するフォルダパス
save_webpfile_path = "output_webp"

# inputfile_pathフォルダ内のファイル名取得
filename_list = os.listdir(inputfile_path)
for jpg_name in filename_list:

    # ファイル名と拡張子に分割する。
    file, ext = os.path.splitext(jpg_name)

    file, ext = os.path.splitext(jpg_name)
    save_path = os.path.join(save_webpfile_path, file) + ".webp"
    img = Image.open(os.path.join(inputfile_path, jpg_name))
    img.save(save_path, "webp")

こんな感じに配置して、inputフォルダの中にjpegファイルを入れて、pyファイルを実行するとoutput_webpフォルダに変換されたファイルが出力される。

jpegをwebpに変換しつつ縦横サイズを縮小

resizeを使う

from PIL import Image
import os

# どのくらい縮小するか?2だと2分の1のサイズになる
rate = 2

# 変換したいjpegファイルを入れるフォルダパス
inputfile_path = "input"

# webpに変換したファイルを出力するフォルダパス
save_webpfile_path = "output_webp"

# inputfile_pathフォルダ内のファイル名取得
filename_list = os.listdir(inputfile_path)
for jpg_name in filename_list:

    # ファイル名と拡張子に分割する。
    file, ext = os.path.splitext(jpg_name)

    file, ext = os.path.splitext(jpg_name)
    save_path = os.path.join(save_webpfile_path, file) + ".webp"
    img = Image.open(os.path.join(inputfile_path, jpg_name))
    img = img.resize((img.width // rate, img.height // rate))
    img.save(save_path, "webp")

透過PNG画像を合成してウォーターマークを入れる

import sys
import os
from PIL import Image

if (len(sys.argv) < 2): exit()

py_dir = os.path.dirname(__file__)
sigh_path = 'signeture.png'     # 合成する透過画像のパス

image_list = sys.argv[1:]
for base_path in image_list:

    # 元画像のファイル名を利用して保存用のファイル名を作成
    base_dir = os.path.dirname(base_path)
    base_filename = os.path.basename(base_path).split('.')[-2]
    save_name = os.path.join(py_dir, f'{base_filename}_signed.png')

    # 画像を開く
    img_base = Image.open(base_path)
    img_sign = Image.open(sigh_path)

    # png画像を元画像に貼り付けて別名で保存
    img_base.paste(img_sign, (15, 15), img_sign)
    img_base.save(save_name)

img_base.paste(img_sign, (15, 15), img_sign)の(15, 15)の部分が元画像の左上からの座標なので必要に応じて変更すれば好きな位置に合成できる。

このPythonファイルと同じフォルダに合成するPNG画像をsigneture.pngという名前で入れておいて、合成したい画像をPythonファイルにドラッグ&ドロップすると合成された画像ファイルが同じフォルダに作成される。

参考資料

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次