【问题标题】:Compressing Images in c# asp.net Core在 c# asp.net Core 中压缩图像
【发布时间】:2016-11-17 22:19:51
【问题描述】:

有谁知道如何在 c# asp.net core 中压缩任何类型(jpg、png、gif 等)的图像。 WebP 不适用于核心。我下载了 ImageProcessor Core 库,但不知道如何压缩/降低图像质量。这是我们尝试过的方法,但没有奏效。

    newImage.Quality = old_image.Quality-20;
    newImage.HorizontalResolution = 0;
    newImage.VerticalResolution = 0;

【问题讨论】:

标签: c# asp.net-core image-compression


【解决方案1】:

我们使用Magic.Net 来压缩 jpeg、gif 和 png 图像。它支持.Net Core,可通过Nuget获得。

例子:

var file = new FileInfo(fileName);

Console.WriteLine("Bytes before: " + file.Length);

var optimizer = new ImageOptimizer();
optimizer.Compress(file);

file.Refresh();
Console.WriteLine("Bytes after:  " + file.Length);

【讨论】:

    【解决方案2】:

    寻找相同的解决方案,我在微软的MSDN官方博客中找到了。

    CoreCompat.System.Drawing

    如果您有依赖System.Drawing 的现有代码,那么使用这个库显然是您通往.NET Core 和跨平台幸福的最快途径:性能和质量都很好,API 完全一样。内置的 System.Drawing API 是使用 .NET Framework 处理图像的最简单方法,但它们依赖于 Windows 的 GDI+ 功能,这些功能不包含在 .NET Core 中,并且是一种从未为多用途设计的客户端技术-线程服务器环境。存在锁定问题,可能会导致此解决方案不适合您的应用程序。

    using System.Drawing;
    
    const int size = 150;
    const int quality = 75;
    
    using (var image = new Bitmap(System.Drawing.Image.FromFile(inputPath)))
    {
        int width, height;
    if (image.Width > image.Height)
    {
        width = size;
        height = Convert.ToInt32(image.Height * size / (double)image.Width);
    }
    else
    {
        width = Convert.ToInt32(image.Width * size / (double)image.Height);
        height = size;
    }
    var resized = new Bitmap(width, height);
    using (var graphics = Graphics.FromImage(resized))
    {
        graphics.CompositingQuality = CompositingQuality.HighSpeed;
        graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
        graphics.CompositingMode = CompositingMode.SourceCopy;
        graphics.DrawImage(image, 0, 0, width, height);
        using (var output = File.Open(
            OutputPath(path, outputDirectory, SystemDrawing), FileMode.Create))
        {
            var qualityParamId = Encoder.Quality;
            var encoderParameters = new EncoderParameters(1);
            encoderParameters.Param[0] = new EncoderParameter(qualityParamId, quality);
            var codec = ImageCodecInfo.GetImageDecoders()
                .FirstOrDefault(codec => codec.FormatID == ImageFormat.Jpeg.Guid);
            resized.Save(output, codec, encoderParameters);
        }
    }
    }
    

    参考:https://blogs.msdn.microsoft.com/dotnet/2017/01/19/net-core-image-processing/

    【讨论】:

      猜你喜欢
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多