나는 그림을 그림 상자에 표시해야합니다. 이미지는 아카이브의 고해상도 스캔입니다. 이 고해상도 때문에 내 패닝 및 확대/축소 기능이 매우 느립니다. 이 문제를 해결하기 위해 이미지를 읽을 수있게 유지하면서 비트 맵 너비와 길이를 줄였습니다. 내 코드에서 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"에 절대 들어 가지 않습니다. 어떻게 그럴 수 있죠?