Отображение графического окна быстрее

я пытаюсь быстро загрузить изображения в коробку с картинками и нарисовать их. У меня есть . 13-секундная задержка между временем, когда я назначаю растровое изображение графическому блоку, и когда оно появляется. И всякий раз, когда я выполняю picturebox.refresh () , перед вызовом метода рисования будет та же самая задержка в .13 - .15 секунд. Есть ли способ избавиться от этой задержки?

Я использую C # в Visual Studio 2010. Я загружаю изображения с помощью библиотеки FreeImage.

Вот код в моем событии pictureBox_MouseMove:

if (IsMouseDown || DrawLine.Checked || IsMovingBox)  
{  
  Tracing.Trace("Update Picture Box");  
  pictureBox.Refresh();  
} 

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

Если я использую битовое изображение с разрешением 117 КБ, задержка составляет .13 секунд. Для загрузки этого изображения в память требуется 0,04 секунды. Для замены моего растрового изображения picturebox этим растровым изображением требуется 0,01 секунды.

Если я использую jpg-изображение в оттенках серого на 1125 КБ, задержка составляет 0,14 секунды. Для загрузки этого изображения в память требуется .26 секунд. Для замены моего растрового изображения в этом окне требуется 0,03 секунды.

7
задан PaulG 28 January 2011 в 13:54
поделиться

1 ответ

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

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

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

Это само по себе будет иметь большое значение. Следующее, что вы можете сделать, это создать масштабированное растровое изображение с пиксельным форматом 32bppPArgb.Это формат, который примерно в 10 раз быстрее, чем любой другой, потому что он соответствует видеоадаптеру на большинстве компьютеров, поэтому преобразование формата пикселей не требуется.

Некоторый код:

    private void loadImage(string path) {
        using (var srce = new Bitmap(path)) {
            var dest = new Bitmap(pictureBox1.Width, pictureBox1.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
            using (var gr = Graphics.FromImage(dest)) {
                gr.DrawImage(srce, new Rectangle(Point.Empty, dest.Size));
            }
            if (pictureBox1.Image != null) pictureBox1.Dispose();
            pictureBox1.Image = dest;
        }
    }

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

12
ответ дан 6 December 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: