Как получить точный размер изображения в байтах?

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

    NSData *data = UIImageJPEGRepresentation(image,0.5);
    NSLog(@"image size in bytes %lu",(unsigned long)data.length);

person Nagendra    schedule 29.05.2014    source источник
comment
Что вы получаете за значение .length? Если 0, data не nil?   -  person Todd Lehman    schedule 02.06.2014
comment
Я получил ненулевое значение. например Я преобразовал изображение размером 2,18,169 байт в NSData и получил длину данных 127201 байт.   -  person Nagendra    schedule 02.06.2014
comment
Когда вы говорите «изображение размером 218169 байт», вы имеете в виду, что UIImage был такого размера? Как вы создали UIImage и как вы измерили его размер? В любом случае, возможно ли, что потеря/усадка вызвана настройкой качества сжатия 0,5? Что произойдет, если вы пройдете 1.0 вместо 0.5? 0,75? 0,25?   -  person Todd Lehman    schedule 02.06.2014
comment
NSData *data = UIImageJPEGRepresentation (изображение, 1); NSLog(@bytes of ImageData: %lu,(unsigned long)data.length); if(data.length ‹= 204800){ }else{ data = UIImageJPEGRepresentation(image,1); в то время как (data.length / 1000 ›= 200) { image = [self imageWithImage:image andWidth:image.size.width/2 andHeight:image.size.height/2]; данные = UIImageJPEGRepresentation (изображение, 1); } NSData *data1 = UIImageJPEGRepresentation(image,1); NSLog(@размер изображения после сжатия %lu,(unsigned long)data1.length); }   -  person Nagendra    schedule 02.06.2014
comment
пожалуйста, проверьте указанный код. Мне нужно отправить изображение на сервер, и оно должно быть меньше 200 КБ. для этого я преобразовал UIImage в данные и проверил, что длина данных меньше или равна 204800. Если длина больше 204800, изображение должно быть сжато. Я дал изображение размером 218169 байт (показано подробно), его данные длины возвращают 127201 байт, поэтому условие не выполняется.   -  person Nagendra    schedule 02.06.2014
comment
Я понимаю. Что ж, на самом деле это может быть правильно. Параметр качества сжатия JPEG, равный 1,0, не обязательно приводит к тому, что на выходе создается исходное изображение без потерь. Я считаю, что он все еще способен немного сжиматься (в данном случае около 58% от исходного размера).   -  person Todd Lehman    schedule 02.06.2014
comment
Входное изображение также является файлом JPEG?   -  person YogevSitton    schedule 07.06.2014
comment
да. это изображение в формате JPEG   -  person Nagendra    schedule 08.06.2014
comment
Так что в этом нет ничего плохого. Образ был сжат, поэтому размер должен быть меньше, не так ли?   -  person VitorMM    schedule 08.06.2014
comment
конечно, я также пытался использовать свойство UIImagePNGRepresenation. Он не вернул точного значения. Когда я конвертирую изображение в nsdata и его длина должна быть равна размеру изображения в байтах, не так ли??   -  person Nagendra    schedule 09.06.2014


Ответы (1)


На самом деле функция UIImage.length здесь не возвращает неправильное значение, это просто результат преобразования/возврата с потерями из UIImage в NSData.

Установка CompressQuality на минимально возможное сжатие 1,0 в UIImageJpegRepresentation не вернет исходное изображение. Хотя в этом процессе метаданные изображения удаляются, функция может и обычно будет давать объект большего размера, чем оригинал. Обратите внимание, что это увеличение размера файла НЕ также не повышает качество изображения по сравнению со сжатым оригиналом. JPEG изначально сильно сжаты, поэтому они так часто используются, и функция распаковывает их, а затем повторно сжимает. Это похоже на введение ботокса после того, как возраст растянул ваше тело, он может выглядеть как оригинал, но внутренности уже не так хороши, как раньше.

Вы можете условно использовать более низкое качество сжатия для больших файлов, близкое к 1,0, так как качество быстро упадет. Помимо этого, в зависимости от конечной цели ваших изображений, единственным другим вариантом будет изменение размера изображения или настройка его разрешения, возможно, в дополнение к настройке коэффициента сжатия. Это изменение экспоненциально сократит использование данных. Использование в Интернете и на мобильных устройствах обычно не требует такого разрешения, как изображения, предназначенные для цифровой печати.

Вы можете написать некоторый код, который настраивает каждое изображение и представление NSData настолько, насколько это необходимо, чтобы соответствовать его индивидуальному ограничению данных.

person Ataraxia64    schedule 11.06.2014