2012-06-04 2 views
0

미리 감사드립니다. 저에게 제공 할 수있는 도움에 감사 드리며, 저의 영어 실력을 유감스럽게 생각합니다.4 개의 CMYK 이미지를 하나의 RGB 이미지로 병합하십시오. Java

나는이 주제에 대한 질문을 많이 알고,하지만 난 (도 및 StackOverflow의) 모든 인터넷에서 많이 보았다하지만이에 대한 답을 발견하지 않았습니다 ...

나는 네가 이미지; 각각은 TYPE_BYTE_GRAY 컬러 모델에 있습니다. 나는이 코드를 사용하여 이러한 네 개의 이미지를로드 한 :

int numElems = 4; 
BufferedImage[] img = new BufferedImage[numElems]; 
for(int i=0;i<numElems;i++){ 
    FileInputStream in = new FileInputStream(args[i]); 
    img[i] = ImageIO.read(in); 
    in.close(); 
} 

그냥 ImageIO에서 읽고 ... 내가 한 RGB 이미지로 네 개의 이미지를 "병합"할 필요를 ... 이미지의 각 하나는 CMYK에서 하나 개의 채널입니다 영상. 이 모든 이미지는 동일한 크기입니다.

function convertComponentsRGB(int[] pointColor){ 
float cyan = (float)pointColor[0]/(float)255; 
float magenta = (float)pointColor[1]/(float)255; 
float yellow = (float)pointColor[2]/(float)255; 
float black = (float)pointColor[3]/(float)255; 

float c = min(1f,cyan * (1f - black) + black); //minimum value 
float m = min(1f,magenta * (1f - black) + black); //minimum value 
float y = min(1f, yellow * (1f - black) + black); //minimum value 

result[0] = Math.round(255f*(1f - c)); 
result[1] = Math.round(255f*(1f - m)); 
result[2] = Math.round(255f*(1f - y)); 

    return (result[0]<<16) | (result[1]<<8) | result[2]; 
} 

문제 ... 여기

for(int j=0;j<img[0].getHeight();j++){ 
    //Read current point color... 
    for(int k=0;k<numElems;k++){ 
     colPunto[k] = (img[k].getRGB(i, j) & 0xFF); 
    } 

    int colorPunto = convertComponentsRGB(colPunto); 

    //Now, I set the point... 
    out.setRGB(i, j, colorPunto); 
    } 
} 

이 기능 "convertComponentsRGB은"RGB 색상에 CMYK 색상을 변환하는 단지 자연 수학은 :이 코드를 사용하여 하나 개의 CMYK 이미지에 네 개의 이미지를 변환 한 속도는 ...입니다. 각 픽셀을 읽고 각 픽셀을 작성해야하기 때문에 하나의 이미지를 처리하는 데 12 초가 걸리며 "getRGB"및 "setRGB"함수는 매우 빠르지 않다고 생각합니다 (또는이를 달성하기위한 최선의 방법 일뿐입니다) .

¿ 어떻게해야합니까? ColorModel, 필터에 대해 많이 읽었지만 더 좋은 시간에이를 달성하는 방법을 아직 이해하지 못합니다.

+0

당신은 모든 이미지를 한 번에 1/255f를 계산할 수 있고 곱셈에서 사용 :

다시 부동 소수점과에 CMYK로 변환 할 필요가 없습니다, 당신은 픽셀 값과 직접 작업 할 수 있습니다 부서 만들기. 그것을 시도하고 다시보고하십시오. :) –

+0

좋아 ... 10 % 향상 ...하지만이 점은 래스터 이미지, 필터 또는 이와 유사한 것을 사용하여이를 달성 할 수있는 방법이 있는지 알고 싶습니다. 순수 Java2D – epilefreyes

+0

당신은 수레도 필요합니다. 당신이 정수로만 할 경우 약 10 배 더 빠를 수 있다고 생각합니다. –

답변

0

getDatasetData을 사용하면 getRGBsetRGB 대 픽셀에 대한 액세스 속도를 높일 수 있습니다. 대신,

function convertComponentsRGB(int[] pointColor){ 
    int r = max(0, 255 - (pointColor[0] + pointColor[3])); 
    int g = max(0, 255 - (pointColor[1] + pointColor[3])); 
    int b = max(0, 255 - (pointColor[2] + pointColor[3])); 

    return (r<<16) | (g<<8) | b; 
} 
관련 문제