我一直在摸索这个问题,因为我几乎不知道如何开始理解我手中的问题。
问题是我使用的静态方法(我从 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,尽管我认为这也不应该干扰。
任何类似的经历或想法,有人吗?