我需要拉伸各种大小的位图来填充PictureBox。
PictureBoxSizeMode.StretchImage
类似于我需要的东西,却无法想到使用此方法向图像中正确添加文本或线条的方法。下图是一个5x5像素的位图,扩展到380x150 PictureBox。
pictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox.Image = bmp;
我尝试以这种方式调整this example和this example
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;
}
但是得到这个
我错过了什么?
答案 0 :(得分:5)
您似乎丢掉了想要在相片框中看到的位图(bmp2
)!使用来自the example you posted的using
块,因为代码返回后代码不再需要Bitmap
对象。在您的示例中,您需要使用位图,因此using
变量上没有bmp2
块。
以下内容应该有效:
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;
}
}
答案 1 :(得分:3)
当您在绘画方法中出现异常时,白色背景上的红色X会发生。
您的错误是您尝试将配置的位图指定为图片框的图像源。使用“using”关键字将处理您在图片框中使用的位图!
所以你的异常,我知道,将是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();
}
如果您需要这样做以释放资源,此函数将允许您替换处理前一个位图的旧位图。