Интерактивное масштабирование растрового изображения 2D-графики в C#

Я сделал программу, которая считывает значения напряжения и тока некоторых диодных кривых из файла xml и рисует их на экране (просто используя простую 2D-графику и некоторые простые команды, такие как DrawCurve и тому подобное).

Мой основной кадр изображения имеет размер 800 на 800 пикселей (ниже вы можете увидеть уменьшенный скриншот). Теперь я хочу добавить функцию масштабирования, чтобы при наведении курсора мыши на эту область изображения всплывал летающий меньший квадрат и увеличивался + перемещался, когда я наводил указатель мыши на эту область.

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

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

Спасибо!

введите здесь описание изображения


person Saeid Yazdani    schedule 20.09.2011    source источник


Ответы (2)


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

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

Наконец, чтобы получить хорошо выглядящие результаты, перегрузите OnPaintBackground (не могу точно вспомнить имя, но что-то вроде этого), чтобы он ничего не делал (даже не вызывал базовый класс) и выполнял всю свою рисовку в методе OnPaint, используя объект BufferedGraphics. .

Обновить

Ваша функция рисования может выглядеть так:

OnPaint (...)
{
  the_graphics_object.DrawImage (the background image);
  the_graphics_object.Clip = new Region (new Rectangle (coords relative to mouse position));
  the_graphics_object.TranslateTransform (drawing offset based on mouse position);
  RenderScene (the_graphics_object, scale_factor); // draws grid and curve, etc
  the_graphics_object.DrawRectangle (zoom view rectangle); // draw a frame around the zoomed view
}

Это создаст плавающее «окно» относительно положения мыши.

person Skizz    schedule 20.09.2011
comment
Ну, я думаю, что он рисует кривые довольно быстро (моя приблизительная оценка составляет около 10 мс). Не могли бы вы подробнее объяснить, что такое прямоугольник отсечения с наведением мыши на событие? - person Saeid Yazdani; 20.09.2011
comment
@Sean87: Смотрите ответ для обновления. Когда мышь перемещается и масштабирование включено, перерисовывайте окно. - person Skizz; 20.09.2011

Как правило, в случаях, когда перерисовка может занять много времени, масштабирование обычно решается путем предоставления «быстрой, но уродливой» реализации наряду с «правильной, но медленной» реализацией. Пока операция масштабирования активно выполняется (скажем, пока пользователь щелкнул ползунок или пока не прошло 50 мс с момента последнего изменения значения масштабирования), вы используете быстрый и уродливый режим, поэтому пользователь может просмотреть предварительный просмотр каким будет финальное изображение. Как только они отпустят ползунок масштабирования (или любой другой предоставленный вами механизм), вы сможете детально пересчитать изображение. Быстрая версия обычно рассчитывается на основе исходного изображения, с которым вы работаете.

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

Примеры такого рода функциональности довольно распространены: большинство генераторов фракталов используют именно эту технику, и даже несвязанные с ней вещи, такие как Google StreetView (который предоставляет очень уродливую искаженную версию предыдущего изображения, когда вы перемещаетесь, пока не загрузится фактическое изображение).

person Daniel B    schedule 20.09.2011