![見出し画像](https://assets.st-note.com/production/uploads/images/120671504/rectangle_large_type_2_46644024ce6e8592b9e05e28c625eee8.png?width=1200)
見えないウォーターマーク(macOS)を使ってみよう
見えないウオーターマーク(Invisible Watermark)とは
目に見えるロゴなどではなく、見えない情報を画像に埋め込むという技術です。
実際にはわずかに画像の見た目も変化しているのですが、ほとんど知覚できない形で情報を埋め込みます。
情報を取り出す際はQRコードの様にソフトウエアで情報を取り出します。
オープンソースのツールを見つけました。
専門知識がなくてもなんとか導入できるヒント程度に手順を解説します。
手順
手順1 HomeBrewを使える様にします
HomeBrewをインストールします。
HomeBrewが何かはとりあえず気にしないで大丈夫です。
mac使いの間では、割といろんなことのために使われていますので、
すでに何か別のことで設定済みなら飛ばしてください。
Terminalアプリケーションを開き、Xcodeコマンドラインツールをインストールしてください。
xcode-select --install
Brew本体をインストールします
以下のサイト(英語)に手順がありますがまずは以下を実行します
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Apple Silicon(M1・M2プロセッサなど)では、若干手こずる要素があります。
詳しく書き始めると、それだけで記事になってしまいますが、
ネットにはいっぱい記事があるのと、もし記事にしても時間が経つとmacOSのバージョンアップなどの理由で、その通りではうまくいかなくなる可能性があるので、他の人の記事を検索してとにかくHomeBrewのインストールを成功させてください。
参考: Apple Silicon で必要なこと
nano ~/.zshrcファイルを編集し、以下を挿入します。
arm="env /usr/bin/arch -arm64 /bin/zsh --login"
alias intel="env /usr/bin/arch -x86_64 /bin/zsh --login"
export PATH=/usr/local/opt/node/bin:$PATH
Cmd + Oを押してファイルを保存し、Cmd + Xを押してnanoから終了します。ターミナルsource ~/.zshrcで実行して変更をロードします。
手順2 Pythonのインストールをします
以下のサイトの手順をのうち必要だったものを抜き出しています
ツールをインストールしていきます。
brew install memcache
・いっぱい表示されます
brew services start memcached
・何か表示されます
brew install git
・いっぱい表示されます
brew install mysql
・いっぱい表示されます
brew services start mysql
・何か表示されます
brew install postgresql
・いっぱい表示されます
brew services start postgresql@14
・何か表示されます
brew install node
・いっぱい表示されます
brew install wget
・いっぱい表示されます
もし以下の様なメッセージが出た場合は
Error: You have not agreed to the Xcode license. Please resolve this by running:
sudo xcodebuild -license accept
以下を実行します。
sudo xcodebuild -license accept
Password:
PasswordはmacOSのユーザパスワードを打ち込みます。
システム変更
nano ~/.zshrcファイルを編集し、このコンテンツを挿入します。
※「このコンテンツ」に関してはApple Siliconの場合以下の変更を行なってください。
※ 2023/11/5 変更が必要な箇所を追加しました。
変更前
export VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
homebrew=/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin
変更後
export VIRTUALENVWRAPPER_PYTHON=/opt/homebrew/bin/python3
source /opt/homebrew/bin/virtualenvwrapper.sh
homebrew=/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/mysql/bin
Cmd + Oを押してファイルを保存し、Cmd + Xを押してnanoから終了します。ターミナルsource ~/.zshrcで実行して変更をロードします。
python本体のインストール
以下は私のmac(M2 macMini / macOS 13.6.1) で必要だった手順です。
pythonのバージョンや機材の状態で変わるので参考程度です・
brew install python
pip3 install virtualenv virtualenvwrapper
(pipコマンドは受け付けず、pip3を受け付けました)
python3.11 -m pip install --upgrade pip
手順3 invisible-watermarkのインストールをします
以下のコマンドを実行します
pip install invisible-watermark
手順4 テスト
invisible-watermarkのインストール場所は以下の場所になりました。
上記のステップの中にある.zshrcの修正済みであれば、パスが通っています。
/opt/homebrew/bin/invisible-watermark
変換
invisible-watermark -v -a encode -t bytes -m dwtDct -w 'Photo by Kujirano Setaro' -o ~/Desktop/test.jepg /Volumes/SSD\ 2048GB/UsersExternal/mizoi/Pictures/20231029/DSC05709.JPG
エラーになってしまいました(汗)
watermark length: 192
encode time ms: 547.752857208252
Traceback (most recent call last):
File "/opt/homebrew/bin/invisible-watermark", line 106, in <module>
sys.exit(main())
^^^^^^
File "/opt/homebrew/bin/invisible-watermark", line 81, in main
cv2.imwrite(args.output, bgr_encoded)
cv2.error: OpenCV(4.8.1) /Users/xperience/GHA-OpenCV-Python/_work/opencv-python/opencv-python/opencv/modules/imgcodecs/src/loadsave.cpp:696: error: (-2:Unspecified error) could not find a writer for the specified extension in function 'imwrite_'
そんな拡張子は知らないよ、とのことです。"jepg"だとダメな様です。
気を取り直して。
invisible-watermark -v -a encode -t bytes -m dwtDct -w 'Photo by Kujirano Setaro' -o ~/Desktop/test.jpg /Volumes/SSD\ 2048GB/UsersExternal/mizoi/Pictures/20231029/DSC05709.JPG
watermark length: 192
encode time ms: 534.492015838623
埋め込み成功しました!
ぱっと見、画像の変化は全く分かりません。
情報が取り出せるか、確認します。
invisible-watermark -v -a decode -t bytes -m dwtDct -l 192 ~/Desktop/test.jpg
decode time ms: 327.8779983520508
Traceback (most recent call last):
File "/opt/homebrew/bin/invisible-watermark", line 106, in <module>
sys.exit(main())
^^^^^^
File "/opt/homebrew/bin/invisible-watermark", line 99, in main
wm = wm.decode('utf-8')
^^^^^^^^^^^^^^^^^^
またエラーです。
どうもその後調べたところ、 dwDct, dwdDctSvd, RivaGan の方式のうち、dwDctはなぜかうまく動作せず、また、RivaGanは4文字の埋め込み限定のようです。気を取り直してやり直し。
埋め込み
invisible-watermark -v -a encode -t bytes -m dwtDctSvd -w 'Photo by Kujirano Setaro' -o ~/Desktop/test.jpg /Volumes/SSD\ 2048GB/UsersExternal/Pictures/20231029/DSC05709.JPG
watermark length: 192
encode time ms: 1376.903772354126
取り出し
invisible-watermark -v -a decode -t bytes -m dwtDctSvd -l 192 ~/Desktop/test.jpg
decode time ms: 841.2570953369141
Photo by Kujirano Setaro
やっと成功しました。
手順5 結果
変換前と変換後の画像と、フォトショップによる差分の検証()を貼っておきます。
![](https://assets.st-note.com/img/1698988076957-aIixwW69fT.jpg?width=1200)
![](https://assets.st-note.com/img/1698988107015-p5vZ271Z1v.jpg?width=1200)
![](https://assets.st-note.com/img/1698989529226-GWD8wRpcU7.jpg?width=1200)
二つの画像が全く同じなら除算すればX=Y; X÷Y=1で、一面ピクセル値は1(白に限りなく違い灰色)になるはずですが、少し差異があり、情報が埋め込まれていることがわかります。
コマンドラインではとても使いにくいため、今度は、AppleScriptでドロップレットを作っておこうと思います