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

C# 开发环境和生产环境之间的图像缩放质量不同,c#,asp.net,image-resizing,C#,Asp.net,Image Resizing,我已经创建了一个函数,它可以调整图片的大小并进行裁剪,然后保存生成的图像文件。 在我的开发环境中,它工作得非常好,但在生产环境中,生成的图像是“粒状的”。 你可以在这里看到不同的质量 下面是生成调整大小和裁剪图像的代码 // width: width of cropped img - height: height of cropped img System.Drawing.Bitmap thumbnail = new Bitmap(width, height); // i

我已经创建了一个函数,它可以调整图片的大小并进行裁剪,然后保存生成的图像文件。 在我的开发环境中,它工作得非常好,但在生产环境中,生成的图像是“粒状的”。 你可以在这里看到不同的质量

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

    // 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,但它们都有相同的问题

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

不幸的是,根据该报告:

质量级别为0对应于最大压缩,质量级别为 质量等级100对应于最小压缩

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

至于它随机器的不同而变化,这是相当一致的——我观察到了这一点,甚至还有许多其他的堆栈溢出

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

您假设每台机器在完全相同的索引处都有完全相同的编码器。 很可能每台机器实际上都在以不同的格式压缩图像,尽管文件扩展名不同

WS2008和WS2008 R2具有不同的图形子系统。在后者中,GDI+只是WIC编码器的包装器,它有着不同的怪癖


我真的希望你决定去。服务器端映像既不简单,也不直观,而且。除了这里存在的编码问题外,您似乎感觉到.NET实际上会从
System.Drawing
命名空间中垃圾收集类。它不会,并且您将有一些严重的稳定性问题,除非每个引用都在
using(){}
子句中。

您输入
encoderParameters的
compression
参数是什么。Param[0]=新的EncoderParameter(System.Drawing.Imaging.Encoder.Quality,compression)
用于jpeg图像?抱歉,我忘了指定
compression
是我函数的一个参数,在这种情况下,它的值是100(开发和生产),它是否对所有文件类型(png、bmp、tiff等)都有相同的问题,还是仅对其中一种文件类型有相同的问题,如果是,是哪一个?它与其他文件类型有相同的问题,正如你在我上面链接的页面中看到的(我更新了它)。我尝试使用png、bmp和tif。作为一种压缩格式的JPEG,我知道设置
100
仍在压缩图像。但我认为在这两台机器上会得到相同的结果。在这一点上,什么是获得高质量缩放图像的最佳方法?使用第三方组件?我会考虑使用像PNG这样的文件格式,并将其转换为仅用于免费缩略图的缩略图。有用于图像编码的第三方实现,但我相信它们不是免费的,或者您可以尝试使用:@Dez如果只有JPEG会发生这种情况,您可以忽略该格式并改为使用bmp或png吗?尽管忽略它并不能解决问题,但我们确实对正确的方法感兴趣answer@harag答案确实是使用独立于机器的jpeg编码器或解码器,但它们通常需要花钱。或者像你提到的那样使用PNG或BMP。@dash我想可能是这样的,因为压缩的原因,我过去一直使用JPEG有问题,所以尽量使用BMP或PNG。