【问题标题】:How can I ensure an image is disposed of from method that returns an image如何确保从返回图像的方法中处理图像
【发布时间】:2015-08-07 16:54:53
【问题描述】:

我有以下代码:

private Image ResizeImage(Image image, int width, int height, bool paddOverflow)
{
    //Calculate sizes here. Removed for brevity

    var target = new Bitmap(image, finalWidth, finalHeight);
    using (var graphic = Graphics.FromImage(image))
    {
        graphic.Clear(Color.White);
        graphic.CompositingQuality = CompositingQuality.HighQuality;
        graphic.InterpolationMode = InterpolationMode.HighQualityBilinear;
        graphic.CompositingMode = CompositingMode.SourceCopy;
        graphic.DrawImage(target, 0, 0, finalWidth, finalHeight);

        return target;
    }
}

var image = ResizeImage(someImage, 100, 100, false);

我遇到的问题是,如果我将 target 包装在 using 语句中,那么 image 将无效。

我该如何做这样的事情,但要确保 image 已被处理掉。我在这里的方法感觉有些不对劲,但由于某种原因我无法发现。

【问题讨论】:

  • 你确定你的代码没有把图片弄错??? Imo,您应该从 target Image 创建 Graphics 对象。然后你可以在重新使用target之前处理掉image..

标签: c# memory-management dispose system.drawing


【解决方案1】:

在这种情况下,由调用代码决定是否正确处置您的一次性对象,或者将处置留给垃圾收集器。对此你绝对无能为力。您不能将图像包装在您自己的包装器类中,因为同样的情况也会适用——您的包装器类要么必须具有调用代码必须调用的 Dispose 方法(或类似的方法),和/或您的包装器类会有一个垃圾收集器会调用的终结器。

您应该期望使用您的代码的开发人员是了解处理和垃圾收集的合格开发人员。

【讨论】:

  • 说得好。不过,我想添加一些东西(因为在 OP 的问题中并不完全清楚)。您的using-construct 中的graphic-object 将在返回target 之前被释放。然而,处理图像并不是一个巨大的损失;最终将被垃圾收集。你必须相信你的程序员知道如何使用Disposeusing
  • 谢谢。我知道graphic 将被处置,我只是想确保我在其他地方尽我所能。如果在大型操作中使用此方法并且开发人员没有处理目标,那么我想可能会出现内存问题。只要我以最好的方式做到这一点,我就很高兴。再次感谢。
  • 但是不处理图像并不是一个巨大的损失;它最终会被垃圾回收。 ,它是GDI object,它不会被垃圾回收!!
  • Image 是一个围绕 GDI 对象的托管对象。当托管对象被垃圾回收时,它会正确销毁 GDI 对象。
  • @MichaelGunter: Image 是一个抽象类;因此包装的确切资源将取决于实施。尽管Image 的许多实现可能只获取可替代且至少有些丰富的资源,但其他实现可能会获取不可替代的资源,例如文件。我认为只有在知道自己正在处理的图像的确切类型并且对相关成本有很好了解的情况下才适合放弃。
猜你喜欢
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多