2012-02-24 3 views
1

У меня есть массив байтов, содержащий jpeg-изображение. Мне просто интересно, можно ли уменьшить его размер?Возможно ли уменьшить размер изображения, поступающего из массива байтов

Редактировать: Ok. Я признал свою ошибку. Тогда мой вопрос заключается в том, как уменьшить качество изображения, исходя из массива байтов.

+3

Что вы имеете в виду? Массив имеет фиксированный размер после его создания, но вы говорите об сжатии изображения? Снижение качества? Уменьшение размера изображения? Просьба уточнить. –

+0

нарезать его как пиццу и съесть. Извините, байт-массивы напоминают пиццу. особенно круговой буфер – mauris

ответ

10

Пожалуйста, поймите, что бесплатного обеда нет. Уменьшение размера изображения JPEG путем увеличения сжатия также уменьшит качество изображения. Тем не менее, вы можете уменьшить размер изображения JPEG, используя класс Image. Этот код предполагает, что inputBytes содержит исходное изображение.

var jpegQuality = 50; 
Image image; 
using (var inputStream = new MemoryStream(inputBytes)) { 
    image = Image.FromStream(inputStream); 
    var jpegEncoder = ImageCodecInfo.GetImageDecoders() 
    .First(c => c.FormatID == ImageFormat.Jpeg.Guid); 
    var encoderParameters = new EncoderParameters(1); 
    encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, jpegQuality); 
    Byte[] outputBytes; 
    using (var outputStream = new MemoryStream()) { 
    image.Save(outputStream, jpegEncoder, encoderParameters); 
    outputBytes = outputStream.ToArray(); 
    } 
} 

Теперь outputBytes содержит версию повторно сжатого изображения, используя другое качество JPEG.

Уменьшая jpegQuality (должно быть в диапазоне 0-100), вы можете увеличить сжатие за счет снижения качества изображения. Дополнительную информацию см. В поле Encoder.Quality.

Вот пример, где вы можете увидеть, как jpegQuality влияет на качество изображения. Это та же фотография, сжатая с использованием 20, 50 и 80 в качестве значения jpegQuality. Размеры 4,99, 8,28 и 12,9 КБ.

JPEG quality sample image

Обратите внимание, как текст становится «нечетким», даже если качество высокое. Вот почему вам следует избегать использования JPEG для изображений с равномерно окрашенными областями (изображения/диаграммы/диаграммы, созданные на компьютере). Вместо этого используйте PNG. Для фотографий JPEG очень подходит, если вы не слишком снижаете качество.

+0

Общая ошибка произошла в GDI +. :( в этой строке: 'image.Save (memoryStream, jpegEncoder, encoderParameters);' –

+0

@MehmetBudak: Извините, исправил код. (Класс 'Image' является« ленивым »и обращается к байтам изображения как можно позже Раньше я слишком рано использовал входной буфер.) –

+1

Ты просто стал героем в моей стране! Спасибо, сэр !!!;) –

0

Размер массива байтов всегда можно уменьшить, но вы потеряете данные о своем изображении. Вы могли бы уменьшить качество jpeg, тогда в качестве байтового массива потребуется меньше данных.

0

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

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