使用BufferedImage时,灰度图像变为单色

时间:2016-04-13 13:43:43

标签: java image bufferedimage

我需要编写一个程序来拍摄图像,调整大小并旋转它然后将其保存。前两点已经完成,但现在我遇到了问题。每当我转换灰度图像时,它就变成单色图像。 我使用以下命令加载目标图像:

BufferedImage sourceimg = ImageIO.read(input);

在我缩放并旋转之后,我使用以下命令将其保存:

BufferedImage newimg = new BufferedImage(sourceimg.getHeight(), sourceimg.getWidth(), sourceimg.getType());
op.filter(sourceimg, newimg);

sourceimg = newimg;
ImageIO.write(sourceimg, "png", outputFile);

这适用于除灰度图像之外的每个图像。我已经通过将每个图像的类型设置为ARGB来尝试解决方法,但必须有另一种方法。有没有办法获得给定图像的IndexColorModel?

2 个答案:

答案 0 :(得分:0)

问题现在解决了,我只需要改变:

BufferedImage newimg = new BufferedImage(sourceimg.getHeight(), sourceimg.getWidth(), sourceimg.getType());

为:

BufferedImage newimg = new BufferedImage(sourceimg.getWidth(), sourceimg.getHeight(), BufferedImage.TYPE_INT_ARGB);

答案 1 :(得分:0)

还有其他解决方案,特别是如果您想保留原始图像类型(即保留IndexColorModel图像的调色板等)。

事实上,最简单的方法就是这样做(假设op是标准BufferedImageOp):

BufferedImage newimg = op.filter(sourceimg, null);

这里将为您创建一个新的兼容图像,并且尺寸正确以保持操作结果。

另一个保留图像类型和颜色模型的选项略显冗长:

ColorModel sourceCM = sourceimg.getColorModel(); // Will be the IndexColorModel in your case
// I'm assuming you are deliberately switching width/height to rotate 90 deg
WritableRaster raster = sourceCM.createCompatibleWritableRaster(sourceimg.getHeight(), sourceimg.getWidth());
BufferedImage newimg = new BufferedImage(sourceCM, raster, sourceCM.isAlphaPremultiplied(), null);

op.filter(sourceimg, newimg);