2009-02-24 2 views
3

Мои исходные изображения 2288px x 1712px и 816kb. Когда я создаю эскиз 1024 x 768, размер файла более чем в два раза превышает источник с высоким разрешением (1.13mb - 1.8mb в зависимости от используемого метода).Создание миниатюр разумного размера для веб-приложения

Исходные изображения и миниатюры, созданные: .jpg

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

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

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

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

Это дает мне эскиз 1.83MB.

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

Я пробовал 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; 

EDIT ДЛЯ ОТВЕТА

мне не хватало компрессию. Мой 1024 эскиза теперь 112kb.

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;  
} 
+0

В каком формате вы сохраняете свои миниатюры? – VBNight

+0

Добавлен к вопросу - источник и миниатюры .jpg – KevinUK

+0

Также добавьте код, в котором вы сохраняете JPG. Код изменения размера выглядит правильно. – VBNight

ответ

1

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

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

EDIT: Замечание о том, что вы отправляете JPEG в JPEG ... отсутствие хорошего сжатия может быть ограничением возможностей встроенного изображения Framework.

2

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

EDIT: Если вы используете JPG, попробуйте уменьшить качество изображения. 1024x768 эскизы должны быть намного меньше 1 МБ и все еще выглядят хорошо.

Смежные вопросы