#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 раз в секунду.