Тот же метод, который использует моно библиотеку gdi +, дающую очень разные результаты на разных машинах - PullRequest
4 голосов
/ 19 ноября 2011

Я почесал голову над этим, так как едва знаю, как начать понимать проблему в моих руках.
Проблема в том, что я использую статический метод (и который я взял из некоторого поста здесь, в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, чтобы уменьшить размер файла (который может быть до 4 МБ), а затем сохраняются на диск.Проблема заключается в том, что при запуске его с одним и тем же параметром образа System.Drawing.Image на моем компьютере и на моем узле Linode выдает:
1. На моем компьютере образ с разрешением 3,1 МБ с высоким разрешением превращается в ~ 80 КБimage.
2. В моем Linode то же самое изображение даст изображение ~ 500kb.

Прежде всего я хотел бы подчеркнуть, что я запускаю на своем компьютере то же самое веб-приложение для тестирования / разработки, которое я запускаю на своем Linode.Кроме того, я проверил версии всего программного обеспечения, установленного на обеих машинах (кстати, 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, хотя я думаю, что это тоже не должно мешать.

Любой подобный опыт или идеи, кто-нибудь?

Ответы [ 2 ]

2 голосов
/ 19 ноября 2011

libgdiplus не выполняет свою собственную обработку JPEG, она включает в себя только немного связующего кода для сопоставления API GDI + с libjpeg. Также внутри самой libgdiplus нет 32/64 битных различных путей кода.

Я подозреваю, что есть разница между версиями libjpeg, которые используются на вашем компьютере, и версиями на линоде.

0 голосов
/ 19 ноября 2011

Вы проверили версию вашего libjpeg на обеих машинах? Возможно, это проблема?

...