7

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

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

最新的 PIL 对LittleCMS有很好的支持——但除了 PIL 图像(或旧的 pyCMS 对象)之外,没有其他方法可以让它采取行动。

据我icctrans所知,LittleCMS 中包含的命令行工具可以执行此类操作,但我似乎无法在其上找到任何非骨架文档,并且文档将其称为演示工具。

4

2 回答 2

7

为了在 Python 中使用当前 2.3 版本的Little CMS,我使用Python 发行版中的脚本进行了lcms2.h翻译。该脚本不翻译结构声明,但常量足以使用动态库和作为动态库进行基本的颜色转换。lcms2consts.pyh2py.pyctypeslcms2

此示例使用内置配置文件将单色从双精度 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)
于 2012-02-21T09:37:13.607 回答
6

有两种方法。

  • hack 方法:要重新配置 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——它非常适合色彩空间转换,但不适用于分析。Colormath 无法读取 ICC 配置文件,因此要么 a) 您可以以可靠的方式解析其疯狂的二进制格式,要么 b)从字面上进行数学运算。这个家伙 Bruce Lindbloom 拥有所有 excel 格式的可用数据,例如,您需要重新配置 LUT的所有矩阵。他太棒了。我仍在尝试将这些数据“仅”输入到 colormath 中,所以是的,这让我不那么棒了,因为我仍在尝试将这种“书呆子方式”变成类似于生产质量的东西。

你去吧。这就是我迄今为止回答独立的、突击队风格的 ICC LUT 转换问题所做的工作。你们,srsly。

于 2010-10-16T12:16:22.943 回答