4

我正在尝试在 Java 中创建图像马赛克。我计算我正在创建的新图像的大小,然后对于将成为马赛克一部分的每个子图像,我进行一次绘制调用。

在伪代码中:

create buffered image big enough to hold entire mosaic
create Graphics2D context from that image

for each buffered subimage that will be a part of the mosaic
   draw the subimage on the graphics context of big bufferedimage
   g2.drawImage(myImage, x,y,width,height,null,null)

有一个更好的方法吗?我希望有某种直接复制操作可用,因为我不想将子图像转换或缩放成更大的图像。类似于每个子图像的光栅的arraycopy。我注意到有一个接受 Raster 对象的 setData 方法,但该方法指出 Raster 必须位于相同的坐标空间中。

有什么想法吗?这是我的程序中的一个瓶颈,我希望它尽可能快。

编辑:事实证明我错了(通常在没有硬数据的情况下做出假设)关于瓶颈在哪里。我有一个错误,即一遍又一遍地读取多张 3MB 图片,而不是使用缓存在内存中的缩小版本的图像。当我进行修复时,我的运行时间从 50 分钟变为 15 秒。

4

2 回答 2

3

通常 drawImage() 调用将直接映射到硬件加速 blit 操作。根据您使用的驱动程序/显卡和 JVM,扩展也应该是硬件加速的。但是,如果您可以避免缩放,您当然应该这样做。

如果子图像确实适合较大的图像,您应该能够通过选择宽度和高度来避免缩放,使它们与子图像的相同,当然在这种情况下您最好使用 g.drawImage(图像 img,int x,int y,ImageObserver 观察者)。

于 2010-07-04T21:08:53.673 回答
-1

你可以打电话

getPixels(int x, int y, int w, int h, int[] iArray)

在子图像的光栅上,然后

setPixels(int x, int y, int w, int h, int[] iArray)

在 WritableRaster 上获取更大的图像。不过,至于效率或性能,我不知道。你必须自己测试它。当然,图像必须是相同的类型(相同的色彩空间、相同的分辨率等),但听起来您已经假设了。

于 2010-07-04T19:09:21.000 回答