如何在一组任意像素值(不是图像数据结构上)上使用ICC配置文件进行颜色转换?
-
02-10-2019 - |
解决方案
为了使用当前2.3版本的 小CMS 我用python翻译了 lcms2.h
到 lcms2consts.py
与 h2py.py
Python发行中的脚本。该脚本不会翻译结构声明,但是常数足以进行基本的色彩转换 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)
其他提示
有两种方法。
骇客方法: 为了重塑n颜色结构(和/或在颜色空间之间转换它们),您可以创建一个1x(n+2)图像
PIL.Image.new()
, , 采用yourimage.load()
要获取一个像素设定对象接口,并将值(0,0)设置为(0,n)到您所获得的任何内容。将(0,n+1)设置为白色,(0,n+2)将黑色设置为黑色,并使用您喜欢的ICC文件进行映像(或验证转换)和PIL.ImageCms.ImageCmsTransform()
. 。 Blammo:那个PIL对象现在是您的LUT。阅读值image.load()
东西,你很好。真实的方式: 您需要使用 Python-Colormath - 非常适合Colorspace变换,但不进行分析。 Colormath无法阅读ICC配置文件,因此a)您可以以可靠的方式解析其疯狂的二进制格式,或者b) 只是做数学, , 字面上地。这个家伙Bruce Lindbloom拥有所有以Excel格式可用的数据, 所有矩阵 您需要重新授予您的LUTS。他很棒。我仍在尝试将这些数据“仅”馈送到Colormath中,所以,是的,这使我不太出色,因为我仍在尝试将这种“书呆子”变成类似于生产品质的东西。
你去。到目前为止,这就是我为回答独立式ICC LUT转变的独立式问题的问题。你们,srsly。