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