【问题标题】:How to stretch a Bitmap to fill a PictureBox如何拉伸位图以填充图片框
【发布时间】:2011-12-16 17:31:44
【问题描述】:

我需要拉伸各种大小的位图来填充 PictureBox。 PictureBoxSizeMode.StretchImage 可以满足我的需要,但想不出使用这种方法在图像中正确添加文本或线条的方法。下图是一个 5x5 像素的位图,拉伸为 380x150 的 PictureBox。

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;
}

但是得到这个

我错过了什么?

【问题讨论】:

  • 你最后没有dispose图片。g.drawImage()后尝试使用bmp.dispose();
  • 处理pictureBox.Image,而不是bmp2。
  • 为什么要使用 Dispose?这不是 GC 的工作吗?
  • @JackN:没有。终结器是 GC 的责任。 Dispose 是包含代码的责任。

标签: c# winforms bitmap picturebox


【解决方案1】:

当您在绘制方法中有异常时,会出现白色背景上的红色 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();
}

如果您需要这样做以释放资源,此功能将允许您替换旧的位图来处理之前的位图。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 元评论:你应该保护这段代码中的异常路径不泄露bmp2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多