Потребовалось тут реализовать небольшой код по мелкой обработке картинок (изменение размеров, обрезка).
В целом возможностей System.Drawing вполне хватает.
Но странно ведет себя сохранение в JPEG — на некоторых картинках в результирующем изображении немного (но вполне заметно глазом) сдвигаются некоторые цвета (т.е. был малиновый, стал красно-фиолетовый). При том, что оригинал — так же jpeg.
При сохранении в bmp или png — все нормально.
Как быть и что делать, чтобы сохранялись оригинальные цвета?
Банальный:
var image = Bitmap.FromFile( sourceFileName );
image.Save( resultFileName, ImageFormat.Jpeg );
уже портит цветность.
пробовал и с заданием качества сжатия — без разницы, только четкость меняется.
так же пробовал при открытии передавать useEmbeddedColorManagement — никакого эффекта
Обработка и пересохранение той же картинки в jpeg в Paint.NET цветность не меняет.
Re: Как правильно сохранять Drawing.Image в Jpeg?
От:
Аноним
Дата:
27.01.12 08:14
Оценка:
var image = Bitmap.FromFile( sourceFileName );
var jpgEncoder = ImageCodecInfo.GetImageDecoders().Single(codec => codec.FormatID == ImageFormat.Jpeg.Guid);
var myEncoder = System.Drawing.Imaging.Encoder.Quality;
var myEncoderParameters = new EncoderParameters(1);
var myEncoderParameter = new EncoderParameter(myEncoder, 100L);
myEncoderParameters.Param[0] = myEncoderParameter;
Здравствуйте, fmiracle, Вы писали:
F>Здравствуйте, Аноним, Вы писали:
А>>image.Save(resultFileName, jpgEncoder, myEncoderParameters);
F>Да пробовал я и так. Один фиг F>Качество сжатия таким образом регулируется, а вот с цветностью та же беда.
А так?
MemoryStream ms = new MemoryStream();
bmp.Save(ms, ImageFormat.Png);
ms.Position = 0;
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.StreamSource = ms;
bi.EndInit();
photoimg.Source = bi;
Re[4]: Как правильно сохранять Drawing.Image в Jpeg?
V> MemoryStream ms = new MemoryStream();
V> bmp.Save(ms, ImageFormat.Png);
V> ms.Position = 0;
V> BitmapImage bi = new BitmapImage();
V> bi.BeginInit();
V> bi.StreamSource = ms;
V> bi.EndInit();
V> photoimg.Source = bi;
V>
А так я что-то не вкурил в суть кода... Поясни, плиз?
Мне же не отобразить на форме надо, а обработать и потом сохранить в виде jpeg.
От временного преобразования в png ничего не меняется — картинка ж в правильной цветности до самого момента сохранения в jpeg. А вот при сохранении — и именно jpeg — портится.
Здравствуйте, Don Reba, Вы писали:
DR>Причина в chroma subsampling. GDI+ не позволяет его изменить.
Т.е. получается — что все, без шансов, если не использовать сторонних библиотек?
Re[3]: Как правильно сохранять Drawing.Image в Jpeg?
Здравствуйте, fmiracle, Вы писали:
DR>>Причина в chroma subsampling. GDI+ не позволяет его изменить. F>Т.е. получается — что все, без шансов, если не использовать сторонних библиотек?
Здравствуйте, fmiracle, Вы писали:
F>А так я что-то не вкурил в суть кода... Поясни, плиз? F>Мне же не отобразить на форме надо, а обработать и потом сохранить в виде jpeg.
F>От временного преобразования в png ничего не меняется — картинка ж в правильной цветности до самого момента сохранения в jpeg. А вот при сохранении — и именно jpeg — портится.