public static PixelValue CopyPixel(this BitmapSource bs, int x, int y) { if (bs == null) { throw new ArgumentNullException(nameof(bs) + " is null."); } if (x >= bs.PixelWidth || x < 0) { throw new ArgumentOutOfRangeException(nameof(x)); } if (y >= bs.PixelHeight || y < 0) { throw new ArgumentOutOfRangeException(nameof(y)); } var chn = bs.GetChannelCount(); var value = new byte[chn]; Array.Clear(value, 0, value.Length); bs.CopyPixels( new Int32Rect(x, y, 1, 1), value, (bs.Format.BitsPerPixel * bs.PixelWidth + 7) / 8, 0); var pixelValue = new PixelValue { Alpha = PixelValue.AlphaDefault }; switch (chn) { case 1: pixelValue.Red = pixelValue.Green = pixelValue.Blue = value[0]; break; case 3: pixelValue.Red = value[2]; pixelValue.Green = value[1]; pixelValue.Blue = value[0]; break; case 4: pixelValue.Red = value[2]; pixelValue.Green = value[1]; pixelValue.Blue = value[0]; pixelValue.Alpha = value[3]; break; default: throw new NotImplementedException(); } return(pixelValue); }