【问题标题】:c# Image scaling quality different between dev and production environmentc# 开发环境和生产环境之间的图像缩放质量不同
【发布时间】:2013-02-12 22:34:49
【问题描述】:

我创建了一个函数来调整图片大小和裁剪图片,然后保存生成的图像文件。 在我的开发环境中,它工作得很好,但在生产中,生成的图像是“颗粒状的”。 你可以在这里看到不同的质量http://test.powersport.it/canc2.aspx

这是生成调整大小和裁剪图像的代码

    // width: width of cropped img - height: height of cropped img
    System.Drawing.Bitmap thumbnail = new Bitmap(width, height);
    // image: original System.Drawing.Image containing full size img
    thumbnail.SetResolution(image.HorizontalResolution, image.VerticalResolution);
    // size[0]: width of resized img - size[1]: height of resized image
    System.Drawing.Image mini = new Bitmap(image, size[0], size[1]);
    System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(thumbnail);

    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
    g.SmoothingMode = SmoothingMode.HighQuality;
    g.PixelOffsetMode = PixelOffsetMode.HighQuality;
    g.CompositingQuality = CompositingQuality.HighQuality;

    g.DrawImage(mini, ((width - size[0]) / 2), ((height - size[1]) / 2), size[0], size[1]);

    EncoderParameters encoderParameters;
    encoderParameters = new EncoderParameters(1);
    ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();

    // img: original file name
    switch (Path.GetExtension(img).ToLower())
    {
        case ".png": //       info[4]
            thumbnail.Save(dest, System.Drawing.Imaging.ImageFormat.Png);
            break;
        case ".bmp": //       info[0]
            thumbnail.Save(dest, System.Drawing.Imaging.ImageFormat.Bmp);
            break;
        case ".tiff": //      info[3]
            encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionLZW);
            thumbnail.Save(dest, info[3], encoderParameters);
            break;
        case ".tif": //      info[3]
            encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionLZW);
            thumbnail.Save(dest, info[3], encoderParameters);
            break;
        default: //jpeg      info[1]
            encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, compression);
            thumbnail.Save(dest, info[1], encoderParameters);
            break;
    }

感谢任何帮助。谢谢。

更新:我尝试过使用 PNG、BMP 和 TIFF,但它们有同样的问题

【问题讨论】:

  • 对于 jpeg 图像,您向 encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, compression); 输入的 compression 参数是什么?
  • 抱歉,我忘记指定 compression 是我的函数的参数,在这种情况下,它的值是 100(开发和生产)
  • 所有文件类型(png、bmp、tiff 等)是否存在相同问题,或者仅针对其中一种,如果有,是哪一种?
  • 它与其他文件类型有同样的问题,正如您在我上面链接的页面中看到的(我更新了它)。我尝试使用 png、bmp 和 tif。

标签: c# asp.net image-resizing


【解决方案1】:

这是一个非常有趣的问题,基于您提供 compression=100 的事实,您可能认为根本不应该应用压缩。

不幸的是,根据MSDN article on setting the JPEG Compression Level

质量级别 0 对应于最大压缩,而 质量级别 100 对应于最小压缩。

所以100 并不意味着没有压缩,它意味着尽可能少的压缩。

至于它因机器而异,这是相当一致的 - 我观察到这一点,甚至在 Stack Overflow 上还有许多其他 questions

由于压缩的实际机制由 GDI+(.Net 框架之外)处理,因此它将取决于机器上安装的实际版本。

【讨论】:

  • 作为 JPEG 压缩格式,我知道设置 100 仍在压缩图像。但我认为它会在两台机器上给出相同的结果。在这一点上,拥有高质量缩放图像的最佳方法是什么?使用第三方组件?
  • 我会考虑改用 PNG 之类的文件格式并将其转换为该格式,这只是一种免费的比较方法,用于您的缩略图。有图像编码的 3rd 方实现,但我相信它们不是免费的,或者你可以尝试使用这个:codeproject.com/Articles/83225/A-Simple-JPEG-Encoder-in-C
  • @Dez 如果只有 JPEG 会发生这种情况,您可以忽略该格式并改用 bmp 或 png 吗?虽然忽略它并不能解决问题,但对正确答案真的很感兴趣
  • @harag 答案确实是使用独立于机器的 jpeg 编码器或解码器,但它们通常要花钱。或者使用您提到的PNG或BMP。
  • @dash 我认为可能是这种情况,因为压缩,我过去一直遇到 Jpeg 问题,所以尝试坚持使用 bmp 或 png。
【解决方案2】:

您假设每台机器在完全相同的索引处具有完全相同的编码器。

很可能每台机器实际上都在以不同的格式压缩图像,尽管文件扩展名不同。

WS2008 和 WS2008 R2 有不同的图形子系统。在后者中,GDI+ 只是 WIC 编码器的包装器,它们有不同的发送方式。

我真的希望你决定use a library that handles these differences for you。服务器端映像既不简单也不直观,has an endless list of pitfalls to avoid。除了您在此处遇到的编码问题之外,您似乎认为 .NET 实际上会从 System.Drawing 命名空间中垃圾收集类。不会,除非每个引用都在 using(){} 子句中,否则您将遇到一些严重的稳定性问题。

【讨论】:

    猜你喜欢
    • 2018-02-12
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2021-12-26
    相关资源
    最近更新 更多