Библиотека LittleCMS: какой тип переменной мне нужно использовать при преобразовании цветов rgb (bgr) в cmyk

Помогите, пожалуйста, запустить преобразование цветов в LittleCMS: я нахожу, как работать с double, но я использую неподписанный символ. У меня есть цвет BGR в массиве unsigned char, что-то вроде этого: unsigned char scanline [3] = {147, 112 220}, Значения могут быть 0-255, Как я понимаю документы LittleCMS: для этого типа я должен использовать TYPE_BGR_8 (а также TYPE_CMYK_8 для вывода). Но он не конвертируется правильно - только когда я использовал TYPE_BGR_DBL, TYPE_CMYK_DBL, преобразовал из беззнакового массива в удвоение и нормализовал мой входной массив до значений от 0 до 1 Я получил правильное преобразование Пожалуйста, помогите оптимизировать мой код:

1) Нужно ли нормализовать значения до 0-1?

2) Какие типы я должен использовать в моей программе, чтобы исключить преобразование из массива без знака в удвоение?

Мои программы и выводы

1) Работать правильно:

#include <stdio.h>
#include <stdlib.h>
#include "lcms2.h"

int main (){
    cmsHPROFILE hInProfile, hOutProfile; 
    cmsHTRANSFORM hTransform; 
    hInProfile = cmsCreate_sRGBProfile();
    hOutProfile = cmsOpenProfileFromFile("/home/ab/Documents/cmyk/colorProfiles/WebCoatedSWOP2006Grade5.icc", "r");
hTransform = cmsCreateTransform(hInProfile, TYPE_BGR_DBL, hOutProfile, TYPE_CMYK_DBL, INTENT_PERCEPTUAL, 0);
cmsCloseProfile(hInProfile);
cmsCloseProfile(hOutProfile);

                unsigned char scanline0[3] = {147, 112, 220};
                double scanline [3], outputline [4];

                for(int k=0;k<3;k++){
                    scanline [k] = (double)scanline0 [k]/255;
                }

                printf("Red = %f \n",scanline  [2]);
                printf("Green = %f \n", scanline [1]);
                printf("Blue = %f \n \n", scanline [0]);

                cmsDoTransform(hTransform, scanline, outputline, 1); //transforming from one to other

                printf(" Cyan %f\n Mageta %f\n Yellow %f\n Black %f\n ", outputline[0], outputline[1], outputline[2], outputline[3]); //C M Y K

    return 0;
}

Выход:

Red = 0.862745 
Green = 0.439216 
Blue = 0.576471 

 Cyan 15.350576
 Mageta 68.361944
 Yellow 25.549707
 Black 1.419089

2) Когда я использую неподписанный символ, он работает неправильно. Программа:

hTransform = cmsCreateTransform(hInProfile, TYPE_BGR_8, hOutProfile, TYPE_CMYK_8, INTENT_PERCEPTUAL, 0);

...
                unsigned char scanline[3] = {147, 112, 220}, outputline [4];

                printf("Red = %d \n",scanline  [2]);
                printf("Green = %d \n", scanline [1]);
                printf("Blue = %d \n \n", scanline [0]);

                cmsDoTransform(hTransform, scanline, outputline, 1);

Выход:

Red = 220 
Green = 112 
Blue = 147 

 Cyan 39
 Mageta 174
 Yellow 65
 Black 4

1 ответ

Ответы:

1) Там не нужно нормировать. если вы работаете с BYTE (unsigned char). В этом случае значения находятся в диапазоне от 0 до 255. Если мы работаем с двойной (DBL), то мы должны нормализовать значения:

RGB (BGR) = 0... 1 и CMYK = 0,0 ... 100,0.

2) Мы можем использовать оба варианта.

Другие вопросы по тегам