2010-08-25 5 views
7

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

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

Вот код в моем случае pictureBox_MouseMove:

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

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

Если я использую bitonal tiff image при 117kb, задержка составляет 0,13 секунды. Для загрузки этого изображения в память требуется 0,4 секунды. Для замены растрового изображения моего растрового изображения это растровое изображение занимает 0,01 секунды.

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

ответ

11

Предполагая, что нет никаких других задержек в вашем коде, которые могут препятствовать поток пользовательского интерфейса от повторного входа в цикле обработки сообщений, так что метод OnPaint() можно назвать: ваш обработчик события Paint вызывается после PictureBox нарисовали Образ. Это еще не видно, 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; 
     } 
    } 

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

+0

Ганс, Это может сделать это! Начальные тесты, безусловно, лучше! Вставьте его в мой код здесь и правильно установите пропорции ... – Mark

+0

Ганс, это было прекрасно! Очень хорошо! Благодаря! – Mark

Смежные вопросы