2013-02-24 2 views
3

Мы знаем, что изображение может быть сжато с помощью метода UIImageJPEGRepresentation(), как в следующих кодах.NSData длина изображения, сжатого с UIImageJPEGRepresentation()

NSData *imgData = UIImageJPEGRepresentation(imageResized, 0.5); 
    NSLog(@"imgData.length :%d",imgData.length); 

    imageResized = [UIImage imageWithData:imgData]; 
    NSData *imgData2 = UIImageJPEGRepresentation(imageResized, 1); 

    NSLog(@"imgData2.length :%d",imgData2.length); 

Бревно:

2013-02-25 00:33:14.756 MyApp[1119:440b] imgData.length :371155 
2013-02-25 00:33:20.988 MyApp[1119:440b] imgData2.length :1308415 

Что Im запутаться в том, что почему length из imgData и imgData2 различны. В моем приложении изображение должно быть загружено на сервер. Должен ли я загружать NSData на сервер для сохранения хранилища? Возможно ли, чтобы телефон Android загрузил NSData и конвертировал его в изображение? Любая помощь будет оценена!

+0

Почему вы ожидаете, что они будут иметь одинаковый размер? Знаете ли вы, что означает компрессия? – 2013-02-24 17:15:19

+0

@ H2CO3 PLZ взглянуть на принятый ответ, и вы увидите, почему я запутался :) Да, я знаю, что такое компрессия :) –

ответ

12

Вы начинаете с UIImage определенного размера (скажем, 1024x768). Это занимает 1024x768x4 байтов в памяти. Затем вы сжимаете его с коэффициентом 0,5 и получаете 371 155 байт.

Затем вы создаете новый UIImage со сжатыми данными. Это все равно 1024x768 (или что-то еще) UIImage, поэтому теперь он занимает тот же объем памяти (1024x768x4), что и исходное изображение. Затем вы конвертируете его в новый JPG с меньшим сжатием, давая вам 1,308,415 байт.

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

Поскольку ваши данные представляют собой JPG, все, что загружает данные, сможет обрабатывать данные в формате JPG, включая Android-телефон.

+0

Спасибо за ваш ответ, im clear now :) –

+0

, но я хочу знать, почему after'imageResized = [UIImage imageWithData: imgData] ', мы получаем исходное изображение. Это интересно. @luyuan @rmaddy – demon

+0

@demon У вас нет оригинального изображения. Вы прочитали мой ответ? Он объясняет, как второе изображение отличается от оригинала. – rmaddy

3

Число байтов больше для второго изображения, потому что вы передали гораздо более высокое значение качества сжатия до UIImageJPEGRepresentation. Более высокое качество занимает больше байтов.

Файл, однажды загруженный на сервер, будет стандартным файлом JPEG, доступным для просмотра любым устройством, включая Android.

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