Я должен вращать изображения JPG без потерь в .net (90 ° | 180 ° | 270 °).В следующих статьях показано, как это сделать:
Примеры кажутся довольно простыми;однако мне не повезло заставить это работать.Мои исходные данные поступают в виде массива (различные файлы JPG, с камеры из Интернета и т. Д.), Поэтому я хочу вернуть повернутые изображения также в виде байтового массива.Вот (упрощенный) код:
Image image;
using (var ms = new MemoryStream(originalImageData)) {
image = System.Drawing.Image.FromStream(ms);
}
// If I don't copy the image into a new bitmap, every try to save the image fails with a general GDI+ exception. This seems to be another bug of GDI+.
var bmp = new Bitmap(image);
// Creating the parameters for saving
var encParameters = new EncoderParameters(1);
encParameters.Param[0] = new EncoderParameter(Encoder.Transformation, (long)EncoderValue.TransformRotate90);
using (var ms = new MemoryStream()) {
// Now saving the image, what fails always with an ArgumentException from GDI+
// There is no difference, if I try to save to a file or to a stream.
bmp.Save(ms, GetJpgEncoderInfo(), encParameters);
return ms.ToArray();
}
Я всегда получаю ArgumentException
из GDI + без какой-либо полезной информации:
Операция завершилась с последним исключением [ArgumentException].
Источник: System.Drawing
Я перепробовал очень много вещей, но так и не заработал.Основной код кажется правильным, так как, если я изменю EncoderParameter
на Encoder.Quality
, код будет работать нормально:
encParameters.Param[0] = new EncoderParameter(Encoder.Quality, 50L);
Я нашел несколько интересных сообщений об этой проблеме в интернете, однако реального решения не найдено.Один из них содержит заявление Ханса Пассанта о том, что это действительно ошибка, с ответом сотрудника MS, который я не понимаю или который также может быть просто странным:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/de74ec2e-643d-41c7-9d04-254642a9775c/imagesave-quotparameter-is-not-validquot-in-windows-7?forum=netfxbcl
Однако этому посту 10 лет, и я не могу поверить, что это не исправлено, тем более что у преобразования есть явный пример в документах MSDN.
У кого-нибудь есть подсказка, что я делаю не так, или, если это действительно ошибка, как мне ее обойти?
Обратите внимание, что у меня естьсделать преобразование без потерь (насколько позволяет размер в пикселях).Поэтому Image.RotateFlip
не вариант.
Версия Windows - 10.0.17763, .Net - 4.7.2