2016-08-25 2 views
0

Мне нужно отображать изображения в картинке. Изображения - это сканирование с высоким разрешением архивов. Из-за этого высокого разрешения мои функции панорамирования и масштабирования очень медленные. Чтобы решить эту проблему, я уменьшил ширину и длину растрового изображения, сохраняя читаемые изображения. В моем коде в drawOriginalImage(); переменное «качество», таким образом, является фактором, который уменьшает размер растрового изображения. Вот так я сделал это:Как загружать изображение с помощью фонового рисунка и отображать изображение?

private void drawOriginalImage(int quality) { 
    try { 
     int x = originalImage.Width/quality, 
      y = originalImage.Height/quality; 
     pictureBox.Image = (Image)new Bitmap(originalImage, x, y); 
     pictureBox.SizeMode = PictureBoxSizeMode.Zoom; 
    } 
    catch (Exception ex) { 
     throw ex; 
    } 
} 

Но это решение приносит еще одну проблему. Этот шаг может быть очень длинным:

pictureBox.Image = (Image)new Bitmap(originalImage, x, y); 

Из-за этого медлительностью, я хотел, чтобы обработать этот шаг с функцией BackgroundWorker. Теперь мой код выглядит так:

private void drawOriginalImage(int quality) { 
    Cursor = Cursors.AppStarting; 
    backgroundWorker.RunWorkerAsync(new Point(
     originalImage.Width/quality, 
     originalImage.Height/quality 
    )); 
} 
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { 
    Point p = (Point)e.Argument; 
    e.Result = new Bitmap(originalImage, p.X, p.Y); 
} 
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { 
    if (e.Error != null) { 
     MessageBox.Show("Image too big.\nOriginal error:\n" + e.Error); 
    } 
    else { 
     pictureBox.Image = (Image)e.Result; 
     pictureBox.SizeMode = PictureBoxSizeMode.Zoom; 
     Cursor = Cursors.Default; 
    } 
} 

Но это не сработает. Я вижу, что курсор меняется с «Cursors.AppStarting» на «Cursors.Default», и поэтому задача, вероятно, завершена. Но на моем картинке нет изображения? Как это может быть? Что я делаю не так?

Когда я его отлаживаю, программа никогда не переходит в «backgroundWorker_RunWorkerCompleted». Как это может быть?

ответ

1

Я нашел его. Я правильно подключил все свои события, добавив следующее:

backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork); 
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted); 
Смежные вопросы