将几张图片拼凑成一幅大图

时间:2008-09-24 05:55:45

标签: algorithm packing

我正在尝试将多个图像放在一个大图像中,我正在寻找一种能够最佳地确定放置位置的算法。图像无法旋转或调整大小,但生成图像中的位置并不重要。

编辑:未添加调整大小约束

6 个答案:

答案 0 :(得分:3)

可能你正在寻找这样的事情:Automatic Magazine Layout

答案 1 :(得分:2)

显然它被称为“打包问题”,这是游戏编程中经常使用的东西。对于那些感兴趣的人,这里有一些建议的实现:

Packing LightmapsRectangle packingRectangle Placement

答案 2 :(得分:0)

我为这些算法创建了一个算法,它实际上是NP-Hard Bin packing问题的变体,但具有无限的bin大小。

您可以尝试找一些关于它的文章并尝试优化您的算法,但最终它仍然是一种蛮力的方式来尝试各种可能性并尝试最小化最终的bin大小。

如果您不需要最佳解决方案,只需要一个解决方案,则可以避免强制执行所有组合。我创建了一个曾经做过的程序。

说明

Images: array of the input images
ResultMap: 2d array of Booleans
FinalImage: large image
  1. 对Images数组进行排序,使最大的图像位于顶部。
  2. 计算图像的总大小并初始化ResultMap,使其大小为图像总大小的1.5倍(您可以使此步骤更智能,以获得更好的内存使用和性能)。使ResultMap的大小相同,并用False值填充它。
  3. 然后添加FinalImage左侧的第一个图像,并将ResultMap中的所有布尔值从0,0设置为true,直到ImageHeight,ImageWidth。
  4. ResultMap用于快速检查您是否可以在当前的FinalImage上放置图像。您可以优化它以使用int32并将每个位用于一个像素。这将减少内存并提高性能,因为您可以一次检查32位(使用掩码)。但它会变得更加困难,因为你必须考虑你需要为图像边缘制作的蒙版。

    现在我将描述“算法”的真实循环。

    1. 对于阵列中的每个图像,尝试找到适合的位置。您可以编写一个循环,该循环将通过ResultMap数组查找并查找false值,然后开始查看它是否在两个方向上都保持为false以放置要放置的图像的大小。
      • 如果找到位置,请将图像复制到FinalImage并在ResultMap中更新正确的布尔值
      • 如果你找到一个地方,只需增加FinalImage的大小(所以看看需要最少量额外空间的边缘)并同步到ResultMap
    2. GOTO 1:)
    3. 这不是最优的,但它可以以合理的最佳方式解决问题(特别是如果有一些较小的图像最终填补了这些问题)。

答案 3 :(得分:0)

最佳打包很难,但根据问题域的详细信息,可能会有一些简化。一些想法:

  1. 如果你可以将你的位图划分成相同大小的瓷砖,那么打包就很简单了。然后,按需,您将从磁贴中重新组装位图。

  2. 将图像从最大到最小排序,然后,对于每个图像,使用贪婪分配器选择适合图像的第一个可用子矩形。

  3. 使用遗传算法。从几个随机选择的布局开始。根据他们的紧密程度对他们进行评分。混合来自最高得分的解决方案,并迭代直到达到可接受的分数。

答案 4 :(得分:-1)

答案 5 :(得分:-3)

以非编程方式,您可以使用MS Paint功能“粘贴自”,即将(JPEG)文件粘贴到mspaint图像区域。使用此功能,您可以排列单个图像,并创建最终的大图像并将其保存为JPEG / GIF / Raw-BMP格式。

-AD。