createCompatibleImage与Transparency.OPAQUE和BufferedImage.TYPE_INT_ARGB的简单BufferedImage构造函数有什么区别?

时间:2014-03-24 09:54:14

标签: java image

版本1和版本2有什么区别?他们似乎在我的情况下做同样的事情,但我到处读到版本1是更好的方法。但为什么呢?

public BufferedImage getImage(Icon icon) {
    int w = icon.getIconWidth();
    int h = icon.getIconHeight();

    // version 1
    GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
    BufferedImage image = gd.getDefaultConfiguration().createCompatibleImage(w, h, Transparency.OPAQUE);

    // version 2
    // BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);

    Graphics2D g = image.createGraphics();
    icon.get().paintIcon(null, g, 0, 0);
    g.dispose();

    return image;
}

1 个答案:

答案 0 :(得分:2)

通常,第一种方法会导致Image需要较少的转换才能显示。

在最好的情况下,“第一种方法”图像将具有与实际屏幕存储器布局完全相同的存储器布局,这意味着为了在屏幕上显示图像,可以按原样复制图像数据。 仅当屏幕存储器布局为ARGB(每个组件8位)时,“第二种方法”图像也是如此,并且在所有其他情况下,图像必须(自动且透明地用于用户代码)转换为目标格式。

真实情况介于两者之间并且可能更复杂:

  • 计算机可以有多个具有不同配置的图形设备(多个视频卡);
  • 用户可以在程序运行时更改图形配置;
  • 操作系统本身可以更改图形配置(想想Win7禁用或启用Aero时的情况)。

理论上,每次Image格式和GraphicsConfiguration格式变得不兼容时,您都应该重新创建图片。

实际上,您可以使用new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB)(或任何其他适合您需要的特定图像类型),直到您可以证明它正是通用BufferedImage的使用导致您的应用程序运行缓慢(因为转换为目标设备格式)或消耗过多的内存(因为转换需要额外的内存)。