C# установка ImageCode c и параметров кодировщика для Image.Save () - PullRequest
0 голосов
/ 07 мая 2020

Я пишу программу, которая из некоторых входных текстовых файлов выводит большое количество файлов изображений. В настоящее время эти изображения создаются и сохраняются с помощью

Parallel.ForEach(set, c =>
{
    using (Bitmap b = Generate_Image(c, Watermark))
    {
         //The encoder needs some set up to function properly
         string s = string.Format("{0:0000}", c.Index);
         string filepath = $@"{Directory}\{s}.png";
         //best quality comes from manually configuring the codec and 
         //encoder used for the image saved                                                       
          b.Save(filepath, ImageFormat.Png);
     }
});

Однако я заметил, что b.Save() имеет перегрузку для принятия ImageCodeInfo и EncoderProperties, которые должны иметь возможность создавать изображение более высокого качества. вывод (качество изображения имеет первостепенное значение для программы).

Однако я нигде не смог найти, что нужно сделать, чтобы создать эти объекты, чтобы затем передать их в качестве параметров, по крайней мере, не те, которые работают даже в Microsoft Documents, как ни странно, их образцы не компилировались. Итак, если я могу спросить, как можно использовать перегрузку метода Image.Save (путь к файлу, кодировщик, настройки)?

Заранее благодарим вас за любую предложенную помощь.

1 Ответ

0 голосов
/ 07 мая 2020

Я написал небольшой метод для получения этой информации в моем собственном коде:

    private static ImageCodecInfo GetEncoderInfo(string mimeType)
    {
        foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageEncoders())
            if (codec.MimeType == mimeType)
                return codec;

        return null;
    }

И вот как я использую его для сохранения Jpeg:

        ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
        if (jpegCodec == null)
            return;

        EncoderParameters encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);

        image.Save(imagePath, jpegCodec, encoderParameters);

Не используется чтобы сохранить Png:

     image.Save(imagePath, ImageFormat.Png);

Вам понадобятся следующие пространства имен:

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

Кроме того, я должен упомянуть, что Png - это формат изображения без потерь. Вот почему для него нет параметров кодировщика, потому что вы не можете добиться лучшего качества, чем без потерь.

Для максимального качества при работе с классом Graphics убедитесь, что вы установили следующие свойства:

            graphics.CompositingQuality = CompositingQuality.HighQuality;
            graphics.SmoothingMode = SmoothingMode.HighQuality;
            graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
...