1. 程式人生 > >UIImage縮放,解決模糊失真問題

UIImage縮放,解決模糊失真問題

原文連結  http://www.cocoachina.com/bbs/read.php?tid=144770

最近工作中,遇到一個需求,需要把一個UIView物件轉成UIImage物件顯示。經過網路搜尋,找到如下答案:

1 2 3 4 5 6 7 8 -(UIImage*)convertViewToImage:(UIView*)v{ CGSize s = v.bounds.size; UIGraphicsBeginImageContext(s); [v.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage*image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext(); returnimage; }

執行後發現,需求基本達到,但是有個問題,轉換後的UIImage顯示後會變模糊。因此猜測,這個方法適用於iPhone4之前的機型。iPhone4後,由於採用了Retain高清屏,在轉換時需要根據螢幕密度做個處理,又到到下面的答案:
1 2 3 4 5 6 7 8 -(UIImage*)convertViewToImage:(UIView*)v{ CGSize s = v.bounds.size; UIGraphicsBeginImageContextWithOptions(s,NO, v.layer.contentsScale);
[v.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage*image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); returnimage; }

執行後,問題依舊。於是跟蹤了一下contentsScale的值,發現也是1.0。這裡我也不太清楚原因,本來是執行在Retain屏的裝置上,為什麼不是2.0。
只好自己修改成下面的樣子:
1 2 3 4 5 6 7 8 9 -(UIImage*)convertViewToImage:(UIView*)v{
CGSize s = v.bounds.size; // 下面方法,第一個引數表示區域大小。第二個引數表示是否是非透明的。如果需要顯示半透明效果,需要傳NO,否則傳YES。第三個引數就是螢幕密度了 UIGraphicsBeginImageContextWithOptions(s,NO, [UIScreen mainScreen].scale); [v.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage*image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); returnimage; }