Image 是否保证以这种方法处理?

Is Image guaranteed to be disposed in this method?

给定 resizedImage 类型的代码 System.Drawing.Image:

using (var resizedImage = Resizer.ResizeImage(bytes, requestedWidth))
{
    return PNGCompressor.LosslesslyCompressPNG(resizedImage);
}

方法定义为:

public static byte[] LosslesslyCompressPNG(Image image)
{
    var fileName = Guid.NewGuid();
    var inputFilePath = TempCompressionFolder + fileName + ".png";
    image.Save(inputFilePath, ImageFormat.Png);

    var outputFilePath = TempCompressionFolder + fileName + "_comp.png";

    var startInfo = new ProcessStartInfo
    {
        FileName = PathToOptiPNGExe,
        WindowStyle = ProcessWindowStyle.Hidden,
        CreateNoWindow = true,
        Arguments = "\"" + inputFilePath + "\" -out \"" + outputFilePath + "\" -o2 -strip all"
    };
    using (var process = Process.Start(startInfo))
    {
        if (process == null)
        {
            throw new Exception("Could not start " + PathToOptiPNGExe);
        }
        process.WaitForExit(Settings.Executables.WaitForExitMS);
        if (!process.HasExited)
        {
            process.Kill();
        }
    }

    var bytes = File.ReadAllBytes(outputFilePath);
    File.Delete(outputFilePath);
    File.Delete(inputFilePath);
    return bytes;
}

resizedImage 会一直被处置吗?我想知道这是否是由于启动新进程而导致内存泄漏的根源。

using statement 保证 Dispose 即使在异常情况下也会被调用。

您正在启动新进程这一事实不会对此实例执行任何操作,因为您没有将实例与此新进程仅 string 参数一起使用。即使您正在使用此实例(通过流参数或其他),using 语句也会处理并释放该实例。

顺便说一句,据我了解,您仅对 "strip" 元数据使用 optipng 工具。有许多其他方法可以做到这一点,而无需在磁盘上创建文件并启动新进程。例如参见 [​​=15=]