Flip jpeg Качество потери изображения

Я переворачиваю изображение (12M), нахожу, что размер изображения увеличился до 26M, а формат изображения был изменен на png. Я сохраняю его в формате jpeg с форматом изображения, но размер изображения уменьшается до 2M. код следующий.

public void Flip(Bitmap map)
{  
   bmp.Save("d://image1.jpg") //12M

   RotateFlipType rft = RotateFlipType.Rotate180F

   bmp.RotateFlip(rft);
   bmp.Save("d://image2.jpg") //26M

   bmp.Save("d://image3.jpg",ImageFormat.Jpeg) //2M

}

Если я хочу, чтобы новое изображение имело тот же размер, что и исходное изображение, как я могу это сделать?

Я пытаюсь сохранить изображение с помощью EncoderParameters, но я не могу получить действительный EncoderParameterList из исходного изображения, и я открываю image3.jpg с помощью инструментов изображения, я нахожу его качество 75 (исходное изображение - 100 л), а субдискретизация ВКЛ (исходное изображение ВЫКЛЮЧЕНО, как это установить).

благодаря.


person conger    schedule 23.09.2014    source источник
comment
Вы ищете JpegBitmapEncoder? Поворот и переворот должны быть без потерь.   -  person Corak    schedule 23.09.2014
comment
Не уверен, что размер на самом деле всегда показатель качества.   -  person TaW    schedule 23.09.2014


Ответы (2)


Если вы не используете библиотеку переворачивания JPEG без потерь, вам следует проверить параметры исходного файла JPEG. Используйте их как выходные параметры.

В частности, для получения наилучших результатов выборка (в маркере SOF) и таблицы квантования (маркер DQT) должны быть одинаковыми.

Существует ряд программ, которые сбрасывают содержимое потока JPEG, чтобы вы могли видеть, что это за параметры.

«Качество» - это совершенно бессмысленная цифра в формате JPEG. Это просто сокращение, которое многие кодеры JPEG используют для выбора таблиц квантования. Цифра 75 в одной реализации может быть чем-то совершенно другим в другой.

person user3344003    schedule 23.09.2014

Попробуй это:

var jgpEncoder = GetEncoder(ImageFormat.Jpeg);
var myEncoder = System.Drawing.Imaging.Encoder.Quality;

var myEncoderParameters = new EncoderParameters(1);
var myEncoderParameter = new EncoderParameter(myEncoder, 75L);
myEncoderParameters.Param[0] = myEncoderParameter;

bmp.Save(@"d://image2.jpg", jgpEncoder, myEncoderParameters);

Также см. MSDN для справки.

person Andy Korneyev    schedule 23.09.2014
comment
Я пробую это и устанавливаю качество на 100L, размер изображения - 8M (исходное изображение - 12M), может быть, мне также нужно установить субдискретизацию, но я не могу найти, где это установить. - person conger; 23.09.2014
comment
Я пробую это: var encList = bmp.GetEncoderParameterList (info.Clsid); RotateFlipType rft = RotateFlipType.Rotate180FlipY; bmp.RotateFlip (rft); bmp.Save (d: //image3.jpg, info, encList); есть исключение: параметры недействительны. - person conger; 23.09.2014