2012-06-04 3 views
0

Заранее благодарим за любую помощь, которую вы могли бы мне предоставить, и извините за мой плохой английский.Объедините четыре изображения 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, фильтрах, но я до сих пор не понимаю, как добиться этого в лучшем случае.

+0

Вы можете вычислить 1/255f один раз для всех изображений и использовать его в умножении, вместо создания дивизии. Попробуйте и отчитайтесь. :) –

+0

Хорошо ... это лучше на 10% ... Но дело в том, что я хочу знать, есть ли способ достичь этого, используя Растровые изображения, фильтры или что-то вроде этого ... Pure Java2D – epilefreyes

+0

даже нужны поплавки. Я бы предположил, что это может быть примерно в 10 раз быстрее, если вы делаете это только с целыми числами. –

ответ

0

Вы можете использовать getData и setData для ускорения доступа к пикселям против getRGB и setRGB.

Там нет необходимости преобразовывать CMYK с плавающей точкой и обратно, вы можете работать непосредственно со значениями пикселей:

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; 
} 
Смежные вопросы