SixLabors ImageSharp создает огромные файлы изображений

#c# #.net #imagesharp #dotnetcorecli

#c# #.net #imagesharp #dotnetcorecli

Вопрос:

Я использую приведенный ниже код для изменения размера файлов JPG до 200×240 пикселей. Прилагаемый файл примера имеет размер 900×600 пикселей и составляет всего 84 КБ. Однако, когда я сохраняю файл с измененным размером с помощью ImageSharp, полученное изображение составляет 435 КБ! Почему меньшее изображение имеет больший размер файла?

Я заметил, что разрядность исходного изображения составляет 24 бита, но ImageSharp сохраняет его с 32 битами. Как я могу уменьшить это?

введите описание изображения здесь

Изображение с измененным размером:

введите описание изображения здесь

 var thumbImage = image.Clone(x => x.GetCurrentSize());

                        if (thumbImage.Width > 200)
                        {
                            thumbImage.Mutate(m =>
                            {
                                m.Resize(new ResizeOptions
                                {
                                    Mode = ResizeMode.Min,
                                    Size = new Size(200, 0)
                                });
                            });
  

Комментарии:

1. Это действительно плохой вопрос. Вы ни в коем случае не указываете, что сохраняете в формате png (кроме как с расширением миниатюры)

Ответ №1:

Мне потребовалось некоторое время, чтобы понять, как это сделать для разрядности 24, я бы хотел, чтобы они расширили метод сохранения более очевидными параметрами, в любом случае, вот код.

             image.Mutate(x => x
                 .Resize(new ResizeOptions
                 {
                     Mode = ResizeMode.Min,
                     Size = new Size(240,200)
                 }));
            Stream stream = new System.IO.FileStream("sample.png", FileMode.Create);
            var pngEncoder = new SixLabors.ImageSharp.Formats.Png.PngEncoder();
            pngEncoder.ColorType = SixLabors.ImageSharp.Formats.Png.PngColorType.Rgb;

            image.SaveAsPng(stream, pngEncoder);
            stream.Dispose();
  

если вы сохраните как jpeg (например, исходное изображение, которое у вас есть здесь), вы получите намного меньший размер изображения, а битовая глубина останется такой же, как у источника.

     image.Save("sample.jpeg");
  

Комментарии:

1. Вы читали документы API? Я предполагаю, что нет, поскольку вы используете свой собственный filestream.

2. Итак, вы работали над проектом ImageSharp, ответ на ваш вопрос заключается в том, что я искал там, искал любой способ изменить разрядность для PNG, ничего не нашел прямым или простым способом, может быть, я что-то пропустил idk, я здесь не эксперт, может быть, вы, я просто помог, как моги дал человеку что-то, что решило его проблему.

3. Самый простой способ — передать кодировщик, как вы в конечном итоге обнаружили. За дизайном стоит метод. Передача битовой глубины (и других параметров) в метод сохранения приведет к неиспользуемым параметрам для разных форматов. docs.sixlabors.com/articles/imagesharp /…

4. Я вижу, что для чего бы это ни стоило, мне очень понравилась эта библиотека, отличная работа там, потратил несколько часов на эти документы, чтобы выяснить, что делать, искал ключевое слово, например (формат) (глубина) и т. Д., Я уверен, что вы понимаете это лучше и можете найти лучший способ, который не включаетотдельный поток файлов из-за пределов этой библиотеки, удачи.

5. docs.sixlabors.com/api/ImageSharp/…