C#의 빠른 비트맵 처리
대형 비트맵으로 작업할 때 픽셀 단위로 작업에 액세스하고 수행하면 성능에 영향을 미칠 수 있습니다. C#에 내장된 Bitmap.GetPixel()
및 Bitmap.SetPixel()
메서드는 편리하지만 느립니다. 이 기사에서는 비트맵을 바이트 배열로 신속하게 변환하고 다시 비트맵으로 변환하여 효율적인 픽셀 작업을 가능하게 하는 대체 방법을 살펴봅니다.
비트맵을 바이트 배열로 변환
Marshal.Copy()
메서드를 사용하면 비트맵 버퍼의 픽셀 데이터를 바이트 배열로 복사할 수 있습니다. 마샬링에는 안전하지 않은 코드가 필요하지 않지만 LockBits 메서드보다 약간 느릴 수 있습니다. 바이트 배열을 비트맵으로 변환
Marshal.Copy()
메서드를 사용하여 수정된 픽셀 데이터를 바이트 배열에서 비트맵 버퍼로 다시 복사할 수 있습니다. 성능 비교
LockBits 방법 예시
<code class="language-csharp">using System; using System.Drawing; using System.Runtime.InteropServices; public unsafe class FastBitmap { public static 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(); for (int i = 0; i < ... }</code>
마샬링 방법 예시
<code class="language-csharp">using System; using System.Drawing; using System.Runtime.InteropServices; public class FastBitmap { public static 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); byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat); int size = bData.Stride * bData.Height; byte[] data = new byte[size]; Marshal.Copy(bData.Scan0, data, 0, size); for (int i = 0; i < ... }</code>
위 내용은 C#에서 비트맵을 효율적으로 조작하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!