en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

8.08.2012

重新調整 UIImage 大小的方法

 

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 下,也都會有一樣的結果。






沒有留言:

張貼留言