2016-04-13 30 views
-1

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

+0

什么是'黑白image'? – ELITE

+0

“有没有办法获得给定图像的IndexColorModel?”这与你的主要问题有什么关系?你是否想要一些复杂的东西来解决一个简单的问题?你还有什么处理sourceimg = newimg? – gpasch

+0

sourceimg = newimg被使用,因为在后面的代码中使用它,并且newimg得到instanciated的部分是可选的,所以我不能保证newimg存在这就是为什么sourceimg = newimg,问题本身是通过替换'sourceimg来解决的。 getType()'与'sourceimg.getColorModel()。getNumColorComponents()'。我想知道是否可以得到IndexColorModel,因为我认为我可以解决我的问题。 – Cracksoldier

回答

0

问题IST现在问题解决了,我不得不改变:

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

到:

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

看看[BufferedImage'的构造函数](https://docs.oracle.com/javase/8/docs/api/java/awt/image/BufferedImage.html#BufferedImage-int-int-int-),我可以说这个解决方案是虚假的,只会碰巧巧合工作。什么是'sourceimg.getColorModel()。getNumColorComponents()'在你的情况? – Marco13

+0

它返回值3 – Cracksoldier

+0

如果我查找构造函数,它只对所有输出的图像使用相同的colormodel,这就是它的工作原理。 – Cracksoldier

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);