Сделать недействительным один пиксель?

#c# #zooming #pixel #picturebox #invalidation

#c# #масштабирование #пиксель #picturebox #аннулирование

Вопрос:

Я работаю над некоторой обработкой изображений и для отладки накладываю цвета на исходное растровое изображение.

Проблема в том, что изображение отображается в графическом окне с SizeMode, установленным на масштабирование, и аннулирование при каждом обновлении пикселя происходит очень медленно и просто становится медленнее, чем больше picturebox (для изображения того же размера)

Я думаю, что могло бы помочь, если бы я сделал недействительными только пиксели, которые я изменил, но я не знаю, как преобразовать координаты пикселя, который я изменил, в прямоугольник, отображаемый в элементе управления. Очевидно, что если изображение рисуется больше, чем исходное изображение, то прямоугольник, который я делаю недействительным, будет больше одного пикселя

Ответ №1:

Добавлен метод для получения масштаба и заполнения изображения pox

     private void CalculateZoomAndPadding()
    {
        Double imageAspect = (Double)pictureBox1.Image.Width / (Double)pictureBox1.Image.Height;
        Double pbAspect = (Double)pictureBox1.Width / (Double)pictureBox1.Height;
        Boolean heightRestricted = imageAspect < pbAspect;
        hPadding = 0;
        vPadding = 0;
        if (heightRestricted)
        {
            zoom = (Double)pictureBox1.Height / (Double)pictureBox1.Image.Height;
            Double imageWidth = (Double)pictureBox1.Image.Width * zoom;
            hPadding = (Double)(pictureBox1.Width - imageWidth) / 2d;
        }
        else
        {
            zoom = (Double)pictureBox1.Width / (Double)pictureBox1.Image.Width;
            Double imageHeight = (Double)pictureBox1.Image.Height * zoom;
            vPadding = (Double)(pictureBox1.Height - imageHeight) / 2d;
        }
    }
  

затем, чтобы сделать недействительным пиксель, называемый invalidate, вот так:

 pictureBox1.Invalidate(new Rectangle(Convert.ToInt32(Math.Floor(x * zoom))   Convert.ToInt32(hPadding) -1, Convert.ToInt32(Math.Floor(y * zoom))   Convert.ToInt32(vPadding) -1, PixelSize, PixelSize));
  

когда я впервые сделал это, я признал недействительными только те, которые непосредственно покрыты пикселем, но обнаружил, что это связано с ошибками округления, поэтому расширил его, включив несколько дополнительных.

Ответ №2:

Можете ли вы изменить все пиксели, а затем просто сделать изображение недействительным один раз?

Комментарии:

1. Таким образом, я не вижу, как обработка изображения работает с каждым пикселем, я бы получил только готовый продукт вместо шагов, которые потребовались для его получения.

2. Вы все равно не увидите, что это работает с каждым пикселем, если вы либо не уменьшите его, либо ваша обработка в любом случае будет довольно медленной. Не забывайте, что ваш монитор не может обновляться 1000 раз в секунду.

3. Я регулирую его, когда смотрю на область, которую хочу исследовать, но когда я смотрю на большое изображение, может потребоваться 10 минут, чтобы добраться до того, что меня интересует.

Ответ №3:

Я бы просто добавил таймер, который срабатывает 30 или 60 раз в секунду, что делает недействительным весь элемент управления. Хотя при обновлении может возникнуть небольшая задержка, вы не сможете заметить это из-за того, что частота обновления вашего монитора, скорее всего, в любом случае составляет всего 60 Гц.

Комментарии:

1. Это предполагает, что он может делать недействительным 30 раз в секунду.