UIImage с большим размером изображения - проблема с памятью - сбой - PullRequest
3 голосов
/ 09 августа 2010

Я хотел загрузить и отобразить изображение ( .jpg, .png) большого размера, например. 1800x1200 или 2000x1800 (ширина х высота). Если я отображаю изображения такого большого размера (1800x1200 или 2000x1800) в UIImageView, это также потребляет много памяти, и приложение выходит из строя. Также в соответствии с документацией Apple (http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIImage_Class/Reference/Reference.html),) следует избегать создания объектов UIImage, размер которых превышает 1024 x 1024. Одним из решений является изменение размера изображения. Я применил логику для изменения размера изображения, используя следующий код.

UIGraphicsBeginImageContext( newSize );
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

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

Также в этой (http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIImage_Class/Reference/Reference.html) ссылке) Apple сказала, что

"Вам следует избегать создания объектов UIImage, размер которых превышает 1024 x 1024. Помимо большого объема памяти, которое может занимать такое изображение, у вас могут возникнуть проблемы при использовании изображения в качестве текстуры в OpenGL ES или при рисовании изображение к представлению или слою. Это ограничение размера не применяется, если вы выполняете манипуляции на основе кода, такие как изменение размера изображения больше, чем 1024 x 1024 пикселей, путем рисования его в растровом графическом контексте. необходимо изменить размер изображения таким образом (или разбить его на несколько меньших изображений), чтобы нарисовать его в одном из ваших видов. ".

Может кто-нибудь подробнее рассказать о "This size restriction does not apply if you are performing code-based manipulations, such as resizing an image larger than 1024 x 1024 pixels by drawing it to a bitmap-backed graphics context."? Как нарисовать изображение в растровом графическом контексте? Что такое растровый графический контекст? Это помогло бы мне, если бы кто-нибудь мог поделиться примером кода. Заранее спасибо !!

Ответы [ 2 ]

4 голосов
/ 09 августа 2010

UIGraphicsBeginImageContext () создает растровый графический контекст (под капотом он вызывает CGBitmapContextCreate).

«Ограничение» возникает из-за того, что UIViews визуализируются с использованием CALayers, а CALayers визуализируются как текстурированные полики на графическом процессоре, а графический процессор имеет максимальный размер текстуры (это выглядит как 2044 пикселя на iPhone 2G / 3G и предположительно iPod Touch 1G / 2G). Они увеличили его на устройствах 3GS и более поздних, предположительно потому, что изображения с камеры больше.

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

1 голос
/ 27 ноября 2010

Похоже, вам следует избегать хранения всего изображения в памяти, даже если оно ненадолго.

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

Если вы планируете масштабировать, то CATiledLayer может вам сильно помочь.Смотрите видео с сессии WWDC'10 о представлениях прокрутки.Это очень поучительно.

...