Как можно выполнить цветные преобразования с профилями ICC на наборе произвольных значений пикселей (не на структуре данных изображения)?

StackOverflow https://stackoverflow.com/questions/3597528

Вопрос

Я хотел бы преобразовать набор значений пикселей из одного профилированного цвета в другое, без этих значений, проживающих в файле изображения, такого как (скажем) список структур данных RGB / RGBA / CMYK / ETC.

У меня есть питон и Пил В моем распоряжении, но я заинтересован в решениях в соответствующих средах, если это то, что нужно.

Последние PIL имеет очень хорошую поддержку для Littlecms. - Но нет способа передать ему что-нибудь, кроме формального изображения (или устаревшего объекта PYCMS) для этого, чтобы действовать.

Насколько я могу выяснить, инструмент командной строки icctrans Это включено в LittleCMS, делает что-то из такого рода, но я не могу найти ни одной не скелетной документации, и документация относится к нему как демонстрационный инструмент.

Это было полезно?

Решение

Для того, чтобы использовать текущую версию 2.3 Маленький 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)

Другие советы

Есть два способа.

  • Путь взлома: Для перепродарения 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() штука и ты хорош.

  • True-Nerd Way: Вам нужно использовать Python-Colormath. - Что отлично подходит для преобразований цветов пространства, но не профилирует. Colormath не может прочитать профили ICC, так что а) вы можете разбирать свой сумасшедший двоичный формат надежным образом, либо B) просто сделай математику, буквально. Этот парень Bruce LindBloom имеет все данные, доступные в формате Excel для, например, все затрагивания Вам нужно перепробить ваши луки. Он совершенно потрясающий. Я все еще пытаюсь «просто» кормить эти данные в Colormath, поэтому да, это делает меня менее удивительным, так как я все еще пытаюсь получить этот «ботаник» в чем-то, напоминающее качество производства.

Там вы идете. Это то, что я сделал до сих пор, чтобы ответить на вопрос о саморестанстве, коммандос-стиль ICC LUT трансформируется. U Ребята, Srsly.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top