【问题标题】:Converting ImageIcon to BufferedImage (how to set image type)将 ImageIcon 转换为 BufferedImage(如何设置图像类型)
【发布时间】:2015-12-01 06:24:44
【问题描述】:

我正在做的是非常简单的图像编辑程序,但我遇到了一些问题。我将图像保存在数据库中并将其转换为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");
        }
    }
}

【问题讨论】:

    标签: java bufferedimage imageicon


    【解决方案1】:

    如果您不需要透明度,您可以使用 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图像合并模式。

    【讨论】:

    • 我不需要透明度,这就像魔术一样。谢谢。将查看文档以进一步研究。谢谢!
    【解决方案2】:
    1. 在数据库中仅存储图像链接始终是一种好习惯。但这仍然取决于您的应用程序的场景,例如 - 您有一组固定的图像,需要一种简单的方法来进行备份,图像变化非常频繁。 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();

    【讨论】:

    • 也感谢您的评论!一定会检查你的链接!
    猜你喜欢
    • 2013-02-09
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多