저는 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);
이것은 500x500 매개 변수가있는 이미지입니다. 나는 그 결과가 검은 수직선이 아닌 이미지 가운데에 검은 색으로 채워진 사각형이 될 것으로 예상했다. 예제 코드의 문제점은 무엇입니까? (라인 뒤에 다채로운 점은 원본 이미지의 일부입니다.)
그냥 경우에 당신이없는 인식, [WriteBitmapEx] (https://writeablebitmapex.codeplex.com/) 최고입니다. –