将图像缩小为矩形的算法?

7
我正在尝试在C#应用程序中创建相当大的位图(6000x6000,但大部分是透明的),并需要将它们绘制到仅支持绘制矩形的特定输出API上。
现在,我想知道是否有算法可以将位图减少为一系列填充颜色类似的矩形。因为将所有内容都绘制成1x1的矩形对于此目的来说速度太慢了。例如,圆应该被缩小为一个大的中心矩形,而其余部分则应被缩小为高效的矩形。该算法甚至不需要那么快,因为使用单像素方法所花费的大部分时间是通过API本身上的每个矩形进行循环。

我假设您不希望允许算法更改像素以减少矩形数量?此外,您是否有任何关于形状特征的想法?像有许多非水平或垂直线的圆形这样的形状将需要更多的矩形。 - Peter Recore
2个回答

3
听起来你需要经典的四叉树结构。请查看此链接,了解如何使用四叉树将图像量化为矩形的详细说明。
这里有一个很好的CodeProject参考,提供了一个简单的示例实现,您可以根据自己的需求进行修改。

有没有一个很好的例子,可以说明四叉树比朴素的逐行算法产生更少的像素?在第一个链接中的例子中,四叉树表示需要22个矩形来绘制绿色的形状,而如果按像素逐个绘制,则需要28个矩形,如果按我在答案中描述的逐行绘制,则只需要8个矩形。我可以看出四叉树在分区和存储方面非常优秀,但不知道它们如何最优地分解为尽可能少的矩形。 - Peter Recore
第一个链接中的示例可以使用3个重叠矩形或5个非重叠矩形完成;您想实现哪个版本? - Dolphin
我知道如何用3或5个矩形制作那张图片。但我想不出这与四叉树有什么关系。 - Peter Recore
同意,最佳矩形集并不是该图像所描述的内容。我的想法主要是实用的 - 实现四叉树并不太困难,因为它只是一个基本的递归算法。从原始问题的描述来看,将任意图像分割成一系列矩形的相对简单和简洁的方法是最简单的答案,而不是如何生成最优矩形集。 :) - Kilanash

0

一种简单的实现算法是绘制1xN矩形。

从第0行开始,找到第一个非空白像素。继续遍历像素,直到您正在查看的像素的颜色发生变化。现在将同色像素系列作为1xN矩形绘制。

如果您的实际图片具有大面积均匀区域,这可能已经足够了。根据图片的外观,绘制垂直线条可能会更好。

如果我的计算正确,使用这种方法,半径为100像素的圆形将使用200个“线条”进行绘制,而不是逐像素处理使用了30,000个像素。如果幸运的话,四叉树分解将至少使用1000个或更多矩形来绘制这样的圆形。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接