如何将位图拉伸以填充PictureBox?

4
我需要将各种大小的位图拉伸以填充PictureBox。 PictureBoxSizeMode.StretchImage 已经能够实现我所需的功能,但我无法想出一种方法来使用此方法正确地向图像添加文本或线条。下面的图像是一个5x5像素的位图,被拉伸到380x150的PictureBox中。

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

我错过了什么吗?


1
你最后没有处理图像。在 g.drawImage() 后尝试使用 bmp.dispose(); - coder
释放pictureBox.Image,而不是bmp2。 - Hans Passant
为什么要使用Dispose?这不是GC的工作吗? - jacknad
@JackN:不是的。Finalizers 是 GC 的责任。Dispose 是包含代码的责任。 - user7116
2个回答

5
看起来你正在丢弃位图(bmp2),而你想在图片框中看到它!从你发布的示例中使用using块是因为代码在返回后不再需要Bitmap对象。在你的示例中,你需要位图继续存在,因此在bmp2变量上没有using块。
以下内容应该可以解决问题:
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;
    }
}

元注释:您应该在此代码中保护异常路径,以防止泄漏“bmp2”。 - user7116

3

白底红叉表示在paint方法中发生了异常。

你的错误是试图将已释放的位图分配为picturebox的图像源。 "using"关键字将处理您在picturebox中使用的位图!

所以我知道,你的异常将是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();
}

如果需要释放资源,此函数将允许您替换旧位图并处理先前的位图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接