将ImageIcon转换为BufferedImage(如何设置图像类型)

时间:2015-12-01 06:24:45

标签: java bufferedimage imageicon

我制作的是非常简单的图像编辑程序,我遇到了问题。我将图像保存在DB中并将其转换为ImageIcon,以便它可以通过服务器套接字等(可序列化)。

因此,通过VO,我将ImageIcon转换为GUI并将其转换为BufferedImage,以便我可以对其进行编辑。但由于我必须设置图像类型,并且有很多图像具有不同的图像类型(至少看起来如此),一些图片变成了我不想要它们的东西。

所以,基本上我一直在询问是否有另一种将ImageIcon转换为BufferedImage的方法。某些方法可以在不设置单个固定图像类型的情况下进行转换。如果没有,我将不得不放弃那部分。

以下是我的代码的一部分:

private class TableSelectEvent extends MouseAdapter {
    @Override
    public void mouseClicked(MouseEvent e) {
        int selectedRow = table.getSelectedRow();
        loadedImageIcon = UserImageReceived.get(selectedRow).getImage();
        originalImage = loadedImageIcon.getImage();

        selectedImageName = UserImageReceived.get(selectedRow).getFileName();
        if (originalImage != null) {
            Image rbi = originalImage.getScaledInstance(lblSelectedImage.getWidth(), lblSelectedImage.getHeight(), Image.SCALE_SMOOTH);
            lblSelectedImage.setIcon(new ImageIcon(rbi));
            bimage = new BufferedImage(originalImage.getWidth(null), originalImage.getHeight(null), BufferedImage.TYPE_INT_ARGB);
            // this, BufferedImage.TYPE_INT_ARGB part is the problem I'm having!
            Graphics2D bgr = bimage.createGraphics();
            bgr.drawImage(originalImage, 0, 0, null);
            bgr.dispose();
        } else {
            System.out.println("originalImage == null");
        }
    }
}

2 个答案:

答案 0 :(得分:2)

如果您不需要透明度,可以使用 BufferedImage.TYPE_INT_RGB 来解决您的问题。

如果您希望透明,则需要设置您希望通过以下方式将图像副本绘制到目的地的方式:

 Graphics2D bgr = bimage.createGraphics();
 bgr.setComposite(AlphaComposite.SRC); // read the doc of this

你遇到的问题可能是因为当你创建TYPE_INT_ARGB类型的新BufferedImage时,该图像中的所有像素都是透明的,所以当你将src图像绘制到它时,它将与这些透明像素混合,所有图像都是透明的。分辨率是通过设置适当的AplhaComposite来使用其他合并src和dst图像的模式。

答案 1 :(得分:1)

  1. 在DB中仅存储图像链接始终是一种好习惯。但这仍然取决于您的应用程序的情况,例如 - 您有一组固定的图像,需要一种简单的方法来进行备份,图像变化非常频繁。 Stackoverflow中有很多文章 - 所以请继续阅读。 Store pictures as files or in the database for a web app?

  2. 一个解决方案是 BufferedImage bi = new BufferedImage(icon.getIconWidth(),icon.getIconHeight(),BufferedImage.TYPE_INT_RGB); 图形g = bi.createGraphics(); icon.paintIcon(null,g,0,0); g.dispose();