【发布时间】:2012-06-04 14:36:04
【问题描述】:
提前感谢您为我提供的任何帮助,并为我的英语不好感到抱歉。
我知道有很多关于这个主题的问题,但我在整个互联网(以及 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 颜色的自然数学......
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%... 但问题是我想知道是否有办法使用光栅图像、过滤器或类似的东西来实现这一点...纯Java2D
-
你甚至不需要花车。如果你只使用整数,我猜这可能会快 10 倍。
-
对不起这个问题,但是...怎么做?有什么想法吗?
-
不……转换时间相等……我不确定整数或浮点数是否有不同的时间……
标签: java image image-processing bufferedimage java-2d