【配布】Pythonで電子透かし刻印モジュール作成しました
こんにちはRcatです。
今回は、画像に電子透かしを刻印するためのモジュールを機能を強化して再作成しましたので紹介と配布をします。
まずはPythonにimportして使う前提のパターンの紹介です。
プログラミング無しでお手軽に使うにはこちら!
はじめに
利用規約
情報や作品の活用時は事前に利用規約をご確認ください。
コメントについて
利用規約のガイドラインを確認の上コメントしてください
この記事の画像は生成AIにて描いたものです。
環境はこちら↓
電子透かしとは?
電子透かしとは画像に薄く刻印された文字列やマークなどの事です。
画像検索をするとたまに"Sample"と刻印してあるのがよくありますよね。アレです。
私もnoteの画像を貼る時に自分で撮った写真やスクショ等を載せる前に"Rcat999"と刻印しています。これなら無断転載されても宣伝にしかなりませんのでw。
と、まぁそんな感じで発信するコンテンツを守るためのものですね。とはいえAIが進化している現在もうロゴけしAIなんかもありそうですが、そこまでやるともう罪の領域な気が…。
機能
まずは今回のモジュールはどんなことができるのか列挙します
テキスト透かし機能
任意の文字列を刻印しますフォント指定機能
任意のフォントを選べますフォント色機能
任意の色を指定できます
画像透かし機能
任意の画像(サインなど)を刻印しますサイズ指定機能
テキスト/画像をベース画像の何%のサイズで刻印するか設定できます幅、高さ、面積のいずれかを選べます不透明度設定機能
テキスト/画像に対しての透明度を指定できます回転機能
テキスト/画像を斜めに刻印できますパターン機能
透かしを一面に並べる機能です
位置指定は効きません揺らぎ機能
実行毎に、出力結果にばらつきを持たせますサイズ揺らぎ
位置揺らぎ
回転揺らぎ
不透明度揺らぎ
各機能の説明と使い方、実行結果例
今回はモジュールとしてimportしていただき、各自のpythonツールの中で手軽に刻印していただく目的での使い方を説明します。
プログラミングではなくGUIで操作したい場合はこちら。連続処理まではこちらでもできます。
インポートとインスタンス
下記手順で刻印オブジェクトをインスタンスして、ベース画像をセットします。すでに読み込んでいる場合はPillowのイメージオブジェクトでも良いです。
ちなみに、設定を引き継いで連続処理等を前提にしているので、処理後にSetImgで別のイメージをセットすれば同じ透かしをすぐに書き込むことができます。
刻印はReadを使います。読もうとした時点で最新の設定で刻印を行い返します。
import Watermark2 #インポート
wm = Watermark2.WM2() #インスタンス
wm.SetImg("simai.png") #刻印対象の画像
wm.Set(Text="(C) Rcat999") #テキストを設定 他全てSet関数で設定する
wm.Read() #設定済みの透かしを書き込んだ状態のImageオブジェクトが返るデフォルトの状態
インスタンス直後は以下のような設定になっています
コードが省略されている場合はこの設定になっているとしてください。
モード:テキスト刻印
フォント: ARIAL (LinuxはNotoSerifCJKだが未確認)
刻印文字列:Rcat999
フォントサイズ:0.1 (高さに対して10%)
フォント色:230,230,230 (薄いグレー)
不透明度:0.3 (透過率70%)
位置:(1,1) (中心)
揺らぎ:なし
テキスト透かし機能
基本的なテキスト透かし機能です。
パラメーター変更にはSet関数を使います。
import Watermark2
wm = Watermark2.WM2()
wm.SetImg("simai.png")
wm.Set(Fontsize=0.2)
wm.Read().show()実行結果
中央にうっすら"Rcat999"と刻印されました

文字はSetのText引数で変更します
wm.Set(Text="RCAT")
フォントの変更
SetFont関数にパスを渡すことでフォントを変更することができます。
一部のフォントは定数として定義済みです。ない場合やダウンロードしてきたものを使う場合はパスで指定してください。
見つからない場合例外が発生します。
import Watermark2
wm = Watermark2.WM2()
wm.SetImg("simai.png")
wm.Set(Fontsize=0.2)
wm.SetFont(Watermark2.Fonts.HGRPP)
#wm.SetFont(r"C:\Windows\Fonts\HGRPP1.TTC") #こっちでもいい
wm.Read().show()
画像透かし機能
手書きのサインなどを埋め込みたいときに使う機能です。
※透かしの画像は背景透過済みである前提です。
この場合Set関数にModeを渡して変更します。
Modeは TEXT ,FILL_TEXT ,IMAGE,FILL_IMAGE の4つです。
IMAGE以外は後で説明します。
また、SetwmImage関数で刻印用の画像を読み込んでいます。こちらもPillowオブジェクトでもOK。
import Watermark2
wm = Watermark2.WM2()
wm.SetImg("simai.png")
wm.Set(Mode=Watermark2.WM2.IMAGE)
wm.Set(Fontsize=0.3)
wm.SetwmImage("rcat.png")
wm.Read().show()真ん中に手書きのにゃんこが刻印されたのがお分かりでしょうか?

位置変更機能
位置はPos引数でタプルで変更できます。(X,Y)
0-0.99…のパーセント設定で、正なら左か上から、負なら右か下から。
1以上で真ん中になるように計算されます。
import Watermark2
wm = Watermark2.WM2()
wm.SetImg("simai.png")
wm.Set(Fontsize=0.1)
wm.Set(Pos=(-0.1,0.3)) #右から10% 上から30%
wm.Read().show()
サイズの指定方法
サイズを指定するにはFontsize引数を使い0-1で指定します。テキストでも画像でもこれを使います。
指定方法には高さ、幅、面積があります。
デフォルトでは"フォント高さ"を指定するので画像の高さに対するパーセンテージで計算されます。Sizemode引数にモードを指定します。
HEIGHT,WIDTH,AREAの3種類があります。
幅の20%にする場合の設定
import Watermark2
wm = Watermark2.WM2()
wm.SetImg("simai.png")
wm.Set(Fontsize=0.2)
wm.Set(Sizemode=Watermark2.WM2.WIDTH)
wm.Read().show()分かり辛いですが、文字を囲った四角を並べると5個並ぶので20%になっています。
なお、幅が20%になるフォントの高さを計算しているので、厳密に20%にはなりません。

画像で面積10%にした例です。
画像サイズが864x1304=1126656で透かしのサイズが391x288=112608なのでほぼ10%です。
wm.Set(Pos=(0,0))
wm.SetwmImage("rcat.png")
wm.Set(Mode=Watermark2.WM2.IMAGE)
wm.Set(Sizemode=Watermark2.WM2.AREA)
wm.Set(Fontsize=0.1)
色及び透明度
色はFontcolor引数でタプルで指定します。RGBを0-255で指定。
不透明度はOpacity引数で0-1で指定します。大きいほどはっきり刻印されます。
import Watermark2
wm = Watermark2.WM2()
wm.SetImg("simai.png")
wm.Set(Fontsize=0.3)
wm.Set(Fontcolor=(255,255,0)) #黄色
wm.Set(Opacity=0.7) #70%
wm.Read().show()

回転機能
文字や画像を回転させて貼り付けます。
Rorate引数に度数法で指定します。
import Watermark2
wm = Watermark2.WM2()
wm.SetImg("simai.png")
wm.Set(Rotate=30)#30度回転
wm.Read().show()
パターン(FILL)機能
画像一面に透かしを並べる機能です。
モードをFILL_TEXTかFILL_IMAGEに設定します。
import Watermark2
wm = Watermark2.WM2()
wm.SetImg("simai.png")
wm.Set(Fontsize=0.1)
wm.Set(Mode=Watermark2.WM2.FILL_TEXT)
wm.Read().show()
Fillspace引数を設定することで、隙間を調整できます。
import Watermark2
wm = Watermark2.WM2()
wm.SetImg("simai.png")
wm.Set(Fontsize=0.1)
wm.Set(Mode=Watermark2.WM2.FILL_TEXT)
wm.Set(Fillspace=(0.4,0.2)) #X隙,Y隙
wm.Read().show()
もちろん斜めも対応。
何となくですが、斜めの方がいい感じですね

画像の場合は、モードをFILL_IMAGEにします。
import Watermark2
wm = Watermark2.WM2()
wm.SetImg("simai.png")
wm.Set(Fontsize=0.1)
wm.Set(Mode=Watermark2.WM2.FILL_IMAGE)
wm.SetwmImage("rcat.png")
wm.Set(Fillspace=(0.2,0.2))
wm.Set(Rotate=135)
wm.Read().show()
揺らぎ各種
設定値に対して出力に揺らぎを持たせます。
Set関数に対して位置、サイズ、回転、透明度毎の揺らぎを設定します。
引数の名前は、Posfluctuation,Sizefluctuation,Rotatefluctuation,Opacityfluctuationです。
import Watermark2
wm = Watermark2.WM2()
wm.SetImg("simai.png")
wm.Set(Fontsize=0.1)
wm.Set(Posfluctuation=0.2,Opacity=0.7)#位置の揺らぎを10%に設定
wm.Read().show()2回実行すると以下のように位置がずれているのが分かります。これが揺らぎです。

揺らぎを4要素まとめ設定するとこんな感じ。
位置20%、回転+-30°、サイズ10%、透過+-30%
角度だけは1以上に設定しておかないとそもそも適用されないので注意。
import Watermark2
wm = Watermark2.WM2()
wm.SetImg("simai.png")
wm.Set(Fontsize=0.1,Opacity=0.7,Rotate=1)
wm.Set(Posfluctuation=0.2,Rotatefluctuation=30,Sizefluctuation=0.1,Opacityfluctuation=0.3)
for i in range(9):
wm.Read().show()9回実行した結果。サイズも濃さも位置もかなりばらついていることが分かります。

パターンの場合は位置以外が揺らぎます

サムネイル取得機能
刻印後の画像を長辺優先でNピクセル以内に収めた画像を返す機能です。
内部でImage.thumbnailを使っているだけですが。
wm.ReadThumbnail(Size=300).show() #300x300以内
wm.ReadThumbnail(Size=100).show() #100x100以内ダブルクリックで連続処理例
本作末尾に、起動すると同じフォルダ内の画像に片っ端から刻印していくサンプルを書いておきました。
刻印文字だけ変えればそのまま使うこともできます。

配布情報
URL
以下のURLより配布しています。
利用規約に同意の上ご利用ください。
内容
メインのモジュールと依存ライブラリリスト(1件だけ)です。
一応仮想環境構築バッチもあります。

ダウンロードに必要な配布情報は下記をご確認ください
いいなと思ったら応援しよう!
情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。