2017-12-07 8 views
0

저는 WPF를 사용하고 있습니다. 제 이미지의 일부 픽셀을 조작하고 싶습니다. 나는 소스에서 간접적으로 사용할 수 있기 때문에 WritableBitmap을 사용하고있다. 일부 픽셀 RGB 값을 (순서대로) 설정하려고하면 예상 한 결과가 아닙니다. I 소스 판독이 확장 방법을 사용WriteableBitmap 픽셀을 설정하십시오.

 public static PixelColor[,] CopyPixels(this BitmapSource source,out int stride) 
     { 
      if (source.Format != PixelFormats.Bgra32) 
       source = new FormatConvertedBitmap(source, PixelFormats.Bgra32, null, 0); 
       PixelColor[,] pixels = new PixelColor[source.PixelWidth, source.PixelHeight]; 
       stride = source.PixelWidth * ((source.Format.BitsPerPixel + 7)/8); 
       GCHandle pinnedPixels = GCHandle.Alloc(pixels, GCHandleType.Pinned); 
       source.CopyPixels(
        new Int32Rect(0, 0, source.PixelWidth, source.PixelHeight), 
        pinnedPixels.AddrOfPinnedObject(), 
        pixels.GetLength(0) * pixels.GetLength(1) * 4, stride); 

      pinnedPixels.Free(); 
      return pixels; 
     } 

출력 구조체는

[StructLayout(LayoutKind.Sequential)] 
public struct PixelColor 
{ 
    public byte Blue; 
    public byte Green; 
    public byte Red; 
    public byte Alpha; 
} 

이 검정 (200x200 크기 및 최대 300x300 사이) 화소를 수정할 수있는 간단한 예 코드 :

 int stride = 0; 
     PixelColor[,] PixelData = wBitmap.CopyPixels(out stride); 

     for (int i = 0; i < PixelData.GetLength(0); i++) 
     { 
      for (int j = 0; j < PixelData.GetLength(1); j++) 
      { 

       if ((200 < i && 300 > i) && (200 < j && 300 > j)) 
       { 
        PixelData[i, j].Blue = 0; 
        PixelData[i, j].Red = 0; 
        PixelData[i, j].Green = 0; 

       } 

      } 
     } 

     wBitmap.WritePixels(new Int32Rect(0, 0, wBitmap.PixelWidth, wBitmap.PixelHeight), PixelData, stride,0); 

놀라운 결과는 enter image description here

이것은 500x500 매개 변수가있는 이미지입니다. 나는 그 결과가 검은 수직선이 아닌 이미지 가운데에 검은 색으로 채워진 사각형이 될 것으로 예상했다. 예제 코드의 문제점은 무엇입니까? (라인 뒤에 다채로운 점은 원본 이미지의 일부입니다.)

+0

그냥 경우에 당신이없는 인식, [WriteBitmapEx] (https://writeablebitmapex.codeplex.com/) 최고입니다. –

답변

2

은 그냥 CopyPixels 방법의 2 차원 배열 선언에서 차원의 순서를 변경 :

var pixels = new PixelColor[source.PixelHeight, source.PixelWidth]; 
+0

오, 정말 고마워요! –