将四个CMYK图像合并为一个RGB Image Java

时间:2012-06-04 14:36:04

标签: java image image-processing bufferedimage java-2d

提前感谢您提供给我的任何帮助,并抱歉我的英语不好。

我知道有很多关于这个话题的问题,但我在所有的互联网上看了很多(以及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();
}

Just 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颜色的自然数学...

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 个答案:

答案 0 :(得分:0)

您可以使用getDatasetData加快对getRGBsetRGB的像素访问速度。

无需将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;
}