Java createCompatibleImage与Transparency.不透明和simple BuffereImage构造函数与BuffereImage.TYPE\u INT\u ARGB之间有什么区别?

Java createCompatibleImage与Transparency.不透明和simple BuffereImage构造函数与BuffereImage.TYPE\u INT\u ARGB之间有什么区别?,java,image,Java,Image,版本1和版本2之间有什么区别?在我的情况下,他们似乎也这么做了,但我到处都读,版本1是更好的方法。但是为什么呢 public BufferedImage getImage(Icon icon) { int w = icon.getIconWidth(); int h = icon.getIconHeight(); // version 1 GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnviro

版本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;
}

一般来说,第一种方法会产生一个
图像
,需要显示的变换更少

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

实际案例介于和之间,可能涉及更多:

  • 计算机可以有多个不同配置的图形设备(多个视频卡)
  • 用户可以在程序运行时更改图形配置
  • 操作系统本身可以更改图形配置(想想Win7禁用或启用Aero时的情况)
理论上,每次
图像
格式和
图形配置
格式不兼容时,都应该重新创建图像


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

这是否意味着两种方法不可能有真正的“可见”差异?区别在于后台的技术优化。对于具有
BuffereImage.getRGB(int,int)
的真实技术像素差异,也就是说,这两种方法是否相同?颜色转换可能涉及舍入,当一个值精确,而另一个值放大或缩小到第一个值的范围时,这可能是差异的来源。您应该检查您的特定用例,看看是否发生了这种情况,如果存在差异,它们对您的应用程序是否有意义。