lcms2.h
转换成lcms2consts.py
。该脚本不会翻译结构声明,但常量足以使用ctypes
和lcms2
作为动态库执行基本的颜色转换。
以下示例使用内置配置文件将单个颜色从双精度Lab转换为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 种颜色结构(和/或在颜色空间之间转换它们),您可以使用 PIL.Image.new()
创建一个 1x(N+2) 图像,使用 yourimage.load()
获取像素设置对象接口,并将值 (0,0) 到 (0,N) 设置为您得到的任何值。将 (0,N+1) 设置为白色,将 (0,N+2) 设置为黑色,并使用您喜欢的 ICC 文件和 PIL.ImageCms.ImageCmsTransform()
转换(或证明转换)该图像。这样,那个 PIL 对象现在就是您的 LUT。使用 image.load()
读取出值即可。
真正的极客方式:您需要使用 Python-colormath -- 它非常适用于颜色空间转换但不适用于配置文件。Colormath 无法读取 ICC 配置文件,因此要么 a) 您要以可靠的方式解析它们的疯狂二进制格式,要么 b) 只需进行数学计算。这位 Bruce Lindbloom 在 Excel 格式中提供了所有数据,例如您需要重新调整 LUT 的 所有矩阵。他太棒了。我仍在尝试“只需”将这些数据馈入 colormath,所以是的,这使我不太棒,因为我仍在尝试将这种“极客方式”转化为类似于生产质量的东西。
这就是我迄今为止为回答独立的、突击式ICC LUT转换问题所做的。你们,认真点。
python-colormath
将涵盖90%的数学。这是一种有点违反直觉的方式,因为感觉像是你在特殊处理所有事情,直到你意识到“一般”ICC使用实际上是一个特例 - 大多数情况下,您的数学涉及XYZ矩阵变换到或从sRGB值,并在大多数其他情况下使用LUT。我正在使用来自http://dispcalgui.hoech.net的ICCProfile类读取配置文件。 - fish2000
h2py
绝对是Python扩展编程的罗塞塔石。谢谢。 - fish2000