Работа с изображениями в C # - PullRequest
4 голосов
/ 26 июля 2010

Я загружаю изображение JPG с жесткого диска в байт [].Есть ли способ изменить размер изображения (уменьшить разрешение) без необходимости помещать его в растровое изображение?

спасибо

Ответы [ 3 ]

3 голосов
/ 26 июля 2010

Всегда есть способы, но будут ли они лучше ... JPG - это сжатый формат изображения, который означает, что для любых манипуляций с ним вам нужно что-то для интерпретации этих данных. Объект bimap сделает это за вас, но если вы хотите пойти другим путем, вам нужно разобраться в спецификации jpeg, создать какой-то синтаксический анализатор и т. Д. Возможно, существуют ярлыки, которые можно использовать без необходимости сделать полное толкование оригинального JPG, но я думаю, что это будет плохая идея.

О, и не стоит забывать, что существуют различные форматы файлов для JPG (JFIF и EXIF), которые вы захотите понять ...

Я бы очень серьезно подумал, прежде чем избегать объектов, специально предназначенных для того, что вы пытаетесь сделать.

1 голос
/ 27 июля 2010

Вот что я делаю.

И нет, я не думаю, что вы можете изменить размер изображения без предварительной обработки его в памяти (то есть в каком-либо растровом изображении).

Изменение размера приличного качества включает использование алгоритма интерполяции / экстраполяции; это не может быть просто «выбрать каждые n пикселей», если вы не можете договориться с ближайшим соседом.

Вот некоторые объяснения: http://www.cambridgeincolour.com/tutorials/image-interpolation.htm

protected virtual byte[] Resize(byte[] data, int width, int height) {
var inStream = new MemoryStream(data);
var outStream = new MemoryStream();

var bmp = System.Drawing.Bitmap.FromStream(inStream);
var th = bmp.GetThumbnailImage(width, height, null, IntPtr.Zero);
th.Save(outStream, System.Drawing.Imaging.ImageFormat.Jpeg);
return outStream.ToArray(); }
1 голос
/ 26 июля 2010

Файл .jpeg - это просто пакет байтов без декодера JPEG. Есть один встроенный в класс Bitmap, он отлично справляется с декодированием файлов .jpeg. В результате получается растровый объект, вы не можете обойти это.

И он поддерживает изменение размера с помощью класса Graphics, а также конструктора Bitmap (Image, Size). Но да, уменьшение размера .jpeg часто приводит к увеличению размера файла. Это неизбежный побочный эффект режима Graphics.Interpolation. Он пытается улучшить внешний вид уменьшенного изображения, пропуская пиксели через фильтр. Бикубический фильтр отлично справляется с этим.

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

Вы можете повозиться с Graphics.InterpolationMode и выбрать фильтр более низкого качества. Создает худшее изображение, но его легче сжать. Я сомневаюсь, что вы оцените результат.

...