首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >createCompatibleImage与Transparency.OPAQUE和简单的BufferedImage构造函数与BufferedImage.TYPE_INT_ARGB有什么区别?

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

Stack Overflow用户
提问于 2014-03-24 09:54:13
回答 1查看 987关注 0票数 3

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

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-24 11:26:43

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

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

真正的案件介于两者之间,可以更多地涉及:

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

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22605949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档