Как конвертировать JPEG в формат WebP, используя. NET Core? - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть ASP. NET Core 3.1 WebAPI, который отвечает за предоставление других приложений с изображениями. Я пытаюсь улучшить производительность своих приложений. Один из откликов, которые я получаю при запуске теста PageSpeed ​​Insights , касается подачи изображений в форматах следующего поколения .

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

Я использую следующий класс ImageProcessor для сохранения загруженных изображений в мой WebAPI.

public class ImageProcessor
{
    public Image GetResizedImage(Stream stream, int newWidth, out ImageFormat imageFormat)
    {
        Image sourceImage = Image.FromStream(stream);
        SizeF thumbSize = GetNewSize(sourceImage, newWidth);

        imageFormat = sourceImage.RawFormat;
        return ResizeImage(sourceImage, (int)thumbSize.Width, (int)thumbSize.Height);
    }

    protected SizeF GetNewSize(Image img, int newMaxWidth)
    {
        var size = new SizeF
        {
            Width = newMaxWidth,
            Height = (newMaxWidth * img.Height) / img.Width
        };

        return size;
    }

    protected Bitmap ResizeImage(Image image, int width, int height)
    {
        var destRect = new Rectangle(0, 0, width, height);
        var destImage = new Bitmap(width, height);

        var xRes = Math.Max(Math.Min(image.HorizontalResolution, 96), 72);
        var yRes = Math.Max(Math.Min(image.VerticalResolution, 96), 72);

        destImage.SetResolution(xRes, yRes);

        using (Graphics graphics = Graphics.FromImage(destImage))
        {
            graphics.CompositingMode = CompositingMode.SourceCopy;
            graphics.CompositingQuality = CompositingQuality.HighQuality;
            graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            graphics.SmoothingMode = SmoothingMode.HighQuality;
            graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

            using (ImageAttributes wrapMode = new ImageAttributes())
            {
                wrapMode.SetWrapMode(WrapMode.TileFlipXY);
                graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
            }
        }

        return destImage;
    }
}

Вот как я вызываю класс ImageProcessor для хранения изображений на диске с контроллера

public async Task<IActionResult> Store(IFormFile file)
{
    if(!ModelState.IsValid) 
    {
        return Problem("Invalid model!");
    }

    // Process Image
    Image image = GetResizedImage(file.OpenReadStream(), 1024, out ImageFormat imageFormat);
    MemoryStream memoryStream = new MemoryStream();
    image.Save(memoryStream, imageFormat);
    memoryStream.Seek(0, SeekOrigin.Begin);

    // Store it on disk
    string fullPath = "full path to the new image";
    Directory.CreateDirectory(Path.GetDirectoryName(fullPath));

    using FileStream cacheWriter = new FileStream(fullPath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write, 4096, true);
    await memoryStream.CopyToAsync(cacheWriter);

    return Ok();
}

Вопрос

Как сохранить изображение в формате WebP, используя. Net Core?

1 Ответ

0 голосов
/ 05 апреля 2020

На вашем месте я бы посмотрел на установку экземпляра Thumbor или использование Cloudinary для генерации ваших файлов webp.

Затем вы можете использовать JS для условной загрузки правильного файла.

...