4

我一直在摸索这个问题,因为我几乎不知道如何开始理解我手中的问题。
问题是我使用的静态方法(我从 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 的图像。

首先,我想强调的是,我在我的计算机中运行与我在 Linode 中运行的相同的 Web 应用程序用于测试/开发。此外,我检查了两台机器上安装的所有软件的版本(顺便说一下,gentoo linux),我得到:
1. Mono: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,尽管我认为这也不应该干扰。

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

4

2 回答 2

2

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

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

于 2011-11-19T18:15:39.583 回答
0

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

于 2011-11-19T18:17:03.623 回答