gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:26:09 26 4
gpt4 key购买 nike

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

最佳答案

一般来说,第一种方法生成的 Image 需要较少的转换才能显示。

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

真实案例介于两者之间,并且可能涉及更多:

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

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

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

关于java - 使用 Transparency.OPAQUE 的 createCompatibleImage 和使用 BufferedImage.TYPE_INT_ARGB 的简单 BufferedImage 构造函数有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22605949/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com