如何拉伸位图以填充PictureBox

我需要拉伸各种大小的位图来填充PictureBox。 PictureBoxSizeMode.StretchImage排序做我需要的但却想不出使用这种方法正确地向图像添加文本或线条的方法。 下图是一个5×5像素的位图,扩展到380×150 PictureBox。

使用pictureBox.SizeMode = PictureBoxSizeMode.StretchImage

 pictureBox.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox.Image = bmp; 

我尝试用这种方式调整这个例子和这个例子

 using (var bmp2 = new Bitmap(pictureBox.Width, pictureBox.Height)) using (var g = Graphics.FromImage(bmp2)) { g.InterpolationMode = InterpolationMode.NearestNeighbor; g.DrawImage(bmp, new Rectangle(Point.Empty, bmp2.Size)); pictureBox.Image = bmp2; } 

但得到这个

使用g.DrawImage(bmp,new Rectangle(Point.Empty,bmp2.Size))

我错过了什么?

你似乎丢掉了你想在你的图片框中看到的位图( bmp2 )! using 您发布的示例中的using块,因为代码返回后代码不再需要Bitmap对象。 在您的示例中,您需要使用Bitmap,因此在bmp2变量上不using -block。

以下应该有效:

 using (bmp) { var bmp2 = new Bitmap(pictureBox.Width, pictureBox.Height); using (var g = Graphics.FromImage(bmp2)) { g.InterpolationMode = InterpolationMode.NearestNeighbor; g.DrawImage(bmp, new Rectangle(Point.Empty, bmp2.Size)); pictureBox.Image = bmp2; } } 

当您在paint方法中有exception时,会出现白色背景上的红色X.

您的错误是您尝试将已处置的位图指定为图片框的图像源。 使用“using”关键字将处理您在图片框中使用的位图!

所以你的exception,我知道,将是ObjectDisposedException 🙂

您应该创建一次位图并保留它,直到不再需要它为止。

 void ReplaceResizedPictureBoxImage(Bitmap bmp) { var oldBitmap = pictureBox.Image; var bmp2 = new Bitmap(pictureBox.Width, pictureBox.Height); using (var g = Graphics.FromImage(bmp2)) { g.InterpolationMode = InterpolationMode.NearestNeighbor; g.DrawImage(bmp, new Rectangle(Point.Empty, bmp2.Size)); pictureBox.Image = bmp2; } if (oldBitmap != null) oldBitmap.Dispose(); } 

如果您需要这样做以释放资源,此函数将允许您替换处理前一个位图的旧位图。