Оптимизация сжатия GIF для повышения производительности.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Оптимизация сжатия GIF для повышения производительности.

Сообщение Anonymous »

Я использую пакеты сжатия для файлов изображений, таких как .jpeg, .jpg и .gif. Мне удалось уменьшить размер файлов .gif, но обработка проблемы занимает слишком много времени. Есть ли способ оптимизировать сжатие .gif, чтобы это не заняло слишком много времени. В настоящее время я использую пакет Magick.NET.Core 14.0.0

Код: Выделить всё

public async static Task SaveAsync(this IFormFile file, string path, string folder)
{
string baseUrl = "";
var filePath = Path.Combine(path, folder);

bool exists = Directory.Exists(filePath);

if (!exists)
Directory.CreateDirectory(filePath);

var fileName = Path.Combine(Guid.NewGuid().ToString() + Path.GetExtension(file.FileName));
string resultPath = Path.Combine(filePath, fileName);

if (file.IsImage())
{
if (file.ContentType.Contains("jpeg") || file.ContentType.Contains("jpg"))
{
using (var image = SixLabors.ImageSharp.Image.Load(file.OpenReadStream()))
{
var encoder = new JpegEncoder { Quality = 75 }; // Adjust quality as needed
await image.SaveAsync(resultPath, encoder);
}
}
// Part where .gif compression happens
else if (file.ContentType.Contains("gif"))
{
using (var gifStream = new MemoryStream())
{
await file.CopyToAsync(gifStream);
gifStream.Seek(0, System.IO.SeekOrigin.Begin);

using (var imageCollection = new MagickImageCollection(gifStream))
{
imageCollection.Coalesce();

int maxWidth = 0;
int maxHeight = 0;

foreach (var frame in imageCollection)
{
if (frame.Width > maxWidth)
maxWidth = frame.Width;
if (frame.Height > maxHeight)
maxHeight = frame.Height;
}

foreach (var frame in imageCollection)
{
frame.BackgroundColor = MagickColors.Transparent;
frame.Extent(maxWidth, maxHeight, Gravity.Center);
}

imageCollection.Optimize();

var settings = new QuantizeSettings
{
Colors = 128
};
imageCollection.Quantize(settings);
imageCollection.OptimizeTransparency();

foreach (var frame in imageCollection)
{
frame.Interlace = Interlace.Plane;
frame.Depth = 8;
}

await imageCollection.WriteAsync(resultPath);
}
}
}
else
{
using (var fileStream = new FileStream(resultPath, FileMode.Create))
{
await file.CopyToAsync(fileStream);
}
}
}
else
{
using (var fileStream = new FileStream(resultPath, FileMode.Create))
{
await file.CopyToAsync(fileStream);
}
}

return $"{baseUrl}{folder}/{fileName}";
}

public static bool IsImage(this IFormFile file)
{
return file.ContentType.Contains("image/");
}
Я экспериментировал с другими пакетами, и, хотя они ускоряют процесс сжатия, они не достигают такого же уровня сжатия, как этот.

Подробнее здесь: https://stackoverflow.com/questions/790 ... erformance
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»