任意のピクセル値のセット(画像データ構造ではなく)でICCプロファイルを使用して色を実行するにはどうすればよいですか?
-
02-10-2019 - |
質問
Pixel値のセットを、RGB/RGBA/CMYK/などのデータ構造のリストなど、これらの値が画像ファイルに存在することなく、Pixel値のセットを別のカラースペースに変換したいと思います。
私はpythonを持っています ピル 私が自由に使えるのに、それが必要な場合は、関連する環境でのソリューションに興味があります。
最新のPILには非常に素晴らしいサポートがあります littlecms - しかし、それが行動するためのPILイメージ(またはレガシーPYCMSオブジェクト)以外のものを渡す方法はありません。
私が確認できる限り、コマンドラインツール icctrans
LittleCMSにはこの種の何かが含まれていますが、骨格以外のドキュメントを見つけることはできないようで、ドキュメントはそれをデモンストレーションツールと呼んでいます。
解決
現在の2.3バージョンを使用するため リトルCMS Pythonで、翻訳しました lcms2.h
に lcms2consts.py
とともに h2py.py
Python Distributionにあるスクリプト。スクリプトは構造宣言を翻訳しませんが、定数は基本的な色変換を行うのに十分です ctypes
と lcms2
ダイナミックライブラリとして。
この例では、単一の色を、組み込みのプロファイルを使用して、二重精度ラボから8ビットSRGBに変換します。使用する cmsOpenProfileFromFile(filename, 'r')
代わりにファイルの場合。
import ctypes
from ctypes import byref
from lcms2consts import *
lcms = ctypes.windll.lcms2
inprof = lcms.cmsCreateLab4Profile(0)
outprof = lcms.cmsCreate_sRGBProfile()
xform = lcms.cmsCreateTransform(inprof, TYPE_Lab_DBL,
outprof, TYPE_RGB_8,
INTENT_PERCEPTUAL, 0)
lcms.cmsCloseProfile(inprof)
lcms.cmsCloseProfile(outprof)
DblTriplet = ctypes.c_double * 3
ByteTriplet = ctypes.c_ubyte * 3
inbuf = DblTriplet(60.1,20.2,0.5)
outbuf = ByteTriplet()
lcms.cmsDoTransform(xform, byref(inbuf), byref(outbuf), 1)
print list(outbuf)
lcms.cmsDeleteTransform(xform)
他のヒント
2つの方法があります。
ハックウェイ: nカラー構造を再現する(および/または色の間でそれらを変換)するには、1x(n+2)画像を作成します
PIL.Image.new()
, 、 使用するyourimage.load()
Pixel Setting Objectインターフェイスのものを取得し、(0、n)から(0、n)を取得したものに設定します。 (0、n+1)を白に、(0、n+2)を黒に設定し、お気に入りのICCファイルを使用してそのイメージを変換(または証明変換)PIL.ImageCms.ImageCmsTransform()
. 。 Blammo:そのPILオブジェクトは今あなたのLUTです。で値を読み取りますimage.load()
物事とあなたは元気です。真の方法: 使用する必要があります Python-Colormath - これは、カラースペースの変換に最適ですが、プロファイリングではありません。 ColormathはICCプロファイルを読み取ることができないため、a)信頼できる方法でクレイジーなバイナリ形式を解析するか、b) 数学をするだけです, 、 文字通り。この男のブルース・リンドブルームには、エクセル形式で利用可能なすべてのデータがあります。 すべてのマトリック あなたはあなたのlutsを再現する必要があります。彼は完全に素晴らしいです。私はまだこのデータをColormathに「ただ」しようとしているので、ええ、これはまだ「オタク」を生産品質に似たものにしようとしているので、私はそれほど素晴らしいものになりません。
そこに行きます。それが私がこれまでのところ、自立型のコマンドスタイルのICC LUT変換の質問に答えるためにしたことです。みんな、srsly。