我一直在摸不着头脑,因为我几乎不知道如何开始理解我手中的问题.
问题是我使用的静态方法(我从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上的版本之间存在一些差异.