Я работаю над сжатием изображений, но продолжаю получать:
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