我想绘制一个图片库,我在要执行的算法中遇到了一些问题。
基本上我有一个1000x700的区域,我想填充这个区域最大预览。这些图像位于图像列表中,所有图像的大小必须相同。这个画廊只是一个预览,在这个区域的大小与每个图像的原始大小不匹配。
谁能给我一个伪算法的概述,以便我可以构建它?
谢谢!
我想绘制一个图片库,我在要执行的算法中遇到了一些问题。
基本上我有一个1000x700的区域,我想填充这个区域最大预览。这些图像位于图像列表中,所有图像的大小必须相同。这个画廊只是一个预览,在这个区域的大小与每个图像的原始大小不匹配。
谁能给我一个伪算法的概述,以便我可以构建它?
谢谢!
您的问题可以简化为查找图像表格布局的行数和列数的问题,例如:
columns * (rows-1) < k <= columns * rows
约束1大致为:
cols / rows = 1000/700
约束2大致为:
cols * rows = k (where k is the number of images to be displayed)
根据 k 求解 rows 和 cols 可以得到:
rows = sqrt(700*k/1000)
cols = sqrt(1000*k/700)
棘手的部分是 rows 和 cols 需要四舍五入为整数,同时确保 rows * cols >= k (即您的表格布局中有足够的单元格来容纳每个图像)。
根据经验,我会尝试将较小的尺寸(行)向上舍入,将较大的尺寸(列)向下舍入。
rows = ceiling(sqrt(700*k/1000))
cols = floor(sqrt(1000*k/700))
如果您发现这并不总是有效,那么您可能需要类似的东西
if (rows * cols < k) rows = rows + 1;
一旦您知道布局的行数和列数,并确定图像之间的边距大小,您就可以轻松计算所需的缩略图尺寸。
这是一种搜索算法。
首先编写一个函数,尝试在区域内布置给定大小的缩略图。如果所有缩略图都适合,则返回 true,否则返回 false。
取区域的最短边 (700)。试试那个大小的缩略图。使用您的功能,看看它是否合适。
如果不合适,请尝试下一个可能的尺寸 (700/2)。
如果不合适,请尝试下一个 (700/3) 等。
这是一个合理的算法。您可以通过注意还有一些其他可能的尺寸可能会使其变得更好。(1000(不起作用,但使序列更容易),700、1000/2、700/2、1000/3、700/3、1000/4...
尝试将其转换为代码,如果无法正常工作,请返回您所做的工作。