我正在尝试将几张图像放在一个大图像中,并且正在寻找一种算法来确定最佳位置。图像无法旋转或调整大小,但结果图像中的位置并不重要。
编辑:添加没有调整大小约束
可能您正在寻找这样的东西:自动杂志布局。
最佳包装很难,但根据您的问题域的详细信息,您可能会得到简化。一些想法:
如果您可以将位图分割成大小相同的图块,那么打包是微不足道的。然后,根据需要,您将从图块中重新组合位图。
将图像从大到小排序,然后,对于每个图像,使用贪婪分配器来选择适合图像的第一个可用子矩形。
使用遗传算法。从几个随机选择的布局开始。根据包装的紧密程度对它们进行评分。混合得分最高的解决方案,并进行迭代,直到获得可接受的分数。
我为此创建了一个算法,它实际上是NP-Hard Bin 打包问题的一个变体,但具有无限的 bin 大小。
您可以尝试查找一些关于它的文章并尝试优化您的算法,但最终它仍将是尝试所有可能性并尝试最小化生成的 bin 大小的蛮力方法。
如果您不需要最佳解决方案,而只需要一种解决方案,则可以避免暴力破解所有组合。我创建了一个程序,它也做过一次。
描述:
Images: array of the input images
ResultMap: 2d array of Booleans
FinalImage: large image
ResultMap 用于快速检查您是否可以在当前 FinalImage 上适合图像。您可以对其进行优化以使用 int32 并将每个位用于一个像素。这将减少内存并提高性能,因为您可以一次检查 32 位(使用掩码)。但这将变得更加困难,因为您必须考虑为图像边缘制作所需的蒙版。
现在我将描述“算法”的真正循环。
它不是最佳的,但它可以以合理的最佳方式解决问题(特别是如果最后有一些较小的图像来填补空白)。
以非编程方式,您可以使用 MS Paint 功能“粘贴自”,即将 (JPEG) 文件粘贴到 mspaint 图像区域。使用它,您可以排列单个图像,并创建最终的大图像并将其保存为 JPEG/GIF/Raw-BMP 格式。
-广告。