Создание миниатюр разумного размера для веб-приложения

Мои исходные изображения 2288px x 1712px и 816kb. Когда я создаю миниатюру 1024 x 768, размер файла более чем в два раза превышает размер исходного файла с высоким разрешением (1,13–1,8 МБ в зависимости от используемого метода).

Исходные изображения и эскизы создаются в формате .jpg.

Даже создание миниатюры 299 x 224 занимает 180 КБ, тогда как, если бы я вручную создал миниатюру в GIMP, это 14 КБ.

Мне нужно, чтобы изображения выглядели хорошо, поэтому я не могу идти на компромисс между качеством и размером.

Я попробовал Image.GetThumbnailImage, который создал файл размером 1,13 МБ, но я читал, что это может привести к неожиданным результатам.

В большинстве статей рекомендуется писать код, подобный этой статье: http://www.codeproject.com/KB/GDI-plus/imageresize.aspx

Это дает мне миниатюру размером 1,83 МБ.

Должен ли я ожидать больших размеров файлов по сравнению с тем же самым с настольным приложением?

Я пробовал 16 бит вместо 24 и комментировал значения «высокого качества», но я все еще не могу получить его меньше 1 МБ. Любые идеи?

Bitmap bmPhoto = new Bitmap(destWidth, destHeight,PixelFormat.Format24bppRgb);
        bmPhoto.SetResolution(image.HorizontalResolution,image.VerticalResolution);

        Graphics grPhoto = Graphics.FromImage(bmPhoto);

        grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;        
        grPhoto.SmoothingMode = SmoothingMode.HighQuality;
        grPhoto.PixelOffsetMode = PixelOffsetMode.HighQuality;
        grPhoto.CompositingQuality = CompositingQuality.HighQuality;

ИЗМЕНИТЬ ОТВЕТ

Мне не хватило компрессии. Моя миниатюра 1024 теперь составляет 112 КБ.

Encoder qualityEncoder = Encoder.Quality;
//80L is the compression percentage
EncoderParameter ratio = new EncoderParameter(qualityEncoder, 80L);
// Add the quality parameter to the list
EncoderParameters codecParams = new EncoderParameters(1);
codecParams.Param[0] = ratio;

ImageCodecInfo jpegCodecInfo = GetEncoderInfo("image/jpeg");


bmPhoto.Save(Path.Combine(filepath, RenameImage(filename, appendName, replaceWholeString)), jpegCodecInfo, codecParams);


ImageCodecInfo GetEncoderInfo(string mimeType)    
{    
int j;    
ImageCodecInfo[] encoders;    
encoders = ImageCodecInfo.GetImageEncoders();

for(j = 0; j < encoders.Length; ++j)    
{    
if(encoders[j].MimeType.ToUpper() == mimeType.ToUpper())    
return encoders[j];    
}    
return null;    
}

person KevinUK    schedule 24.02.2009    source источник
comment
В каком формате вы сохраняете миниатюры?   -  person VBNight    schedule 24.02.2009
comment
Добавлено к вопросу - исходник и эскизы .jpg   -  person KevinUK    schedule 24.02.2009
comment
Пожалуйста, также добавьте код, в котором вы сохраняете файлы JPG. Код изменения размера выглядит правильно.   -  person VBNight    schedule 24.02.2009


Ответы (2)


Формат растрового изображения - ваша главная проблема. Это всегда будет огромным по сравнению с другими форматами. Растровые изображения кодируются по длине и не сжимаются.

Если ваши изображения являются фотографиями, вам лучше всего подойдет JPEG. Вы можете получить отличное визуальное качество с крошечными размерами файлов. Если они представляют собой штриховые рисунки и не имеют большого количества цветов, GIF также может быть хорошим вариантом. Существует несколько хороших библиотек для работы с изображениями, например FreeImage.

РЕДАКТИРОВАТЬ: заметил комментарий о том, что вы переходите с JPEG на JPEG... отсутствие хорошего сжатия может быть ограничением встроенных возможностей изображения Framework.

person Dave Swersky    schedule 24.02.2009

Похоже, вы не используете сжатие или используете очень слабое (например, RLE). Попробуйте PNG, JPG (или JPG2000, который может быть без потерь) или GIF.

РЕДАКТИРОВАТЬ: Если вы используете JPG, попробуйте уменьшить качество изображения. Миниатюры 1024x768 должны иметь размер намного меньше 1 МБ и при этом выглядеть хорошо.

person schnaader    schedule 24.02.2009