c#开发和生产环境之间的图像缩放质量不同

时间:2012-10-29 10:56:37

标签: c# asp.net image-resizing

我创建了一个调整图片大小和裁剪图片的功能,然后保存生成的图片文件。 在我的开发环境中,它的效果非常好,但在生产时,生成的图像是“颗粒状的”。 您可以在此处查看不同的质量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,但他们遇到了同样的问题

2 个答案:

答案 0 :(得分:1)

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

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

  

质量等级0对应于最大压缩,和a   质量等级100对应于最小压缩。

所以100并不意味着没有压缩,这意味着压缩可能性最小。

至于它在不同机器之间的变化,这是相当一致的 - 我已经观察到了这一点,并且Stack Overflow上甚至还有许多其他questions

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

答案 1 :(得分:1)

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

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

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(){}子句中,否则你会遇到一些严重的稳定性问题。