2017-11-17 29 views
0

LittleCMS에서 색상 변환을 실행하는 데 도움을주세요. 저는 이중으로 작업하는 방법을 찾았지만 함께 스태킹하고 있습니다. 부호없는 char을 사용합니다. 부호가없는 과 같이 unsigned char 배열에 BGR 색상이 있습니다. 값은 0-255 일 수 있습니다. LittleCMS의 문서를 잘 이해하기 때문에 :이 유형의 경우 TYPE_BGR_8 (및 출력의 경우 TYPE_CMYK_8)을 사용해야합니다. 그러나 올바른 방법으로 변환하지 않습니다 - TYPE_BGR_DBL, TYPE_CMYK_DBL을 부호없는 배열에서 double로 변환하고 입력 배열을 0-1의 값으로 정규화 한 경우에만 올바른 변환을 받았습니다. 내 코드를 최적화하는 데 도움주세요 :LittleCMS 라이브러리 : rgb (bgr)에서 cmyk 색상으로 변환하는 동안 어떤 유형의 변수를 사용해야합니까?

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 

답변

0

답변은 다음과 같습니다

1)이 normilizing의 필요가 없습니다. BYTE (unsigned char)로 작업하는 경우. 이 경우 값의 범위는 0에서 255까지입니다. double (DBL)로 작업하는 경우 값을 정규화해야하는 것보다 :

RGB (BGR) = 0 ... 1 및 CMYK = 0.0 .. 100.0.

2) 두 가지 변형을 모두 사용할 수 있습니다.