Как правильно сохранять Drawing.Image в Jpeg?
От: fmiracle  
Дата: 27.01.12 07:53
Оценка:
Потребовалось тут реализовать небольшой код по мелкой обработке картинок (изменение размеров, обрезка).
В целом возможностей 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;

image.Save(resultFileName, jpgEncoder, myEncoderParameters);
Re[2]: Как правильно сохранять Drawing.Image в Jpeg?
От: fmiracle  
Дата: 27.01.12 08:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>image.Save(resultFileName, jpgEncoder, myEncoderParameters);


Да пробовал я и так. Один фиг
Качество сжатия таким образом регулируется, а вот с цветностью та же беда.
Re[3]: Как правильно сохранять Drawing.Image в Jpeg?
От: Vaako Украина  
Дата: 27.01.12 12:41
Оценка:
Здравствуйте, 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?
От: fmiracle  
Дата: 27.01.12 13:06
Оценка:
Здравствуйте, Vaako, Вы писали:

V>А так?

V>
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 — портится.
Re: Как правильно сохранять Drawing.Image в Jpeg?
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 27.01.12 13:16
Оценка:
Причина в chroma subsampling. GDI+ не позволяет его изменить.
Ce n'est que pour vous dire ce que je vous dis.
Re[2]: Как правильно сохранять Drawing.Image в Jpeg?
От: fmiracle  
Дата: 27.01.12 14:04
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>Причина в chroma subsampling. GDI+ не позволяет его изменить.

Т.е. получается — что все, без шансов, если не использовать сторонних библиотек?
Re[3]: Как правильно сохранять Drawing.Image в Jpeg?
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 27.01.12 14:14
Оценка: 15 (2)
Здравствуйте, fmiracle, Вы писали:

DR>>Причина в chroma subsampling. GDI+ не позволяет его изменить.

F>Т.е. получается — что все, без шансов, если не использовать сторонних библиотек?

Без шансов, к сожалению.
Ce n'est que pour vous dire ce que je vous dis.
Re[5]: Как правильно сохранять Drawing.Image в Jpeg?
От: Vaako Украина  
Дата: 27.01.12 17:33
Оценка:
Здравствуйте, fmiracle, Вы писали:

F>А так я что-то не вкурил в суть кода... Поясни, плиз?

F>Мне же не отобразить на форме надо, а обработать и потом сохранить в виде jpeg.

F>От временного преобразования в png ничего не меняется — картинка ж в правильной цветности до самого момента сохранения в jpeg. А вот при сохранении — и именно jpeg — портится.


Ну да, правильно, извини.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.