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

fis*_*000 6 python colors color-space color-profile python-imaging-library

我想将一组像素值从一个配置文件颜色空间转换为另一个,而这些值不存在于图像文件中,例如(例如)RGB/RGBA/CMYK/etc数据结构列表.

我可以使用Python和PIL,但是如果需要的话,我对相关环境中的解决方案很感兴趣.

最新的PIL对LittleCMS提供了非常好的支持- 但是除了PIL图像(或传统的pyCMS对象)之外,没有任何办法可以处理它.

据我icctrans所知,LittleCMS附带的命令行工具可以做到这一点,但我似乎无法在其上找到任何非骨架文档,文档将其称为演示工具.

Jan*_*ila 7

为了使用目前的2.3版本的小CMS与Python,我翻译lcms2.hlcms2consts.pyh2py.py附带在Python分发脚本.该脚本并没有转化结构声明,但常数足以做基本的颜色转换用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)
Run Code Online (Sandbox Code Playgroud)


fis*_*000 5

有两种方法.

  • 黑客方式:要重新配置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()thingy 读取值,你就是好的.

  • 真正的书呆子方式:你需要使用Python-colormath - 这对于颜色空间变换很有用,但不能进行分析.Colormath无法读取ICC配置文件,因此要么a)你要以可靠的方式解析他们疯狂的二进制格式,要么b)只是按字面意思进行数学运算.这个人Bruce Lindbloom拥有excel格式的所有数据,例如,您重新构建LUT所需的所有基质.他非常棒.我仍然试图'只是'将这些数据提供给colormath,所以是的,这让我不那么棒了,因为我仍然试图让这种"书呆子"方式变成类似于生产质量的东西.

你去吧 这就是我到目前为止所做的回答独立,突击式ICC LUT变换的问题.呃,伙计们,srsly.