UIImage 不同於 UIImageView 有 frame 這個屬性,所以無法透過此屬性來設定新的影像大小,這類的問題通常發生在要對圖片做影像處理或是背景顏色材質等,這些不支援於 UIImageView 的方法上,我們只能透重繪的方式來重新調整大小,並製作一個新的 UIImage 物件來符合新的大小設定。
//原始影像
UIImage *image =[UIImage imageNamed:@"Original.png"];
//製作一個ImageContext並符合新的大小設定
UIGraphicsBeginImageContext(CGSizeMake(200, 200));
//將原始影像重繪在此範圍中
[image drawInRect:CGRectMake(0, 0, 200, 200)];
//以目前的ImageContext來製作新的UIImage
UIImage *resizeImage =UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
在上述程式碼中,我們將圖片重新設定至 200x200 的大小,並且不包含任何空白邊界,影像重繪的位置從座標 (0,0) 至 (200,200) 剛好填滿整個 ImageContext,另外在重繪的過程中還必須特別注意圖片解析度與長寬比例的問題,避免失真的可能。
UIImage 它無法單獨存在,必須透過 UIImageView 來做顯示,如果只是單純地想要放大縮小影像,其實並不需要重繪這麼麻煩,只需要改變 UIImageView 的 frame 屬性即可,但是這樣透過改變 UIImageView.frame 所呈現的影像大小,只是假象,它無法代表真正的影像大小,這點你可以從示範上的兩張圖片裡看出些端倪,如果想要取得影像的原始大小,可以透過下列的兩個方式來實現。
//透過size屬性
CGFloat w, h;
w = image.size.width;
h = image.size.height;
//在CGImageRef型態下取得大小
CGFloat w, h;
CGImageRef imageRef = image.CGImage;
w = CGImageGetHeight(imageRef);
h = CGImageGetWidth(imageRef);
上述兩種方式皆可以取得影像的原始大小,第一種方法也是大家最熟悉的方式,透過 size 屬性來取得影像的長寬,而另一種方式是當影像的形態為 CGImageRef 時可以採用的方式,同樣也可以取得原始的影像大小,透過這些方法所取得數值,即使在不同大小的 UIImageView 下,也都會有一樣的結果。
沒有留言:
張貼留言