Заранее благодарим за любую помощь, которую вы могли бы мне предоставить, и извините за мой плохой английский.Объедините четыре изображения 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 образ. Все эти изображения имеют одинаковые размеры. Я преобразовал четыре изображения в одном CMYK изображение, используя этот код:
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» является только естественным математике для преобразования CMYK цвета в RGB Color ...
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];
}
Проблема здесь есть ... скорость. Для обработки одного изображения требуется 12 секунд, потому что мы должны читать каждый пиксель и записывать каждый пиксель, и я думаю, что функции «getRGB» и «setRGB» выполняются не очень быстро (или это просто лучший способ достичь этого) ,
¿Как я могу это достичь? Я много читаю о ColorModel, фильтрах, но я до сих пор не понимаю, как добиться этого в лучшем случае.
Вы можете вычислить 1/255f один раз для всех изображений и использовать его в умножении, вместо создания дивизии. Попробуйте и отчитайтесь. :) –
Хорошо ... это лучше на 10% ... Но дело в том, что я хочу знать, есть ли способ достичь этого, используя Растровые изображения, фильтры или что-то вроде этого ... Pure Java2D – epilefreyes
даже нужны поплавки. Я бы предположил, что это может быть примерно в 10 раз быстрее, если вы делаете это только с целыми числами. –