使用mono的gdi +库的方法相同,在不同的机器上产生非常不同的结果

时间:2011-11-19 08:03:49

标签: .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 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.1英寸的高分辨率图像变成了一张〜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,虽然我认为这不应该干扰。

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

2 个答案:

答案 0 :(得分:2)

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

我怀疑你的盒子上使用的libjpeg版本和linode上的版本之间存在一些区别。

答案 1 :(得分:0)

您是否检查过两台机器上的libjpeg版本?也许这就是问题?