我正在尝试在 C# 应用程序(6000x6000,尽管大多数是透明的)中创建相当大的位图,并且需要将它们绘制到仅支持绘制矩形的特定输出 API。
现在,我想知道是否有人有一种算法可以将位图缩小为一系列填充的类似颜色位图的矩形;因为将所有内容绘制为 1x1 矩形对于此目的来说太慢了。例如,应该将一个圆缩减为一个大的中心矩形,而将圆的其余部分缩减为有效的矩形。该算法甚至不需要那么快,因为我的单像素方法所花费的大部分时间是循环遍历 API 本身的每个矩形。
我正在尝试在 C# 应用程序(6000x6000,尽管大多数是透明的)中创建相当大的位图,并且需要将它们绘制到仅支持绘制矩形的特定输出 API。
现在,我想知道是否有人有一种算法可以将位图缩小为一系列填充的类似颜色位图的矩形;因为将所有内容绘制为 1x1 矩形对于此目的来说太慢了。例如,应该将一个圆缩减为一个大的中心矩形,而将圆的其余部分缩减为有效的矩形。该算法甚至不需要那么快,因为我的单像素方法所花费的大部分时间是循环遍历 API 本身的每个矩形。
听起来您需要经典的QuadTree结构。有关如何使用四叉树将图像量化为矩形的详细说明,请参阅此链接。
这是CodeProject上的一个很好的参考,它提供了一个简单的示例实现,您可以根据需要进行更改。
一个简单的实现算法是绘制 1xN 矩形。
从第 0 行开始,找到第一个非空白像素。继续遍历像素,直到您正在查看的像素的颜色发生变化。现在将这一系列相同颜色的像素绘制为 1xN 矩形。
如果您的实际图片具有较大的均匀区域,这可能“足够好”。根据图片的外观,绘制垂直线可能会更好。
如果我做的数学正确,使用这种方法,半径为 100 像素的圆将使用 200 条“线”来绘制,而不是一次绘制一个像素时使用 30,000 像素。在我看来,四叉树分解将至少使用 1000 个或更多矩形来生成这样的圆,如果你幸运的话,象限落在哪里。