如何使用 backgroundworker 加载图像并显示到 picturebox?
How load image with backgroundworker and display to picturebox?
我必须在图片框中显示图像。这些图像是档案的高分辨率扫描件。由于这种高分辨率,我的平移和缩放功能非常慢。为了解决这个问题,我减少了位图的宽度和长度,同时保持图像的可读性。在我的代码中 drawOriginalImage();因此,变量 "quality" 是我减小位图大小的因素。我是这样做的:
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"。怎么可能?
我找到了。我通过添加以下内容正确连接了所有事件:
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
我必须在图片框中显示图像。这些图像是档案的高分辨率扫描件。由于这种高分辨率,我的平移和缩放功能非常慢。为了解决这个问题,我减少了位图的宽度和长度,同时保持图像的可读性。在我的代码中 drawOriginalImage();因此,变量 "quality" 是我减小位图大小的因素。我是这样做的:
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"。怎么可能?
我找到了。我通过添加以下内容正确连接了所有事件:
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);