Алгоритм уменьшения изображения до прямоугольников? - PullRequest
7 голосов
/ 03 декабря 2009

Я пытаюсь создать довольно большие растровые изображения в приложении C # (6000x6000, хотя большинство из них прозрачные), и мне нужно нарисовать их в определенном API-интерфейсе вывода, который поддерживает только рисование прямоугольников.

Теперь мне интересно, есть ли у кого-нибудь алгоритм для уменьшения растрового изображения до серии заполненных прямоугольников одинакового цвета растровых изображений; поскольку рисование всего в виде прямоугольника 1x1 слишком медленное для этой цели. Например, круг должен быть уменьшен до большого центрального прямоугольника, в то время как остальная часть круга уменьшена до эффективных прямоугольников. Алгоритм даже не должен быть таким быстрым, поскольку большая часть времени, затрачиваемая на мой однопиксельный метод, заключается в циклическом прохождении каждого прямоугольника самого API.

Ответы [ 2 ]

3 голосов
/ 03 декабря 2009

Звучит так, будто вам нужна классическая QuadTree структура. Посмотрите эту ссылку, чтобы получить хорошее объяснение того, как вы использовали бы дерево квадрантов для квантования изображения в прямоугольники.

Вот хороший справочник по CodeProject , который предоставляет пример простой реализации, которую можно изменить в соответствии с вашими потребностями.

0 голосов
/ 03 декабря 2009

Простой для реализации алгоритм будет рисовать прямоугольники 1xN.

Начните со строки 0 и найдите первый непустой пиксель. Продолжайте перебирать пиксели, пока цвет пикселов, на которые вы смотрите, не изменится. Теперь нарисуйте эту серию пикселей того же цвета, что и прямоугольник размером 1xN.

Если ваши реальные изображения имеют большие однородные области, это может быть "достаточно хорошо". В зависимости от того, как выглядят картинки, рисование вертикальных линий может быть лучше.

Если я делаю математику правильно, используя этот метод, круг радиусом 100 пикселей будет использовать 200 «линий» для рисования, а не 30000 пикселей, если сделать один пиксель за раз. Мне кажется, что при разложении четырехугольного дерева для такого круга использовалось бы не менее 1000 или более прямоугольников, если вам повезло с тем, куда упали квадранты.

...