webエンジニアの日常

RubyやPython, JSなど、IT関連の記事を書いています

python画像処理9 透過PNGに変換する

こんにちは、エンジニアのさもです。

先日デザイナーさんに、透過PNGってどうやって作ってるんですか?って聞いたところ、「Photoshop使ってます」と言っていました。

有料やんけ・・・

透過ぐらいならpythonで書いてしまおうと、スクリプトを書いてみました。

スポンサーリンク

はじめに

今回の目的は以下の画像を透過PNGに変換することです。

f:id:s-uotani-zetakansu:20171207122542p:plain

普通に白色だけ透過にしてしまうと、(255,255,254)のように少しでもずれると透過の対象外になってしまいます。

よくみるガビガビの透過PNGですね。

なので今回は、RGBの平均を取って、平均値が250より大きければ透過の対象としています。

実装

from PIL import Image, ImageDraw
import numpy as np

def select_color(color):
  mean = np.array(color).mean(axis=0)
  return (255,255,255,0) if mean >= 250 else color

def to_touka(img):
  w, h = img.size
  touka_img = Image.new('RGBA', (w, h))
  np.array([[touka_img.putpixel((x, y), select_color(img.getpixel((x,y)))) for x in range(w)] for y in range(h)])
  return touka_img

#画像の読み込み
filename = "samo.jpg"
original_img = Image.open("../images/" + filename).convert("RGB")
#透過画像へ変換して保存
to_touka(original_img).save("./" + filename.split(".")[0] + ".png")
  • select_color(color)メソッドは、引数の色に応じて、透過かそのまま表示かを返しています。
  • to_touka(img)メソッドは、そのままですが、引数の画像を元に透過画像を作成して返しています。
  • filenameへ一旦ファイル名を格納しているのは、保存時に同じ名前で拡張子がpngのものにするためです。
  • filename.split(".")でファイル名と拡張子を分けて、ファイル名だけを抜き出しています。

実行

python touka.py で実行してください。

同じフォルダにsamo.pngというファイルができました。

f:id:s-uotani-zetakansu:20171207123426p:plain

(注)分かりやすいように背景色をつけています

最後に

実際にデザイナーさんがphotoshopで作成したものと見比べても遜色無かったです。

透過したいだけでphotoshop使うのは大げさだな~と感じているかたは是非試してみてください。

読者登録をしていただけると、ブログを続ける励みになりますので、よろしくお願いします。