UIImage縮放,解決模糊失真問題
阿新 • • 發佈:2019-02-15
原文連結 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();
return image;
}
|
執行後發現,需求基本達到,但是有個問題,轉換後的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();
return image;
}
|
執行後,問題依舊。於是跟蹤了一下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();
return image;
}
|