2009-12-03 5 views
7

C# 응용 프로그램 (6000x6000, 대부분은 투명 함)에서 꽤 큰 비트 맵을 만들려고 시도 중이며 그리기 직사각형을 지원하는 특정 출력 API에 그려야합니다.이미지를 사각형으로 축소하는 알고리즘?

이제 비트 맵을 유사한 색상의 비트 맵으로 채워진 일련의 사각형으로 줄이는 알고리즘이 있는지 궁금합니다. 모든 것을 1x1 직사각형으로 그리는 것은 너무 느리다. 예를 들어, 원은 큰 가운데 사각형으로 축소되어야하고 나머지 원은 효율적인 사각형으로 축소되어야합니다. 알고리즘은 심지어 단일 픽셀 방법으로 찍은 대부분의 시간이 API 자체의 모든 사각형을 반복하는 것이기 때문에 그렇게 빠를 필요는 없습니다.

+0

사각형의 수를 줄이기 위해 알고리즘이 픽셀을 변경하는 것을 허용하지 않으려한다고 가정합니다. 또한, 도형의 특성이 무엇인지에 대해 알고 있습니까? 수평선이 없거나 수직선이 많은 원과 같은 모양은 더 많은 직사각형을 사용합니다. –

답변

3

고전적인 QuadTree 구조가 필요한 것 같습니다. quadtree를 사용하여 이미지를 사각형으로 양자화하는 방법에 대한 좋은 설명은이 링크를 참조하십시오.

CodeProject에 대한 유용한 참조로 샘플을 제공하며 간단한 구현을 통해 필요에 따라 변경할 수 있습니다.

+0

쿼드 트리가 순진한 라인 별 알고리즘보다 적은 픽셀을 생성하는 좋은 예가 있습니까? 첫 번째 링크의 예에서 쿼드 트리 표현은 녹색 모양을 그리려면 22 개의 직사각형을, 픽셀 단위로 완료된 경우 28 개, 내 대답자가 설명하는대로 한 줄씩 완료하면 8 개까지만 나타납니다. 쿼드 트리가 어떻게 파티셔닝이나 스토리지에 적합한 지 알 수 있습니다.하지만 가능한 한 적은 사각형으로 분해하는 데 어떻게 최적인지는 알 수 없습니다. –

+0

첫 번째 링크의 예제는 3 개의 중첩 사각형 또는 5 개의 비 중첩 사각형에서 수행 할 수 있습니다. 어떤 버전을 성취하려고합니까? – Dolphin

+0

3 또는 5 개의 직사각형으로 이미지를 만드는 방법을 봅니다. 내가 알아 내지 못한 것은 그것이 쿼드 트리와 어떻게 관련이 있는지입니다. –

0

간단한 알고리즘 구현은 1xN 사각형을 그릴 것입니다.

라인 0에서 시작하여 첫 번째 비어있는 픽셀을 찾으십시오. 보고있는 픽셀의 색상이 변경 될 때까지 픽셀 반복을 계속합니다. 이제 1xN 사각형과 동일한 일련의 색칠 된 픽셀을 그립니다.

실제 사진의 넓은 균일 영역이있는 경우 "충분 함"일 수 있습니다. 그림의 모양에 따라 세로선을 그리는 것이 좋습니다.

이 방법을 사용하여 수학을 올바르게 수행하는 경우 한 번에 한 픽셀 씩 완료하면 반경 100 픽셀의 원이 200 개의 "선"을 사용하여 그려야합니다. 쿼드 트리 분해는 적어도 1000 개의 직사각형을 사용하거나 그런 원을 위해 더 많이 사용합니다. 만약 당신이 쿼드런트가 떨어지면 운이 좋았을 것입니다.

관련 문제