我有这两个片段来加载图像并将其绘制到屏幕上。第一个使用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一样快地加载图像,但是仍然具有剪切支持?