Масштабирование изображения с помощью UIImageView на iPhone - PullRequest
0 голосов
/ 13 августа 2010

У меня есть пользовательское представление, которое состоит из нескольких UIImageViews.Эти UIImageViews могут различаться по размеру (от 200x200 до 50x50).Изображения, которые они отображают (загружают из файлов png), хранятся в ресурсах с максимально возможным разрешением (200x200), но часто отображаются с меньшим разрешением.

В настоящее время я просто загружаю UIImageViews изображениями с полным разрешением, таким образом:

UIImage* anImage = [UIImage imageWithContentsOfFile:imagePathAndName]; // anImage is 200x200
aView = [[UIImageView alloc] initWithImage:anImage];
aView.frame = myFrame; // myFrame is 50x50

Первый вопрос, есть ли какое-либо ухудшение производительности (время памяти или ЦП), чтобы просто позволить UIImageView уменьшать изображения, скажем, с 200x200 до 50x50?Не похоже, что мое приложение использует тонну памяти или замедляется в результате этого, но если бы я мог ускорить его или уменьшить потребление памяти, это было бы победой.

Я играл вокругс масштабированием изображений программно.Вот так:

UIImage* anImage = [UIImage imageWithContentsOfFile:imagePathAndName]; // Image is UIGraphicsBeginImageContext( scaledSize ); // scaledSize is 50x50
CGRect scaledRect = CGRectMake( 0.0, 0.0, scaledSize.width, scaledSize.height );
[anImage drawInRect:scaledRect];
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); // Scaled image is now 50x50
UIGraphicsEndImageContext();
aView = [[UIImageView alloc] initWithImage:scaledImage];
aView.frame = myFrame; // myFrame is 50x50

Программное масштабирование изображений сначала, казалось, не оказало вредного воздействия ... пока я не загрузил его на свой iPhone 4. Видите, размер UIImageView основан на размере, если он родительскийview, который (выложен в IB), является размером экрана iPhone 3G.К сожалению, размер этого представления при работе на iPhone 4 одинаков, несмотря на то, что у iPhone 4 разрешение в два раза больше, чем у 3G.Поэтому, масштабируя изображения в зависимости от размера изображения, я получаю более низкое разрешение, чем должно быть на iPhone 4, и они выглядят довольно дерьмово.

Итак, второй вопрос, если естьНекоторое преимущество заключается в программном масштабировании изображений.как я могу воспользоваться дополнительными пикселями на iPhone 4?Очевидно, я не могу пойти по размеру моего взгляда.

1 Ответ

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

Избегайте преждевременной оптимизации.

Если ваше приложение работает хорошо, оно работает хорошо. Если этого не произойдет, попробуйте оптимизировать его.

Исходя из моего опыта, я могу использовать изображение размером 200 пикселей, для которого изображение 50 пикселей. Изображение может быть легко загружено в графическое оборудование, а масштабирование, скорее всего, выполняется аппаратно.

Я бы предварительно масштабировал изображения, только если профилирование производительности скажет мне.

Что касается второй части вашего вопроса, фактического кода масштабирования, вы должны заметить, что CoreGraphics ничего не знает о дисплеях сетчатки. Таким образом, в CGBitmapContext точка является пикселем, если вы не укажете иначе. В своем фрагменте кода вы пропустили строку, которая создает растровый контекст, но, скорее всего, UIGraphicsBeginImageContext(CGSize size). Взгляните и используйте вместо него UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale);. Передача 0.0 как обычно должна делать шкала.

Функции UIKit: UIGraphicsBeginImageContextWithOptions

...