C# unsafe를 사용하여 이미지 처리 속도 향상

6887 단어 직장레저java05086
어제 콩판 방송국에 피부 기능을 넣을 때 생각한 것은 그림의 픽셀을 훑어보고 평균치를 계산해야 한다는 것이다.만약 그림이 비교적 어둡다면 문자는 흰색으로 변하고 그림이 비교적 밝으면 문자는 검은색으로 변한다.C#에서 직접 계산한다는 계산은 일정한 성능 대가를 치러야 할 뿐만 아니라 그림이 클수록 성능 손실도 심각하다.그래서 이 부분의 코드를 unsafe 문장에 써서 메모리에서 직접 계산하도록 고려했다.구체적인 코드는 다음과 같습니다.

   
   
   
   
System.Drawing.Bitmap image = new System.Drawing.Bitmap(
Properties.Settings.Default.BackgroundPicture);
System.Drawing.Imaging.BitmapData data
= image.LockBits(
new System.Drawing.Rectangle( 0 , 0 , image.Width, image.Height),
System.Drawing.Imaging.ImageLockMode.ReadWrite,
System.Drawing.Imaging.PixelFormat.Format24bppRgb);

unsafe
{
long r = 0 ;
long g = 0 ;
long b = 0 ;
long pixelCount = data.Height * data.Width;

byte * ptr = ( byte * )(data.Scan0);
for ( int i = 0 ; i < data.Height; i ++ )
{
for ( int j = 0 ; j < data.Width; j ++ )
{
r
+= * ptr;
g
+= * (ptr + 1 );
b
+= * (ptr + 2 );
ptr
+= 3 ;
}
ptr
+= data.Stride - data.Width * 3 ;
}

double totalRGB = (r / pixelCount + g / pixelCount + b / pixelCount) / 3 ;
if (totalRGB > 127 )
{
this .Foreground = new SolidColorBrush(Color.FromRgb( 0 , 0 , 0 ));
}
else
{
this .Foreground = new SolidColorBrush(Color.FromRgb( 255 , 255 , 255 ));
}
}

또 하나 주의해야 할 것은 코드에 unsafe 문장을 사용하면 컴파일할 때/unsafe 파라미터를 넣어야 한다는 것이다. Visual Studio [프로젝트 속성]의 [컴파일 옵션]에서 이 스위치를 찾을 수 있다.

좋은 웹페이지 즐겨찾기