2016-10-05 128 views
0

我有一個背景UIImage,我想用自定義形狀裁剪背景UIImage,所以這個背景圖像只通過自定義形狀「出現」。例如,我有一個月亮形的自定義形狀,我希望背景圖像只能通過月亮形狀的部分。通過自定義形狀裁剪UIImage

基於另一種答案,我試圖強加掩模圖像上,像這樣:

- (UIImage *)createImageFromImage:(UIImage *)image 
        withMaskImage:(UIImage *)mask { 
    CGImageRef imageRef = image.CGImage; 
    CGImageRef maskRef = mask.CGImage; 

    CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
              CGImageGetHeight(maskRef), 
              CGImageGetBitsPerComponent(maskRef), 
              CGImageGetBitsPerPixel(maskRef), 
              CGImageGetBytesPerRow(maskRef), 
              CGImageGetDataProvider(maskRef), 
              NULL, 
              YES); 

    CGImageRef maskedReference = CGImageCreateWithMask(imageRef, imageMask); 
    CGImageRelease(imageMask); 

    UIImage *maskedImage = [UIImage imageWithCGImage:maskedReference]; 
    CGImageRelease(maskedReference); 

    return maskedImage; 
} 

然而,這樣的結果看起來像enter image description here,並有幾個問題吧:

  1. 我的月亮是100 * 100,這已拉伸做一個奇怪的比例
  2. 我的目標是隻有圖像來通過月球 - 但是,此刻月亮是一個白色的形狀,圖像

任何關於如何解決作物問題的想法將不勝感激。謝謝!

+0

您可以將此庫用於任何自定義形狀。只需繪製您的路徑,即可獲得裁剪後的圖像。 https://www.cocoacontrols.com/controls/mdimagecroper –

回答

2

在您的背景圖片上,您必須通過CALayer添加自定義遮罩。 請記住,您在mask.png(月亮)中的所有顏色都將可見,所有透明都不會顯示。

UIImage *moonImage = [UIImage imageNamed:@"mask.png"]; 
CALayer *maskLayer = [CALayer layer]; 
[maskLayer setContents:(id)moonImage.CGImage]; 
[maskLayer setFrame:CGRectMake(0.0f, 0.0f, moonImage.size.width, moonImage.size.height)]; 

UIImageView *yourBackgroundImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)]; 
// Keep your image view in tact here, just add: 
[yourBackgroundImageView.layer setMask:maskLayer]; 
+0

這很好,實現了我所需要的結果。謝謝! – daspianist

+0

@daspianist我需要確切的行爲。我應該在哪裏寫上面的代碼? – Dalvik