2010-08-13 2 views
0

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

В настоящее время я просто загрузить 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 на основе размера, если это родительский вид, который (выложенный в IB), является размером экрана iPhone 3G. К сожалению, размер этого представления при работе на iPhone 4 одинаковый, несмотря на то, что iPhone 4 имеет в два раза больше разрешения как 3G. Таким образом, масштабируя изображения в зависимости от размера представления, я в конечном итоге делаю их более низким разрешением, чем они должны быть на iPhone 4, и они выглядят немного дрянными.

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

ответ

4

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

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

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

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

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

UIKit Functions: UIGraphicsBeginImageContextWithOptions

+0

UIGraphicsBeginImageContextWithOptions сделал трюк отлично, спасибо! И ваша точка зрения на преждевременную оптимизацию хорошо взята, мне придется подумать. – zpasternack