代码之家  ›  专栏  ›  技术社区  ›  fish2000

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

  •  5
  • fish2000  · 技术社区  · 15 年前

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

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

    最新的PIL对 LittleCMS --但除了pil图像(或遗留的pycms对象)之外,没有其他方法可以将其传递给它。

    据我所知,命令行工具 icctrans LittleCMS中包含这样的功能,但我似乎找不到任何非骨架文档,文档将其称为演示工具。

    2 回复  |  直到 8 年前
        1
  •  6
  •   Janne Karila    14 年前

    为了使用当前的2.3版本 Little CMS 我翻译了python lcms2.h lcms2consts.py h2py.py python发行版中提供的脚本。脚本不转换结构声明,但常量足以对 ctypes lcms2 作为动态库。

    此示例使用内置配置文件将单一颜色从双精度实验室转换为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)
    
        2
  •  5
  •   Peter O. Manuel Pinto    8 年前

    有两种方法。

    • 黑客之道: 要重新设置n个颜色结构(和/或在颜色空间之间转换它们),可以使用 PIL.Image.new() 使用 yourimage.load() 要得到一个像素设置对象接口的东西,并设置值(0,0)到(0,n)到你得到的任何东西。将(0,n+1)设置为白色,将(0,n+2)设置为黑色,并使用您喜欢的ICC文件转换(或校对转换)该图像,以及 PIL.ImageCms.ImageCmsTransform() . 这个PIL对象现在是你的LUT。用读取值 image.load() Thingy和你很好。

    • 真正的书呆子方式: 你需要使用 Python-colormath --这对色彩空间变换很好,但不适合轮廓。colormath无法读取ICC配置文件,因此a)您可以可靠地解析它们疯狂的二进制格式,或者b) just do the math 从字面上看。这家伙布鲁斯·林德布卢姆拥有Excel格式的所有数据,比如, all of the matricies 您需要重新设置LUT。他真是太棒了。我仍在尝试将这些数据“仅仅”输入到ColorMath中,所以是的,这让我不那么可怕,因为我仍在尝试将这种“书呆子的方式”转化为类似于生产质量的东西。

    你走吧。这就是我到目前为止所做的,来回答独立的,突击式的ICCLUT转换的问题。你们这些家伙,SRSLY。