我试图在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上以获取较大图像。至于效率或性能,我不知道。您必须自己测试。当然,这些图像必须是相同的类型(相同的颜色空间,相同的分辨率等),但听起来您已经假设了。

这里 真的很棒的例子如何完成。我认为这是最快的方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top