Создание эскизов разумного размера файла для веб-приложения - PullRequest
3 голосов
/ 24 февраля 2009

Мои исходные изображения имеют размер 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.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;

РЕДАКТИРОВАТЬ ДЛЯ ОТВЕТА

Мне не хватало сжатия. Моя миниатюра 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;    
}

Ответы [ 2 ]

2 голосов
/ 24 февраля 2009

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

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

1 голос
/ 24 февраля 2009

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

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

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

...