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

发布于 2021-01-29 17:14:24

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

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

最新的PIL对LittleCMS具有很好的支持-
但是除了PIL映像(或旧版pyCMS对象)之外,没有其他方法可以对其执行操作。

据我icctrans所知,LittleCMS附带的命令行工具可以执行此类操作,但是我似乎找不到任何非骨骼文档,该文档将其称为演示工具。

关注者
0
被浏览
155
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    为了将Little
    CMS
    的当前2.3版本与Python一起使用,我将其翻译lcms2.h为Python发行版中随附lcms2consts.pyh2py.py脚本。该脚本不会转换结构声明,但这些常量足以使用ctypeslcms2作为动态库进行基本的颜色转换。

    本示例使用内置配置文件将单色从双精度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)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看