2016-08-25 8 views
0

나는 그림을 그림 상자에 표시해야합니다. 이미지는 아카이브의 고해상도 스캔입니다. 이 고해상도 때문에 내 패닝 및 확대/축소 기능이 매우 느립니다. 이 문제를 해결하기 위해 이미지를 읽을 수있게 유지하면서 비트 맵 너비와 길이를 줄였습니다. 내 코드에서 drawOriginalImage(); 변수 "quality"는 따라서 비트 맵의 ​​크기를 줄이는 요소입니다. 이것이 내가 한 방법입니다.backgroundworker로 이미지를로드하고 picturebox에 표시하는 방법은 무엇입니까?

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);