BufferedImage像素与Graphics.drawImage的区别

3

如何区分创建缓冲图像和使用其像素进行绘制的差异:

private BufferedImage img;
private int[] pixels;

pixels = ((DataBufferInt) img.getRaster().getDataBuffer());

仅使用图像作为

img

变量和使用img的图形:

img.getGraphics().drawImage(/*image*/, x, y, observer);

编辑:

这是关于游戏开发的技术相关内容!

2个回答

5
  • 使用getGraphics()方法可以可靠地在图像上绘制,而不受其底层结构的影响。
  • 请注意,不要像您演示的那样通过链接来执行此操作:img.getGraphics().drawImage(/*image*/, x, y, observer);,因为这样做不允许您在完成后处理Graphics对象,从而可能导致资源耗尽。
  • 直接操作栅格位可能是更快的更改方式,但我认为这取决于您使用的BufferedImage类型。

这个答案和@mikera的回答都很好,似乎倾向于使用drawImage()。我喜欢这个答案,因为它提到了dispose()问题,这很重要。还值得一提的是,直接访问OP中的栅格/数据缓冲区可能会在图像实例的生命周期中禁用软件/硬件优化,因此请小心使用。如果有疑问,请记得进行性能分析。 :-) - Harald K

5

通过使用Graphics方法的优点:

  • 通常使用现成的高级操作(如drawImage)更加简单
  • 在某些平台上,您可以从硬件加速/优化中受益
  • 它相对独立于底层图像格式

通过像素缓冲区级别进行的优点:

  • 它可以用于非常专业化的目的,例如从某种公式/计算生成每个像素(例如我使用此技术生成自定义颜色渐变)
  • 对于单个像素操作而言,它可能会稍微更快(但对于像drawImage这样的批量操作来说,可能会更慢,因为您不会获得硬件加速)

如果只是普通的游戏屏幕渲染,我会说Graphics路线可能是最好的。如果您正在做一些花哨的事情,例如即时图像生成,则值得探索像素缓冲区路线。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接