与ImageIcon相比,BufferedImage非常慢

时间:2019-08-31 04:00:44

标签: java image scala swing awt

我有这两个片段来加载图像并将其绘制到屏幕上。第一个使用swing的ImageIcon:

import javax.swing.ImageIcon
import java.awt.Image

val g: Graphics2D = get_g2d()
val img : Image = new ImageIcon("image.png").getImage()
g.drawImage(
          img,
          0, 0, 500, 500,  // draw pos / size
          0, 0, 1024, 1024 // clip pos / size
          null)

第二个使用awt的BufferedImage:

import java.io.File
import java.awt.image.BufferedImage
import javax.imageio.ImageIO

val buf : BufferedImage = ImageIO.read(new File("image.png"))
val g: Graphics2D = get_g2d()
g.drawImage(
          buf.getSubImage(0, 0, 1024, 1024) // clip pos / size
          0, 0, 500, 500,  // draw pos / size
          null)

使用ImageIcon的第一个代码片段几乎立即加载,但是如果我用剪辑绘制它,它将不起作用(图像中的子帧构成子画面)。它仅在删除剪贴参数(clip pos / size)时才有效,这使得无法将图像分割为精灵表。

使用BufferedImage的第二个片段可以正确地绘制带有和不带有剪辑的片段。但是,加载大约需要5秒钟。

我认为ImageIcon只是暂时加载了文件的低分辨率缓存图标,这可以解释即时加载,但是我将图像与这两种技术并排放置,它们完全相同。

我可以将Spritesheets子图像拆分为单独的图像,以便可以使用ImageIcon绘制它们,而无需剪切它们,但是我却失去了将它们全部都放在一个Spritesheet中的便利。

我如何能像ImageIcon一样快地加载图像,但是仍然具有剪切支持?

0 个答案:

没有答案