C#에서 비트맵 처리 최적화
소개
이미지 처리 작업의 경우 비트맵 객체 내에서 픽셀 데이터를 효율적으로 처리하는 것이 중요합니다. 그러나 표준 Bitmap.GetPixel()
및 Bitmap.SetPixel()
방법은 큰 이미지를 처리할 때 상당히 느릴 수 있습니다. 이 기사에서는 비트맵 데이터를 바이트 배열로 효율적으로 변환하여 성능을 획기적으로 향상시키는 기술을 살펴봅니다.
고속 비트맵을 ByteArray로 변환: 안전하지 않은 코드
안전하지 않은 코드는 직접 메모리 액세스를 제공하므로 원시 픽셀 데이터를 더 빠르게 조작할 수 있습니다. BitmapData
및 LockBits
을 사용하면 비트맵의 첫 번째 스캔라인에 대한 포인터를 얻을 수 있습니다. 그런 다음 포인터 연산을 통해 각 픽셀을 통해 효율적인 반복을 수행하고 개별 RGB 바이트 구성 요소에 액세스할 수 있습니다.
안전하지 않은 코드 예:
<code class="language-csharp">public unsafe Image ThresholdUA(float thresh) { Bitmap b = new Bitmap(_image); BitmapData bData = b.LockBits(new Rectangle(0, 0, _image.Width, _image.Height), ImageLockMode.ReadWrite, b.PixelFormat); byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat); byte* scan0 = (byte*)bData.Scan0.ToPointer(); // ... pixel processing using pointer arithmetic ... b.UnlockBits(bData); return b; }</code>
관리형 비트맵을 ByteArray로 변환: 마샬링
마샬링은 비트맵 데이터를 바이트 배열로 변환하기 위한 보다 안전하고 관리되는 대안을 제공합니다. Marshal.Copy()
은 BitmapData.Scan0
포인터의 픽셀 데이터를 미리 할당된 바이트 배열로 효율적으로 복사합니다. 처리 후 동일한 방법으로 수정된 데이터를 다시 복사합니다.
마샬링 예:
<code class="language-csharp">public Image ThresholdMA(float thresh) { Bitmap b = new Bitmap(_image); BitmapData bData = b.LockBits(new Rectangle(0, 0, _image.Width, _image.Height), ImageLockMode.ReadWrite, b.PixelFormat); int size = bData.Stride * bData.Height; byte[] data = new byte[size]; Marshal.Copy(bData.Scan0, data, 0, size); // ... process byte array data ... Marshal.Copy(data, 0, bData.Scan0, data.Length); b.UnlockBits(bData); return b; }</code>
실적 분석
안전하지 않은 코드와 마샬링 간의 최적의 선택은 애플리케이션의 성능 요구 사항에 따라 다릅니다. 안전하지 않은 코드는 뛰어난 속도를 제공하지만 메모리 오류를 방지하려면 신중한 처리가 필요합니다. 마샬링은 더 안전하지만 성능은 약간 떨어집니다. 프로젝트의 특정 요구 사항에 따라 가장 좋은 방법을 선택해야 합니다.
위 내용은 안전하지 않은 코드나 마샬링을 사용하여 C#에서 비트맵 처리 속도를 어떻게 높일 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!