如何拉伸位图以填充PictureBox

时间:2011-10-27 17:43:36

标签: c# winforms bitmap picturebox

我需要拉伸各种大小的位图来填充PictureBox。 PictureBoxSizeMode.StretchImage类似于我需要的东西,却无法想到使用此方法向图像中正确添加文本或线条的方法。下图是一个5x5像素的位图,扩展到380x150 PictureBox。

using pictureBox.SizeMode = PictureBoxSizeMode.StretchImage

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

我尝试以这种方式调整this examplethis 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;
}

但是得到这个

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

我错过了什么?

2 个答案:

答案 0 :(得分:5)

您似乎丢掉了想要在相片框中看到的位图(bmp2)!使用来自the example you postedusing块,因为代码返回后代码不再需要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();
}

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