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

Posted

技术标签:

【中文标题】在 iPhone 上使用 UIImageView 进行图像缩放【英文标题】:Image scaling with UIImageView on iPhone 【发布时间】:2010-08-13 09:07:17 【问题描述】:

我有一个由许多 UIImageViews 组成的自定义视图。这些 UIImageView 的大小可以不同(从 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 上运行时,此视图的大小是相同的,尽管 iPhone 4 的分辨率是 3G 的两倍。因此,通过根据视图大小缩放图像,我最终使它们的分辨率低于 iPhone 4 上的分辨率,而且它们看起来有点糟糕。

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

【问题讨论】:

【参考方案1】:

避免过早优化。

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

根据我使用 200 像素图像的经验,使用 50 像素图像就可以了。图像可以很容易地加载到图形硬件中,并且缩放很可能在硬件中完成。

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

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

UIKit Functions: UIGraphicsBeginImageContextWithOptions

【讨论】:

UIGraphicsBeginImageContextWithOptions 完美地解决了这个问题,谢谢!你关于过早优化的观点很好,我必须考虑一下。

以上是关于在 iPhone 上使用 UIImageView 进行图像缩放的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iphone5 和 iphone6 上更改 UIImageView 的大小?

在 4 英寸 iphone 上查看时 UIImageView 正在向下移动

如何在 iPhone 上放大/放大/缩放 UIImageView 的某个部分?

iphone - 单个 UIImage 多个 UIImageView?

iPhone sdk - UIImageView 重叠问题

iPhone 编程:如何使 UIImageView 中的 UIImage 以实际大小显示?