Гарантируется ли использование изображения этим способом? - PullRequest
1 голос
/ 17 января 2020

Учитывая код, где 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 всегда утилизироваться ? Мне интересно, является ли это причиной утечки памяти или нет из-за запуска нового процесса.

1 Ответ

1 голос
/ 18 января 2020

using оператор гарантирует, что Dispose будет вызван даже в случае исключения.

Тот факт, что вы запускаете новый процесс, ничего не будет делать с этим экземпляром, потому что вы не используете экземпляр с параметром только этого нового процесса string. Даже если вы использовали этот экземпляр (через параметр потока или что-то еще), оператор using позаботится об утилизации и освобождении экземпляра.

Кстати, я понимаю, что вы используете инструмент optipng только для «удаления» метаданных. Есть много других способов сделать это без создания файла на диске и запуска нового процесса. См. простой способ очистки метаданных из изображения , например

...