Сделать недействительным один пиксель? - PullRequest
0 голосов
/ 14 мая 2011

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

Проблема заключается в том, что изображение отображается в графическом окне, для которого для параметра SizeMode установлено значение Zoom, и каждый раз оно становится недействительным.Я обновляю пиксель Действительно медленно и только медленнее, чем больше изображение (для изображения того же размера)

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

Ответы [ 3 ]

1 голос
/ 13 июня 2011

Добавлен метод для получения увеличения и отступа изображения 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));

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

1 голос
/ 14 мая 2011

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

0 голосов
/ 14 мая 2011

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

...