我知道可以使用
将图像转换为CS_GRAYpublic static BufferedImage getGrayBufferedImage(BufferedImage image) {
BufferedImageOp op = new ColorConvertOp(ColorSpace
.getInstance(ColorSpace.CS_GRAY), null);
BufferedImage sourceImgGray = op.filter(image, null);
return sourceImgGray;
}
但是,这是我整个计划的阻碍点。我需要经常这样做,在800x600像素图像上,平均需要大约200-300ms才能完成此操作。我知道通过使用一个for循环来循环遍历图像数据并立即设置它,我可以更快地做到这一点。另一方面,上面的代码构建了一个全新的800x600 BufferedImage,它是灰度级的。我宁愿只改变我传入的图像。
是否有人知道如何使用for循环并且假设图像是RGB颜色空间?
答案 0 :(得分:3)
ColorConvertOp.filter
有两个参数。第二个参数也是BufferedImage
,它将是目的地。如果您将正确的BufferedImage
传递给filter
方法,则可以避免麻烦,从而创建新的BufferedImage
。
答案 1 :(得分:1)
private static int grayscale(int rgb) {
int r = rgb >> 16 & 0xff;
int g = rgb >> 8 & 0xff;
int b = rgb & 0xff;
int cmax = Math.max(Math.max(r, g),b);
return (rgb & 0xFF000000) | (cmax << 16) | (cmax << 8) | cmax;
}
public static BufferedImage grayscale(BufferedImage bi) {
BufferedImage bout = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_INT_ARGB);
int[] rgbArray = new int[bi.getWidth() * bi.getHeight()];
rgbArray = bi.getRGB(0, 0, bi.getWidth(), bi.getHeight(), rgbArray, 0, bi.getWidth());
for (int i = 0, q = rgbArray.length; i < q; i++) {
rgbArray[i] = grayscale(rgbArray[i]);
}
bout.setRGB(0, 0, bout.getWidth(), bout.getHeight(), rgbArray, 0, bout.getWidth());
return bout;
}
无论你做什么,你都可能做错了什么。你不应该一遍又一遍地重新生成缓冲图像。但是,而是找出一个方案来简单地更新缓冲图像,或者从原始图像中获取原始像素,并且只使用每个部分中RGB组件的最大灰度。