Как записать квадрат 10 пикселей в изображение, используя WriteableBitmap? - PullRequest
0 голосов
/ 06 октября 2019

Я создал проект WPF, который просто включает элемент управления Image.

<Image x:Name='img'
           Width='256'
           Height='256'
           MouseDown='img_MouseDown' />

Моя цель - щелкнуть изображение и нарисовать боковой квадрат 10 пикселей белого цвета в конкретной позиции, где произошел щелчок.

Вв начале я попытался нарисовать квадраты размером 1 пиксель и работал как ожидалось.

enter image description here

Вот этот код:

 public partial class MainWindow : Window
    {
        WriteableBitmap wb;

        public MainWindow()
        {
            InitializeComponent();
            wb = new WriteableBitmap(256, 256, 96d, 96d, PixelFormats.Bgr24, null);
            img.Source = wb;
        }

        private void img_MouseDown(object sender, MouseButtonEventArgs e)
        {
            Point p = e.GetPosition(img);

            Int32Rect rect = new Int32Rect((int)p.X, (int)p.Y, 1, 1);
            int stride = wb.PixelWidth * wb.Format.BitsPerPixel / 8;
            byte[] buffer = { 255, 255, 255 };
            wb.WritePixels(rect, buffer, stride, 0);
        }
    }

Теперь, когда я хочу нарисовать квадрат размером 10 пикселей, я инициализирую rect с шириной и высотой 10 пикселей,

Int32Rect rect = new Int32Rect((int)p.X, (int)p.Y, 10, 10);

, но WritePixels() выдает исключение, говорящее " Размер буфера равенне достаточно."Из отчаяния я изменил размер буфера на 10, но все равно получаю ту же ошибку.

В чем здесь проблема?

1 Ответ

1 голос
/ 06 октября 2019

Аргумент stride подразумевается как аргумент входного буфера, то есть 3 x 10 здесь:

var width = 10;
var height = 10;
var stride = (width * wb.Format.BitsPerPixel + 7) / 8;
var rect = new Int32Rect((int)p.X, (int)p.Y, width, height);
var buffer = Enumerable.Range(0, stride * height).Select(i => (byte)255).ToArray();
wb.WritePixels(rect, buffer, stride, 0);
...