2016-10-05 2 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

관련 문제