1

我创建了一个调整图片大小和裁剪图片的函数,然后保存生成的图像文件。在我的开发环境中,它工作得很好,但在生产中,生成的图像是“颗粒状的”。你可以在这里看到不同的质量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,但它们有同样的问题

4

2 回答 2

1

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

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

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

我真的希望您决定使用为您处理这些差异的库。服务器端映像既不简单也不直观,需要避免的陷阱数不胜数。除了您在这里遇到的编码问题之外,您似乎认为 .NET 实际上会从System.Drawing命名空间中垃圾收集类。它不会,除非每个引用都在using(){}子句中,否则您将遇到一些严重的稳定性问题。

于 2013-02-12T14:34:49.297 回答
1

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

不幸的是,根据MSDN 关于设置 JPEG 压缩级别的文章

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

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

至于它因机器而异,这是相当一致的 - 我已经观察到这一点,甚至还有一些关于 Stack Overflow的其他问题。

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

于 2012-10-29T12:04:03.130 回答