多图像放置算法 - 拼贴算法

时间:2010-08-28 11:51:16

标签: algorithm image

我正在创建一个同时显示多个视频的应用程序(比方说2-10个视频)。我基本上在寻找一种可以帮助在屏幕上放置视频的算法。我面临的问题是每个视频可能有不同的宽高比,我显然需要调整视频大小以使它们全部适合屏幕。但我希望调整大小并使其适应我最大化屏幕使用的方式(并最小化纵横比失真)。此外,我希望用户能够增加一个或多个视频的大小,以便在屏幕上占用更多空间。因此,算法应该是稳定的,因为扩大一个视频不会使所有的放置都跳转。

我用语言无关的方式问这个问题,我使用视频的事实无关紧要,这个问题同样适用于静止图像。

所有人都知道放置算法吗?

这里有一个例子来帮助澄清。我有三个视频,大小如下。我希望第一个视频占据屏幕的大约50%,最后两个视频占据屏幕的大约25%。

(464, 336) 50%
(624, 480) 25%
(608, 336) 25%

如何将它们放在屏幕上(1024x800)才能实现这一目标?我想我会先将屏幕分成两半,最适合上半部分的第一个视频。然后我将下半部分分成两部分,尽可能地适应剩下的两部分视频。

提前致谢

3 个答案:

答案 0 :(得分:4)

我认为 Treemap 是您可能需要的。

alt text

算法历史here

的良好描述

有序量子树图algs,与您当前的搜索更相关,here

HTH!

答案 1 :(得分:2)

这是垃圾箱包装问题的一个版本    http://en.wikipedia.org/wiki/Bin_packing_problem 这是NP难的,所以你要选择一些合理的启发式算法。如果您不希望视频在调整大小时跳转,则需要留下一堆额外的死区或自动缩小其他空间。

除非你有充分的理由允许它,否则我建议要求宽高比保持不变。

建议:首先修复所有视频的高度,然后使用贪婪的第一个拟合算法将它们打包。初始高度将是总屏幕高度的整数分数。如果有人调整视频大小,其他所有内容都会按相同的分数值收缩,然后转移到适应范围。

答案 2 :(得分:0)

基于舍入的平方根+逻辑。如果sqrt的剩余部分是< 0.5,向下舍入结果,将结果用作行/列,并将行或列数加1;如果sqrt的余数为> = 0.5,则向上舍入结果并将其用作行/列数。

10 videos = 4x3 (3.16; rounded down, so add 1 row or col)
9 videos = 3x3 (3; abs)
8 videos = 3x3 (2.82; round up)
7 videos = 3x3 (2.64; round up)
6 videos = 3x2 (2.44; round down, so add 1 row or col)
5 videos = 3x2 (2.23; round down, so add 1 row or col)
4 videos = 2x2 (2; abs)
3 videos = 2x2 (1.73; round up)
2 videos = split screen in half vertically or horizontally (however you'd like)
1 video = full screen

现在这是为了使所有视频“正方形”,并且可能是最好的选择,因为你真的不能轻易地考虑到那里存在的不同分辨率/比率(除非它对你来说是静态的)。

因此,根据显示分辨率与视频分辨率的比率,网格周围会有填充空间,因此您需要将网格居中。也就是说,一个选项是让你获取“填充”空间并将其除以行数(或列),并将其用作视频之间的缓冲区。

获得行/列数并假设所有视频的大小相同后,您只需将屏幕宽度除以cols和高度除以行,即可获得视频尺寸。

然后,将视频平铺到屏幕上 - 显然,在相同的情况下,网格上的某些点可能是空的。您可以检测网格上空间覆盖的行和列,并将视频集中在该特定行上。

如果您希望“最大化”视频,请提前确定“最大化”空间的含义。然后,在计算其他视频的大小之前,从屏幕分辨率中减去该像素足迹。如果最大化意味着50%的屏幕,则从网格中的视频数量中减去该视频,并从显示分辨率中减去50%的像素空间。