如何在一组任意像素值(而不是图像数据结构)上使用ICC配置文件执行颜色转换?

我想将一组像素值从一个配置文件颜色空间转换为另一个,而这些值不存在于图像文件中,例如(例如)RGB / RGBA / CMYK / etc数据结构列表。 我可以使用Python和PIL,但是如果需要的话,我对相关环境中的解决方案很感兴趣。 最新的PIL对LittleCMS提供了非常好的支持 - 但是除了PIL图像(或传统的pyCMS对象)之外,没有任何办法可以处理它。 据我所知,LittleCMS附带的命令行工具ѭ0does做了类似的事情,但我似乎无法找到任何非骨架文档,文档将其称为演示工具。     
已邀请:
为了使用当前2.3版本的Little CMS和Python,我使用Python发行版中的
h2py.py
脚本将
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()
对该图像进行变换(或校对变换)。 Blammo:那个PIL对象现在是你的LUT。用
image.load()
thingy读取值,你就是好的。 真正的书呆子方式:你需要使用Python-colormath - 这对于颜色空间变换很有用,但不能进行分析。 Colormath无法读取ICC配置文件,因此要么a)你要以可靠的方式解析他们疯狂的二进制格式,要么b)只是按字面意思进行数学运算。这个人Bruce Lindbloom拥有excel格式的所有数据,例如,您重新构建LUT所需的所有基质。他非常棒。我仍然试图'只是'将这些数据提供给colormath,所以是的,这让我不那么棒了,因为我仍然试图让这种“书呆子”方式变成类似于生产质量的东西。 你去吧这就是我到目前为止所做的回答独立,突击式ICC LUT变换的问题。呃,伙计们,srsly。     

要回复问题请先登录注册