我有一个自定义视图,它是由一些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是否会造成性能损失(内存或CPU时间)?我的应用程序似乎并没有因此而占用大量内存或速度减慢,但如果我能加快速度或减少内存消耗,那将是一次胜利。
我尝试了以编程方式缩放图像。如下所示:
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的两倍,但在iPhone4上运行时,这个视图的大小是相同的。因此,通过根据视图的大小缩放图像,我最终会使它们的分辨率低于iPhone 4上应有的分辨率,而且它们看起来有点糟糕。
因此,第二个问题是,以编程方式缩小图像是否有一些好处。如何利用iPhone 4上的额外像素?显然,我不能根据我的视图大小来判断。
发布于 2010-08-13 18:36:30
避免过早优化。
如果你的应用程序运行得很好,那它就运行得很好。如果没有,请尝试对其进行优化。
根据我的经验,使用200px的图像,50px的图像就可以了。图像可以很容易地加载到图形硬件,并且缩放很可能是在硬件中完成的。
如果性能分析告诉我,我只会预缩放图像。
对于你问题的第二部分,实际的缩放代码,你必须注意到,CoreGraphics对视网膜显示器一无所知。所以在CGBitmapContext中,一个点的是一个像素,除非你另有说明。在您的代码片段中,您省略了创建位图上下文的行,但它很可能是UIGraphicsBeginImageContext(CGSize size)。看一看,改用UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale);。传递0.0,就像scale通常做的那样。
UIKit Functions: UIGraphicsBeginImageContextWithOptions
https://stackoverflow.com/questions/3475390
复制相似问题