我正在用 Java 创建照片马赛克。它的输入是目标图像和图 block 集合。下面是我的算法:
a. Read all the tiles from the directory and process* it. [Every tile is of the same dimension.]
b. Read the target image, break it into cells [cells are of dimensions of a tile.]
c. Process* all the cells.
d. For each cell:
d.1. Create a HashMap h [where key=euclidean metric, value=corresponding tile]
d.2. For each tile:
d.2.1 Calculate Euclidean metric.
d.2.2 add it to h.
d.3 Calculate min from h.
d.4 Add the min to an outputList
e. Create the image from list of images in the outputList.
*process 方法接收图像并创建我们定义的名为 ImageDetails
的类的对象。因此,对于处理的每个图 block 和单元格,都会创建一个 ImageDetails
对象,该对象存储其 RGB 值和尺寸等详细信息。有 2 个单独的对象列表:一个用于 tiles
,另一个用于 cells
。
问题是平均大约有 300 个图 block 和多达 50,000 个单元格(也可能更多!)。所以当我的程序运行时,它在内存中有这么多对象,除了它执行的计算和其他 ip/op 操作。
当我在资源较少(可用内存较少)的机器上运行此程序时,创建的输出图像会失真。但是当我在有更多可用资源的机器上运行它时,它是完美的。我认为这是因为当没有可用资源时,它无法一次将所有对象保存在内存中。所以我看到了一张错放了瓷砖的图像。但是当它有足够的内存时,我会看到完美的输出图像。
我该怎么做才能确保无论可用内存如何,我都可以保留添加到 outputList
中的元素的顺序,以便我可以看到没有失真的图像。
谢谢。
编辑:
下面是同一程序输出的 2 个图像。唯一的区别是它们在不同的机器上运行。请帮助我理解给定算法和约束的程序输出的差异。
最佳答案
它可能与内存没有任何直接关系 - 要么你有足够的,要么你没有。
您为 outputList 使用什么集合类? ArrayList和LinkedList都应该保证元素的顺序。
关于java - 确保在Java中保留List中的顺序并提高效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13096380/