【问题标题】:java images with alpha channel without using buffered image不使用缓冲图像的带有 alpha 通道的 java 图像
【发布时间】:2010-02-16 14:54:43
【问题描述】:

我在Canvas 上绘制了一堆图块,这些图块由Images 或BufferedImages 表示。

我注意到我使用Images 获得了毫秒级的绘制,但我开始使用BufferedImages 来绘制帧时间天空火箭到 20 毫秒以上的图块。

BufferedImage buffered = ImageIO.read(new File(fileName));
Image image = Toolkit.getDefaultToolkit().createImage(fileName);

这两个图像都支持 Alpha 通道。我想开始使用支持 alpha 的 Image 的中间缓冲区。但是,除了此 Toolkit 调用以从文件创建一个之外,我还没有在 jdk 中找到可以生成它们的位置。

基本上有人知道如何从头开始创建一个可以支持 alpha 的空白图像(不是 BufferedImage)吗?

【问题讨论】:

  • BufferedImage 是一个图像。 Image 是一个抽象类,标准 Java 库中仅有的两个子类是 BufferedImage 和 VolatileImage(您可能不想使用它们)。真正的问题是,为什么从 Toolkit 加载的图像绘制速度更快?你在写小程序吗?如果不是,请考虑使用 JComponent 而不是 Canvas 对象。 AWT 库通常比 Swing 库慢。
  • 您是如何创建缓冲图像的?它们是哪一种?
  • @Pace:java.awt.Image 的其他子类,即sun.awt.image.ToolkitImage,当您使用 Toolkit 方法创建图像时,这些图像恰好比 BufferedImage 对象绘制得快得多原因。
  • @basszero,我正在使用上面的两行代码。第一行从一个文件创建一个 BufferedImage,第二行从同一个文件创建一个非 BufferedImage。 @Pace,实际上我在测试中发现 AWT 库对我来说更快。

标签: java image alpha


【解决方案1】:

直接回答您的问题:

// Create a empty BufferedImage which supports alpha
// It will be just as fast a Toolkit image
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

一些背景:

这一切都取决于您使用的 BufferedImage 类型。 BufferedImage 提供了一个构造函数,您可以在其中指定类型(INT_ARGB、4BYTE_ARGB 等)。使用 ImageIO 时,您无法控制用于构造 BufferedImage 的类型。 ImageIO 使用自定义类型“0”。 TYPE 控制图像数据在内存中的存储/访问方式,这在很大程度上影响了图像如何绘制/复制/blitted 到屏幕(或其他图像)。

我根据您的代码创建了一个简单的测试,而 BufferedImage 的渲染总是非常缓慢。我使用 TYPE_INT_ARGB 创建了第二个 BufferedImage,并将第一个 BufferedImage(来自 ImageIO)复制到其中。此 TYPE_INT_ARGB BufferedImage 以与 Toolkit 图像相同的速度呈现。

【讨论】:

  • 基本上有人知道如何从头创建一个可以支持 alpha 的空白图像(不是 BufferedImage)吗?
  • 为什么非 BufferedImage 要求?如果您阅读了我的其余回复,您将了解到 INT_ARGB BufferedImage 与 Toolkit 图像一样快
  • 哇,你说得对,我试图找出原因,但我能找到的唯一区别是 IMageIO 缓冲图像使用 0 或 CUSTOM 的图像类型,所以我猜它循环和单独绘制每个像素。对简短的回应感到抱歉。
  • 我在其中添加了更多内容,但我不确定您希望它如何阅读。似乎所有信息都在我身边。
  • 不,我不能投票给你,直到你编辑它。都在那里。
【解决方案2】:

您可以使用旧的 ImageConsumer/ImageProducer API 来创建包含您想要的任何内容的 Image 对象。

这将从pix 数组中的 ARGB 像素创建一个具有给定宽度和高度的 Image 对象:

public static Image createImage( int width, int height, int[] pix )
{
    return createImage( width, height, pix, 0, width );
}

public static Image createImage( int width, int height, int[] pix, int offs, int scan )
{
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    ImageProducer source = new MemoryImageSource( width, height, pix, offs, scan );
    return toolkit.createImage( source );
}

【讨论】:

  • 以前没用过这个,试一试吧。看起来很有希望,只是以前从未使用过该 API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
  • 2013-04-14
  • 2012-05-30
相关资源
最近更新 更多