【iPhone App開發】How to clip a UIImage?

首先你必須要準備一個原圖,和一個要當作遮照(Mask)的黑白圖檔(不可有透明度)。(以下圖檔均為120×120 pixels)

Mask圖片中,越黑的部份會越不透明,越白的部份會越透明。

接著用以下的utils function程式碼來做裁切(Clip)圖片的效果

// mask the original image and return a new UIImage object
+ (UIImage*) maskImage:(UIImage*)image withMask:(UIImage*)mask {
	CGImageRef imgRef = [image CGImage];
	CGImageRef maskRef = [mask CGImage];
	CGImageRef actualMask = CGImageMaskCreate(CGImageGetWidth(maskRef),
											  CGImageGetHeight(maskRef),
											  CGImageGetBitsPerComponent(maskRef),
											  CGImageGetBitsPerPixel(maskRef),
											  CGImageGetBytesPerRow(maskRef),
											  CGImageGetDataProvider(maskRef), NULL, false);
	CGImageRef masked = CGImageCreateWithMask(imgRef, actualMask);
	return [UIImage imageWithCGImage:masked];
}

你的code:

// 將原始圖片縮成120x120,這一步視原始圖片大小而定,不一定要做
UIImage *newImg = [Utils resizeImage:orgImg size:CGSizeMake(120, 120)];
UIImage *maskImg = [UIImage imageNamed:@"mask.png"]; // 取得mask的圖片物件
newImg = [ImageUtils maskImage:newImg withMask:maskImg]; // 開始做裁切(Clip)圖片

這樣就完成了…簡單吧? (廢話!! 我都已經幫你找到mask image需要用到的code了 ~”~,當初我也是花了幾個小時搜尋才找到的…)

如果圖片需要做Resize,可以用以下utils function來完成

// resize the original image and return a new UIImage object
+ (UIImage *) resizeImage:(UIImage *)image size:(CGSize)newSize {
    UIGraphicsBeginImageContext(newSize);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

執行結果:

註: 圖檔都必須是png檔(24bit),其它檔案類型我沒試過不知道。據原討論串網友的說法似乎是不行。

參考來源討論串: http://iphonedevelopertips.com/cocoa/how-to-mask-an-image.html

Good Luck! :)

Tags: , , ,

Leave a Reply