미리 감사드립니다. 저에게 제공 할 수있는 도움에 감사 드리며, 저의 영어 실력을 유감스럽게 생각합니다.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, 필터에 대해 많이 읽었지만 더 좋은 시간에이를 달성하는 방법을 아직 이해하지 못합니다.
당신은 모든 이미지를 한 번에 1/255f를 계산할 수 있고 곱셈에서 사용 :
다시 부동 소수점과에 CMYK로 변환 할 필요가 없습니다, 당신은 픽셀 값과 직접 작업 할 수 있습니다 부서 만들기. 그것을 시도하고 다시보고하십시오. :) –
좋아 ... 10 % 향상 ...하지만이 점은 래스터 이미지, 필터 또는 이와 유사한 것을 사용하여이를 달성 할 수있는 방법이 있는지 알고 싶습니다. 순수 Java2D – epilefreyes
당신은 수레도 필요합니다. 당신이 정수로만 할 경우 약 10 배 더 빠를 수 있다고 생각합니다. –