.net – 使用mono的gdi库在不同的机器上提供非常不同的结果的方法相同

我一直在摸不着头脑,因为我几乎不知道如何开始理解我手中的问题.

问题是我使用的静态方法(我从SO中的一些帖子中获取),它将System.Drawing.
Image保存到磁盘上的jpeg文件中,看起来像这样:

public static void SaveJpeg(string path, Image image, int quality) {
  //create an encoder parameter for the image quality
  EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
  EncoderParameter compressionParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionNone);

  // Now in this part there is some code which gets the jpeg ImageCodecInfo
  // from ImageCodecInfo.GetImageEncoders()
  ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");

  //create a collection of all parameters that we will pass to the encoder
  EncoderParameters encoderParams = new EncoderParameters(2);
  //set the quality and compression parameters for the codec
  encoderParams.Param[0] = qualityParam;
  encoderParams.Param[1] = compressionParam;
  //save the image using the codec and the parameters
  image.Save(path, jpegCodec, encoderParams);
}

在我的网站中,用户首先提交缩小到900×900左右的图片(使用GDI本身,以减小文件大小,最大可达4mb),然后保存到磁盘中.
这个问题是在我的机器和我的Linode节点中使用相同的System.Drawing.Image图像参数运行它会产生:
1.在我的机器中,一个3.1mb高分辨率图像变成了一个~80kb的图像.
2.在我的Linode中,相同的图像将产生~500kb的图像.

首先,我想强调的是,我在计算机中运行相同的Web应用程序,用于测试/开发我在Linode中运行的应用程序.另外,我检查了两台机器上安装的所有软件的版本(gentoo linux,顺便说一句),我得到了:
1.单声道:2.10.5,两台机器的USE标志相同;
2. Apache 2.2.21-r1,一些USE标志有点不同(但不应该干扰);
3. Mod_mono 2.10,两台机器中的USE标志相同;
4. libgdiplus 2.10,首先使用相同的USE标记,然后尝试启用机器中的cairo,而不改变结果;
5. cairo 1.10.2-r1,opengl标志已在我的机器中启用但在Linode中未启用.

我想不出这种行为如此不同的原因.最大的区别是我的Linode是32位Linux 3.0.4,而我的机器是64位Linux 2.6.39,虽然我认为这不应该干扰.

任何类似的经历或想法,任何人?

最佳答案 libgdiplus没有自己的JPEG处理,它只包含一些粘合代码来将GDI API映射到libjpeg.此外,libgdiplus本身内部没有32/64位不同的代码路径.

我怀疑你的盒子上使用的libjpeg版本和linode上的版本之间存在一些差异.

点赞