将缓冲图像绘制到另一个BufferedImage的最快方法
-
02-10-2019 - |
题
我试图在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)
有一个更好的方法吗?我希望有某种直接复制操作可用,因为我不想将子图像转换或扩展到更大的图像。类似于每个子图像的横梁的阵列。我注意到有一种setData方法接收栅格对象,但是该方法指出栅格必须在同一坐标空间中。
有什么想法吗?这在我的程序中有点瓶颈,我希望它尽可能快。
编辑:事实证明,我错了(通常是在没有硬数据的情况下做出假设的情况)就瓶颈在哪里。我有一个错误,其中一遍又一遍地读取了多个3MB图片,而不是使用记忆中缓存的图像的缩放版本。我进行修复时,我的跑步时间从50分钟到15秒。
解决方案
通常,drawImage()调用将直接在硬件加速闪电操作上映射。根据您使用的驱动程序/图形卡和JVM,也应加速缩放。但是,如果您可以避免扩展,那么当然应该。
如果子图像确实适合较大的图像,您应该能够通过选择宽度和高度来避免缩放缩放,从而使它们与子图像的宽度相同,当然,在这种情况下,您更好地使用G..DrawMimage(图像IMG,int x,int y,ImageObserver观察者)。
其他提示
你可以打电话
getPixels(int x, int y, int w, int h, int[] iArray)
在射手上的子图像,然后
setPixels(int x, int y, int w, int h, int[] iArray)
在Writableraster上以获取较大图像。至于效率或性能,我不知道。您必须自己测试。当然,这些图像必须是相同的类型(相同的颜色空间,相同的分辨率等),但听起来您已经假设了。
这里 真的很棒的例子如何完成。我认为这是最快的方法。
不隶属于 StackOverflow