ImageMagickでカラープロファイルを操作できると見かけてwebを漁りまわった結果、ドロップした画像のカラープロファイルをどうにかこうにか上手いことあれするバッチができた。『送る』メニューにでも置いておけば、BlenderやらSAIやらスクリーンショットツールといったカラマネ非対応ソフトが吐き出した画像にひょいひょいカラープロファイルを埋め込める。

ImageMagickはWindows用だけでも複数の選択肢があるので、迷うようならstaticで16bitなHDRIがお勧め。自分で判断する場合は以下が参考になる。

ドロップした画像のカラープロファイルをあれするバッチ

@echo off
for /F "DELIMS=" %%t IN ('magick identify -format %%[icc:model] "%~1"') DO SET ICC_PROFILE=%%t

echo.
echo =================================================================
echo.
echo.

if not "%ICC_PROFILE%" == "" (
	echo %~nx1 には【%ICC_PROFILE%】が埋め込まれています。
	) else (
	echo %~nx1 には埋め込みカラープロファイルがありません。
	)

echo.
echo.
echo =================================================================
echo.
echo ※カラープロファイルを変換しますか?
echo  画像がプロファイルを持っていない場合は埋め込みのみ行います。
echo.
echo   [1] sRGB IEC61966-2.1
echo   [2] sRGB-elle-V2-srgbtrc
echo   [3] AdobeRGB (1998)
echo   [4] 規定のモニタープロファイル
echo  [41] 規定のモニタープロファイルであると想定し、sRGB IEC61966-2.1 へ変換
echo  [42] 規定のモニタープロファイルであると想定し、sRGB-elle-V2-srgbtrc へ変換
echo  [43] 規定のモニタープロファイルであると想定し、AdobeRGB (1998)へ変換
echo  [その他] なにもせず終了
echo.

set PATH_SRGB=C:\Windows\System32\spool\drivers\color\sRGB Color Space Profile.icm
set PATH_SRGB_ELLE=C:\Program Files\Krita (x64)\share\color\icc\krita\sRGB-elle-V2-srgbtrc.icc
set PATH_ADOBE_RGB=C:\Windows\System32\spool\drivers\color\AdobeRGB1998.icc
set PATH_MONITOR=C:\Windows\System32\spool\drivers\color\Generic PnP Monitor.icm

set /P ANSWER="半角数字で指定... "
if /i {%ANSWER%}=={1} (goto :1)
if /i {%ANSWER%}=={2} (goto :2)
if /i {%ANSWER%}=={3} (goto :3)
if /i {%ANSWER%}=={4} (goto :4)
if /i {%ANSWER%}=={41} (goto :41)
if /i {%ANSWER%}=={42} (goto :42)
if /i {%ANSWER%}=={43} (goto :43)

exit

:1
magick "%~1" -intent Relative -black-point-compensation -profile "%PATH_SRGB%" "%~d1%~p1%~n1_icc-srgb%~x1"
echo 画像のカラープロファイルを sRGB IEC61966-2.1 に変換しました。
pause & exit

:2
magick "%~1" -intent Relative -black-point-compensation -profile "%PATH_SRGB_ELLE%" "%~d1%~p1%~n1_icc-elle%~x1"
echo 画像のカラープロファイルを sRGB-elle-V2-srgbtrc に変換しました。
pause & exit

:3
magick "%~1" -intent Relative -black-point-compensation -profile "%PATH_ADOBE_RGB%" "%~d1%~p1%~n1_icc-adobe%~x1"
echo 画像のカラープロファイルを AdobeRGB (1998) に変換しました。
pause & exit

:4
magick "%~1" -intent Relative -black-point-compensation -profile "%PATH_MONITOR%" "%~d1%~p1%~n1_icc-mymonitor%~x1"
echo 画像のカラープロファイルを規定のモニタープロファイルに変換しました。
pause & exit

:41
magick "%~1" -profile "%PATH_MONITOR%" -intent Relative -black-point-compensation -profile "%PATH_SRGB%" "%~d1%~p1%~n1_icc-srgb%~x1"
echo 画像は規定のモニタープロファイルで製作されたと想定し、sRGB IEC61966-2.1 に変換しました。
pause & exit

:42
magick "%~1" -profile "%PATH_MONITOR%" -intent Relative -black-point-compensation -profile "%PATH_SRGB_ELLE%" "%~d1%~p1%~n1_icc-elle%~x1"
echo 画像は規定のモニタープロファイルで製作されたと想定し、sRGB-elle-V2-srgbtrc に変換しました。
pause & exit

:43
magick "%~1" -profile "%PATH_MONITOR%" -intent Relative -black-point-compensation -profile "%PATH_ADOBE_RGB%" "%~d1%~p1%~n1_icc-adobe%~x1"
echo 画像は規定のモニタープロファイルで製作されたと想定し、AdobeRGB (1998) に変換しました。
pause & exit
images/post/screenshot.1495292050.png
実行画面

最近のテキストエディタはデフォルトがUTF-8だったりするけど、バッチファイルはshift-jisかつ改行コードCR+LFにしておかないとコケることがある。コケた。

もちろん各プロファイルの絶対パスは環境によって変わるので、書き換えたり選択肢ごと消すなりして。あとカラープロファイルを持たない画像を投げつけるとエラーを返されてなんかカッコ悪い(先頭部分)んだけどどうにもできないんだ。品質には問題ございません。

画像をドロップしてそのままEnterすれば現在どんなプロファイルがくっついてるか調べるだけでどこも弄らないから安心。それだけ知りたいことも結構あるからね。もっとも、埋め込んだり変換したりしても別名で書き出すから元のファイルは安全安心。ただし連番付けたりはしない。

既知の問題

おおむね期待通りに機能してるんだけど、一点、sRGB IEC61966-2.1.icm、このプロファイルだけ画像に埋め込むことができない。変換や認識は正常に行えるんだけど、埋め込むことだけができない。

埋め込みプロファイルがなくとも画像のカラースペースがsRGB IEC61966-2.1であることを示すフラグは存在するので、思うに、憶測も甚だしいが、sRGB IEC61966-2.1は標準も標準の規格だからプロファイルそのものを埋め込む必要はない、みたいな判断をImageMagickがやっているのではなかろーか。

理由はどうあれ、とにかくそんなことでは困るので、だれかうっかり解決策ください。

Kritaが推してくるsRGB-elle-V2-srgbtrcはsRGB IEC61966-2.1の代替として使ってぜんぜんOKなモノなので、プロファイル本体が埋め込まれないことに問題がある場合はこっちを使うのもありあり。

カラマネ非対応ソフトで作った画像に割り当てるべきカラースペースは

その画像を作るときに見ていた、自分のモニタのプロファイル。このバッチだと4番。web掲載するなら、モニタプロファイル割り当て後にsRGB変換するのが一番無難なカタチだろう。上記バッチを例にするなら41番か、42番。SAIマンやメディバンマンや火達磨アルパカマンもにっこりだ。

あとBlenderマンもな。

というかBrenderはこんなにデキる統合3DソフトなんだからそろそろICCプロファイルくらい考慮してほしい。テクスチャの修繕でBlenderからKritaに渡すたびに色がズレていくのはなかなか洒落にならない。もっともこれについてはプロファイルなし画像のカラースペースを無許可でsRGBだと決め付けて開くKritaの仕様が悪なのだけど、それは置いとくとしても、最終出力物であるレンダリング画像のカラマネがBlenderでは不可能だというのはなんともモヤモヤしないかい。Blenderだけでは完結できないってことでしょ。悔しくないのか!

とにかく、ようやくKritaで画像を開く前の下準備としてわざわざGIMPを立ち上げにゃならん状況から解放されたってワケ。

カラープロファイルを操作するImageMagickのコマンド

上記のバッチで使っている、ImageMagickのコマンドはたった2種類だけなので、バッチに詳しいひとはもっと上手いことあれするそれを作ってね。

画像に埋め込まれているカラープロファイルを確認するコマンド

magick identify -format %[icc:model] "画像のパス"

実際にカラープロファイルをどうこうするコマンド

magick "[画像のパス]" -intent Relative -black-point-compensation -profile "[カラープロファイルのパス]" "[変換後の書き出しファイル名]"

このコマンドについてはここに非常にわかりやすく纏まってて言うことがない。

-intentをPerceptual(知覚的)にするかRelative(相対的な色域を維持)にするかは、個々の画像の向き不向きや好みの問題もあって画一的に決められることではないが、モニタプロファイルからsRGBへの変換くらいなら相対的色域維持でいい場面が多いんじゃなかろうか。そもそもレンダリングインテントによる変換結果の差が気になるならば、それこそGIMPやKrita、持ってるならPhotoshopなどで実際にプレビューしながら選択する方がいいし、そういった用途に重量級ソフトを持ち出すことはぜんぜん面倒ではない。今回のバッチが動いて嬉しい点はあくまで、埋め込みプロファイルがない画像に対して選択的にプロファイルを指定することができる(特に規定のモニタープロファイルの埋め込みは使用頻度が高い)点で、変換はまあオマケなのじゃ。