C# 비트맵 조작 최적화: 느린 SetPixel
및 GetPixel
소개
비트맵 조작을 위해 C#에 내장된 GetPixel
및 SetPixel
메서드는 특히 큰 이미지를 처리할 때 속도가 매우 느립니다. 이 문서에서는 성능을 대폭 향상하기 위한 탁월한 대안을 제시합니다.
고성능 대안
세 가지 주요 방법은 표준 기능에 비해 상당한 속도 향상을 제공합니다.
DirectBitmap 클래스: 이 사용자 정의 클래스는 비트맵 데이터에 대한 직접적이고 관리되지 않는 액세스를 제공하여 잠금 및 복사에 따른 오버헤드를 제거합니다. 직관적인 픽셀 조작을 위한 GetPixel
및 SetPixel
방법을 제공합니다.
LockBits 메서드: 이 기본 제공 메서드는 원시 데이터에 직접 액세스할 수 있도록 메모리의 비트맵 섹션을 잠급니다. SetPixel
/GetPixel
보다 빠르지만 명시적인 잠금 및 잠금 해제가 필요하므로 약간의 성능 비용이 발생합니다.
안전하지 않은 코드 블록: 이 접근 방식은 직접적인 메모리 조작을 위해 안전하지 않은 포인터를 활용합니다. 잠재적으로 가장 빠르지만 메모리 손상을 방지하려면 신중한 처리가 필요합니다. 이 방법은 숙련된 개발자에게 가장 적합합니다.
성능 벤치마크
성능은 이미지 크기와 특정 작업에 따라 다릅니다. 일반적으로 DirectBitmap
는 LockBits
을 능가하며 더 큰 비트맵의 경우 SetPixel
/GetPixel
보다 성능이 훨씬 뛰어납니다. 다음 표에서는 성능 차이를 보여줍니다.
Method | 4x4 | 16x16 | 64x64 | 256x256 | 1024x1024 | 4096x4096 |
---|---|---|---|---|---|---|
DirectBitmap | 2 | 28 | 668 | 8219 | 178639 | |
LockBits | 2 | 3 | 33 | 670 | 9612 | 197115 |
SetPixel | 45 | 371 | 5920 | 97477 | 1563171 | 25811013 |
코드 샘플: DirectBitmap
DirectBitmap
클래스는 픽셀 액세스를 단순화합니다.
<code class="language-csharp">public void SetPixel(int x, int y, Color colour) public Color GetPixel(int x, int y)</code>
사용 예:
<code class="language-csharp">var dbm = new DirectBitmap(width, height); dbm.SetPixel(x, y, Color.Red); Color c = dbm.GetPixel(x, y);</code>
결론
대형 비트맵에 대한 최적의 성능을 위해 DirectBitmap
클래스는 기존 방법에 비해 상당한 속도 향상을 제공하는 강력한 솔루션을 제공합니다. LockBits
속도와 사용 편의성 사이에서 균형 잡힌 절충안을 제시하는 반면 안전하지 않은 코드는 잠재적으로 가장 빠르기는 하지만 신중한 구현이 필요합니다.
위 내용은 C#에서 `SetPixel` 및 `GetPixel` 이외의 비트맵 조작 속도를 어떻게 높일 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!