实际上,我正在开发一款图像编辑软件,现在我想将缓冲图像转换为:
BufferedImage buffer = ImageIO.read(new File(file));
转换为图片,即以以下格式:
Image image = ImageIO.read(new File(file));
是否有可能这样做?如果是,那么如何实现?
实际上,我正在开发一款图像编辑软件,现在我想将缓冲图像转换为:
BufferedImage buffer = ImageIO.read(new File(file));
转换为图片,即以以下格式:
Image image = ImageIO.read(new File(file));
是否有可能这样做?如果是,那么如何实现?
BufferedImage是图像(Image)类型的一种,因此你在第二行所做的隐式转换可直接编译。如果你知道一个Image实际上就是一个BufferedImage,那么你需要像这样显式地进行强制类型转换:
Image image = ImageIO.read(new File(file));
BufferedImage buffered = (BufferedImage) image;
因为BufferedImage扩展自Image,所以它可以适应Image容器。然而,任何图像都可以适应其中,包括不是BufferedImage的图像,因此如果类型不匹配,则可能在运行时出现ClassCastException,因为BufferedImage除非扩展了BufferedImage,否则不能保存任何其他类型。
例如:假设您有一个要缩放的“图像”,您可能需要一个缓冲图像,并且可能仅从“Image”对象开始。所以我认为这样可以... AVATAR_SIZE是我们希望图像达到的目标宽度:
Image imgData = image.getScaledInstance(Constants.AVATAR_SIZE, -1, Image.SCALE_SMOOTH);
BufferedImage bufferedImage = new BufferedImage(imgData.getWidth(null), imgData.getHeight(null), BufferedImage.TYPE_INT_RGB);
bufferedImage.getGraphics().drawImage(imgData, 0, 0, null);
BufferedImage是Image的子类,不需要进行任何转换。
编辑:
try {
// Retrieve Image
BufferedImage buffer = ImageIO.read(new File("old.png"));;
// Here you can rotate your image as you want (making your magic)
File outputfile = new File("saved.png");
ImageIO.write(buffer, "png", outputfile); // Write the Buffered Image into an output file
Image image = ImageIO.read(new File("saved.png")); // Opening again as an Image
} catch (IOException e) {
...
}
正确的方法是使用SwingFXUtils.toFXImage(bufferedImage,null)
将BufferedImage转换为JavaFX Image实例,使用SwingFXUtils.fromFXImage(image,null)
进行反向操作。
可选地,第二个参数可以是WritableImage以避免进一步的对象分配。
java.awt.Image
而不是 java.scene.image.Image
。然而,这个答案仍然有用,因为如果有人遇到这个问题并真的想将 BufferedImage 转换为 JavaFX 图像,这确实是正确的方法。 - jewelsea好的,完成了; 我认为我已经解决并分解出你可能认为面临的死锁问题。就像我所说的,在Java中抽象类和接口非常类似于其他语言中称为指针的低级、更接近硬件操作符。