2016-03-16 2 views
3

Я установил изображение с 10000 * 10000 пикселей в UIImageView из сети с помощью SDWebImage, а приложение разбилось, потому что оно выделяло слишком много памяти. Я пытался изменить размер изображения, которые были загружены на SDWebImage, поэтому я добавить код ниже:Приложение разбилось, когда я показываю большое изображение по UIImageView

UIGraphicsBeginImageContext(size); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextClearRect(context, CGRectMake(0, 0, size.width, size.height)); 
CGContextSetInterpolationQuality(context, 0.8); 
[self drawInRect:drawRect blendMode:kCGBlendModeNormal alpha:1]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Хотя размер изображения был меньше, мое приложение разбился из-за той же самой причине. Кажется, что есть какое-то действие рендеринга во время действия изменения размера, память увеличилась до 600 М и упала до 87М через некоторое время.

Как изменить размер изображения без рендеринга?

Кажется, что отображение изображения с помощью UIWebView не было проблемой. Как это работает?

Любая помощь и предложения будут весьма заметны


. Разрешение: https://developer.apple.com/library/ios/samplecode/LargeImageDownsizing/


Постановление делает работу для JPG, но не детские

+0

Это может помочь: http://stackoverflow.com/questions/24338414/didrecievememorywarning-called-after-viewdidappear-when-displaying-large-image-f – RDSpinz

ответ

1

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

I.e. если вы смотрите на весь образ, вы получаете 1 плиту, которая уменьшена и, следовательно, низкое качество и небольшие размеры. По мере того, как вы увеличиваете масштаб изображения, вы возвращаете другие изображения небольшого размера, которые показывают меньше области изображения.

Возможно, веб-изображение использует формат изображения для загрузки относительно небольшого размера изображения, который является уменьшенной версией всего изображения, поэтому ему не нужно распаковывать все изображение в память. Он может это сделать, потому что он знает, что ваше изображение составляет 10 000 × 10 000, но оно будет отображаться на странице при 300x300 (например).

+0

Спасибо. У вас есть демо-версия? Я использую pod для управления моим проектом, поэтому я не могу редактировать исходный код SDWebImage, я должен получить изображение из него и выполнить дополнительную операцию. – tripleCC

+0

tiling, как правило, поддерживается сервером, вы должны иметь возможность запрашивать отдельные фрагменты (сторонняя библиотека может управлять им). В качестве альтернативы вы могли бы использовать другую службу для генерации фрагментов, если это необходимо, или создать меньшую версию изображения. – Wain

+0

Также см. Http://stackoverflow.com/questions/14772913/load-uiimage-low-quality, если вы хотите снизить качество вместо плитки. – Wain

0

Вы пытались использовать: UIImageJPEGRepresentation (или UIImagePNGRepresentation)

Вы можете сделать свой размер меньше с ней.

+0

Пожалуйста, покажите нам, как UIImageJPEGRпредставление или UIImagePNGRпредставление относится к этому делу. –

+0

@ Dinh Nhat, я уже пробовал эту функцию, когда был вовлечен в проблему. Но, похоже, эта функция также будет занимать слишком много памяти. – tripleCC