在iPhone上使用UIImageView进行图像缩放

时间:2010-08-13 09:07:17

标签: iphone objective-c uiimageview uiimage iphone-4

我有一个自定义视图,它由许多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

第一个问题,是否有任何性能损失(内存或CPU时间)让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的分辨率是3G的两倍,但在iPhone 4上运行时这个视图的大小是一样的。因此,通过根据视图的大小缩放图像,我最终使它们的分辨率低于它们在iPhone 4上的分辨率,它们看起来有点蹩脚。

所以第二个问题是,如果以编程方式缩小图像有一些好处。我怎样才能利用iPhone 4上的额外像素?显然,我不能按照我的观点来衡量。

1 个答案:

答案 0 :(得分:4)

避免过早优化。

如果你的应用运行良好,它运行良好。如果没有,请尝试优化它。

根据我使用200px图像的经验,50px图像可以做到这一点很好。图像可以轻松加载到图形硬件,缩放很可能是在硬件中完成的。

如果性能分析告诉我,我只会预先缩放图像。

对于问题的第二部分,您必须注意实际缩放代码,CoreGraphics对视网膜显示一无所知。所以在CGBitmapContext中,一个点一个像素,除非你另有说明。在您的代码段中,您省略了创建位图上下文的行,但最有可能是UIGraphicsBeginImageContext(CGSize size)。看看并使用UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale);代替。通常应该将0.0作为比例传递。

UIKit Functions: UIGraphicsBeginImageContextWithOptions