В GDI + произошла общая ошибка c. ' Что-то не так с фрагментом кода от Microsoft, когда дело доходит до сохранения сжатого img? - PullRequest
0 голосов
/ 27 мая 2020

Я работаю над сжатием изображений, но продолжаю получать:

System.Runtime.InteropServices.ExternalException: 'Общая ошибка c произошла в GDI +.'

В этих строках:

                cloneImage.Save(saveImagePath, typeOfImageEncoder, cirarEncoderParameters);
                image.Save(saveImagePath, typeOfImageEncoder, cirarEncoderParameters);

Я пытался клонировать изображение BitMap в своем коде, но результат все тот же. Я прочитал, что это могут быть права пользователя, но я проверил папку пути, и у меня есть все типы, которые мне нужны для чтения и выполнения.

Вот мой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;

namespace CompressImages
{
    class Program
    {
        static void Main(string[] args)
        {
            var small = @"C:\Temp\Dev area\imageCompress\Original Images\potato-small.jpg";
            var medium = @"C:\Temp\Dev area\imageCompress\Original Images\potato-medium.jpg";
            var large = @"C:\Temp\Dev area\imageCompress\Original Images\potato-large.jpg";
            var savePath = @"C:\Temp\Dev area\imageCompress\Compressed images";

            CompressImage(small, savePath);

        }

        public static void CompressImage(string imagePath, string saveImagePath)
        {
            ImageCodecInfo typeOfImageEncoder;
            using (Bitmap image = new Bitmap(imagePath))
            {
                if (imagePath.Contains(".jpg"))
                {
                    typeOfImageEncoder = GetEncoder(ImageFormat.Jpeg);
                }
                else if (imagePath.Contains(".png"))
                {
                    typeOfImageEncoder = GetEncoder(ImageFormat.Png);
                }
                else
                {
                    throw new NullReferenceException();
                }

                System.Drawing.Imaging.Encoder cirarEncoder =
                    System.Drawing.Imaging.Encoder.Quality;

                EncoderParameters cirarEncoderParameters = new EncoderParameters(1);

                EncoderParameter cirarEncoderParameter = new EncoderParameter(cirarEncoder, 50L);
                cirarEncoderParameters.Param[0] = cirarEncoderParameter;

                //Bitmap cloneImage = (Bitmap) image.Clone();
                //cloneImage.Save(saveImagePath, typeOfImageEncoder, cirarEncoderParameters);
                image.Save(saveImagePath, typeOfImageEncoder, cirarEncoderParameters);
            }
        }     

        private static ImageCodecInfo GetEncoder(ImageFormat format)
        {
            // GDI+ is the portion of the Windows operating system that provides two-dimensional vector graphics, imaging, and typography
            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();

            foreach (var codec in codecs)
            {
                // Global Unique IDentifier === Guid
                if (codec.FormatID == format.Guid)
                {
                    return codec;
                }
            }
            return null;
        }
    }
} 

Здесь можно найти большую часть кода.

Как: установить уровень сжатия JPEG

1 Ответ

1 голос
/ 27 мая 2020

С помощью @jimi и @ Canton7 я заметил, что мне нужно изменить путь сохранения к файлу вместо использования переменной, содержащей путь к каталогу.

            image.Save(saveImagePath + "\FileName.jpg", typeOfImageEncoder, cirarEncoderParameters);
...