如何将缓冲的图像转换为图像,反之亦然?

时间:2012-02-03 16:42:19

标签: java image bufferedimage

其实我正在制作一个图像编辑软件,现在我想转换缓冲图像,即:

  BufferedImage buffer = ImageIO.read(new File(file));

到图像,即格式如下:

  Image image  = ImageIO.read(new File(file));

有可能吗?如果是,那怎么??

6 个答案:

答案 0 :(得分:25)

BufferedImage 是一个(n)图像,因此您在第二行中执行的隐式转换可以直接编译。如果你知道一个Image真的是一个BufferedImage,你就必须这样明确地转换它:

Image image = ImageIO.read(new File(file));
BufferedImage buffered = (BufferedImage) image;

因为BufferedImage扩展了Image,所以它可以放在Image容器中。但是,任何Image都可以适合那里,包括那些不是BufferedImage的Image,因此如果类型不匹配,你可能会在运行时获得ClassCastException,因为BufferedImage除非扩展BufferedImage,否则不能保存任何其他类型。

答案 1 :(得分:11)

示例:假设您有一个想要缩放的“图像”,您可能需要一个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);

答案 2 :(得分:8)

BufferedImageImage的子类。您无需进行任何转换。

答案 3 :(得分:6)

您可以尝试使用所做的更改saving (or writing) the Buffered 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) {
    ...
}

答案 4 :(得分:5)

正确的方法是使用/home/ec2-user/kafka_scripts/ansible_rep/ansible.cfg将BufferedImage转换为JavaFX Image实例,使用ANSIBLE_CONFIG=/home/ec2-user/kafka_scripts/ansible_rep/ansible.cfg ansible zookservers -i /home/ec2-user/kafka_scripts/ansible_rep/inventory -a "/home/ec2-user/kafka_2.11-0.9.0.0/bin/kafka-server-start.sh kafka_2.11-0.9.0.0/config/server.properties" --sudo 进行逆操作。

可选地,第二个参数可以是WritableImage,以避免进一步的对象分配。

答案 5 :(得分:4)

只是一个信息:让我们都记住Image类实际上是一个抽象类,并使用BufferedImage引用它的变量只存储或返回任何Object的内存地址。

此外,静态java.awt.image.imageIO的{​​{1}}方法返回read()个对象,因此毫无疑问,在该对象上使用运算符/表达式BufferedImage将返回{{ 1}}。

事实上,作为抽象,instanceof BufferedImage类具有以下方法签名:

  1. true
  2. Image
  3. 等。

    我强调,实际的public abstract Graphics getGraphics()变量只保存具体Image-subclass对象的内存地址,几乎就像C,C ++,Ada等中的指针一样。

    如果您使用这些语言介绍或高级,以及public abstract ImageProducer getSource()Image,AWT的Runnable等Java接口实例。请注意javax.sound.Clip有:Shape - 您明白了。 (当然,2D图形编程中的缩放可以与调整大小互换,因此需要精度)。

    但是在一个不可能的情况下,当这里ImageIO方法返回Image时,只需创建一个新的public abstract Image getScaledInstance(...)对象,其! (instanceof BufferedImage)对应于其构造函数参数之一。然后,在(理性)将在你的代码逻辑中操纵它。

    无论如何,仿射变换类适用于将形状和图像转换为缩放,旋转,重定位等形式,因此我建议您研究使用“仿射变换”。

    请注意,您可以操纵此类图像栅格中的实际像素 - 这是另一个必须从技术词汇表中引用的技术2D图形术语 - 这可能是需要以类似于Java方式进行二进制blitwise操作的技巧,类型图像缓冲区,用于存储32字节的紧凑型单个颜色属性 - 每个7位用于alpha和RGB值。

    我怀疑你会用它来分层图像。所以,最后,理性的是你只使用抽象图像引用BufferedImage,如果你的ImgObjNotInstncfBufImg对象还不是BufferedImage对象,那么你就可以制作一个图像超出这个相关但非BufferedImage实例,而不必担心任何转换,转换,自动装箱或其他任何事情;操纵BufferedImage实际上意味着还要操纵它所指向的基础图像数据承载对象。

    好的,完成了;我想我肯定已经解开了你可能认为你所面临的僵局。正如我所说的java中的抽象类以及接口,非常类似于其他语言中称为指针的低级,更接近硬件的运算符。