2010-08-13 102 views
0

我有一個由多個UIImageView組成的自定義視圖。這些UIImageView可以在大小上有所不同(從200x200到50x50)。它們顯示的圖像(從png文件加載)以儘可能高的分辨率(200x200)存儲在資源中,但通常以較低的分辨率顯示。使用iPhone上的UIImageView縮放圖像

目前我只加載與圖像的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上的額外像素?顯然,我不能按照我的觀點來看。

回答

4

避免過早優化。

如果你的應用運行良好,它運行良好。如果沒有,請嘗試優化它。

從我的經驗使用200px的圖像,50px圖像會做的很好。圖像可以很容易地加載到圖形硬件,並且擴展很可能在硬件中完成。

如果性能分析告訴我,我只會預分級圖像。

對於問題的第二部分,您必須注意實際縮放代碼,即CoreGraphics對視網膜顯示器一無所知。因此,在CGBitmapContext中,點的一個像素,除非您另有說明。在你的代碼片段中,你忽略了創建位圖上下文的那一行,但它很可能是UIGraphicsBeginImageContext(CGSize size)。請看看並使用UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale);。通常以0.0來衡量。

UIKit Functions: UIGraphicsBeginImageContextWithOptions

+0

UIGraphicsBeginImageContextWithOptions的伎倆完美,謝謝!你對過早優化的觀點很好,我不得不考慮一下。 – zpasternack 2010-08-13 17:53:02