fis*_*000 6 python colors color-space color-profile python-imaging-library
我想将一组像素值从一个配置文件颜色空间转换为另一个,而这些值不存在于图像文件中,例如(例如)RGB/RGBA/CMYK/etc数据结构列表.
我可以使用Python和PIL,但是如果需要的话,我对相关环境中的解决方案很感兴趣.
最新的PIL对LittleCMS提供了非常好的支持- 但是除了PIL图像(或传统的pyCMS对象)之外,没有任何办法可以处理它.
据我icctrans所知,LittleCMS附带的命令行工具可以做到这一点,但我似乎无法在其上找到任何非骨架文档,文档将其称为演示工具.
为了使用目前的2.3版本的小CMS与Python,我翻译lcms2.h到lcms2consts.py与h2py.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)
有两种方法.
黑客方式:要重新配置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.
| 归档时间: |
|
| 查看次数: |
3034 次 |
| 最近记录: |