.net 与使用mono';s gdi&x2B;库在不同的机器上给出非常不同的结果

.net 与使用mono';s gdi&x2B;库在不同的机器上给出非常不同的结果,.net,mono,gdi+,jpeg,libjpeg,.net,Mono,Gdi+,Jpeg,Libjpeg,我一直在为这个问题挠头,因为我几乎不知道如何开始理解手中的问题。 问题是我使用的一种静态方法(我从SO的某篇文章中获取),它将System.Drawing.Image保存到磁盘上的jpeg文件中,看起来有点像这样: public static void SaveJpeg(string path, Image image, int quality) { //create an encoder parameter for the image quality EncoderParameter

我一直在为这个问题挠头,因为我几乎不知道如何开始理解手中的问题。
问题是我使用的一种静态方法(我从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);
}
在我的网站上,用户首先提交缩小到900x900左右的图片(使用GDI本身,以减小文件大小,文件大小可以达到4mb),然后保存到磁盘中。 问题在于,在我的机器和Linode节点中使用相同的System.Drawing.Image参数运行它会产生:
1.在我的机器中,一个3.1mb的高分辨率图像会变成一个~80kb的图像。
2.在我的Linode中,相同的图像将产生约500kb的图像

首先,我想强调的是,我在我的计算机上运行的web应用程序与我在Linode中运行的web应用程序完全相同,用于测试/开发。另外,我检查了两台机器上安装的所有软件的版本(顺便说一句,GentooLinux),我得到:
1.Mono:2.10.5,两台机器的使用标志相同
2.Apache2.2.21-r1,一些使用标志有点不同(但不应该干扰)
3.Mod_mono 2.10,在两台机器中使用相同的标志
4.libgdiplus 2.10,最初使用相同的标志,然后尝试在计算机中启用cairo,结果没有变化
5.cairo 1.10.2-r1,opengl标志已在我的机器中启用,但在Linode中未启用

我想不出行为如此不同的原因。最大的区别是我的Linode是32位的Linux3.0.4,而我的机器是64位的Linux2.6.39,尽管我认为这也不会造成干扰


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

libgdiplus不做它自己的JPEG处理,它只包括一点胶水代码,将GDI+API映射到libjpeg。此外,libgdiplus本身内部没有32/64位不同的代码路径


我怀疑您的机器上使用的libjpeg版本与linode上使用的libjpeg版本之间存在一些差异。

您在两台机器上都检查了libjpeg的版本吗?也许这就是问题所在?

哦,我的天哪!忘了提到libjpeg版本在这两个版本上也是一样的!安装了libjpeg-turbo 1.1.1的两台gentoo机器上的virtual/jpeg ebuild从未听说过libjpeg-turbo,但我仍然认为它是造成差异的主要候选。源代码处的快速grep可能会告诉您32/64位代码路径是否不同(例如优化)。否则,请填写错误报告,让其他人在另一个操作系统上尝试此操作(以防与gentoo相关)->谢谢,我需要有人告诉我,这次可能是我以外的人犯了错误。我现在就来解决这个问题。很抱歉我忘了提到这一点,请查看对poupou答案的评论(相同的libjpeg)