2017-09-06 5 views
1

UIBezierPath에 정의 된 모양이 있습니다. 나도 UIImage가있다. 이제 UIBezierPath을 사용하여이 이미지를 잘라내려고합니다. 어떻게해야합니까?UIBezierPath - 초보자를 사용하여 이미지 자르기

let shape = UIBezierPath(rect: imageRect) 

let image = UIImage(cgimage: c) 
+0

아직도 운이 없다. 솔루션을 가진 사람이 있습니까? – Illep

+0

은 당신을 위해 Objc 코드입니다. –

+0

내 솔루션이 도움이 되었습니까? 또는 여전히 내 솔루션에 문제가 있습니까? –

답변

-1

이미지를 UIImageView에 표시하는 경우 mask 속성을 사용할 수 있습니다.

당신은 경로 밖으로있는 UIImage을해야합니다

extension UIBezierPath { 
    func asMaskImage(fillColor:UIColor = UIColor.black) -> UIImage 
    { 
     // Make a graphics context 
     UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0.0) 
     let context = UIGraphicsGetCurrentContext() 

     context!.setFillColor(fillColor.cgColor) 

     // and fill it! 
     self.fill() 

     let image = UIGraphicsGetImageFromCurrentImageContext() 

     UIGraphicsEndImageContext() 

     return image! 
    } 
} 

그럼 당신은 마스크로 사용 : 나는 Objective C 코드를 걸었습니다

myImageView.image = image 
myImageView.mask = UIImageView(image: shape.asMaskImage()) 
+0

그것은 'UIImage'타입의 값을 'UIView?'로 할당 할 수 없다 '라고 말합니다. – Illep

+0

죄송합니다 - 다른 코드를 단순화했습니다. 그것을 UIImageView에 넣어야합니다. 편집을 참조하십시오. – rjpadula

+1

하지만 그는 그것이 무엇을 요구하지 않습니다. 그는 UIImageView가 아니라 UIImage를 마스크하는 방법을 물었습니다. – matt

0

. 그러나 코드 아래

CAShapeLayer *newLayer = [[CAShapeLayer alloc] init]; 
newLayer.path = self.shape.CGPath; 


[self.view.layer setMask:newLayer]; 

CGRect rectToCrop = self.shape.bounds; 

UIGraphicsBeginImageContext(self.view.frame.size);//, NO, 0); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

[newLayer removeFromSuperlayer]; 
newLayer = nil; 

CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rectToCrop); 
UIImage *croppedImage = [UIImage imageWithCGImage:imageRef scale:self.imgVPhoto.image.scale orientation:self.imgVPhoto.image.imageOrientation]; 
CGImageRelease(imageRef); 

시도 그리고

[[NSOperationQueue mainQueue] addOperationWithBlock:^{ 

    //saving cut Image 
    NSData *imgData = UIImagePNGRepresentation(croppedImage); 

    if (imgData) { 

     NSString *imagePath = 

     if([FileUtility fileExistsAtFilePath:imagePath]) { 
      [FileUtility deleteFile:imagePath]; 
     } 

     //need to add this task in BG to avoid blocking of main thread 

     [imgData writeToFile:imagePath atomically:true]; 

    } 

}]; 

는 희망이 도움이 저장하세요 swift3

에 변환 쉽게하는

편집

SWIFT Convert

var newLayer = CAShapeLayer() 
newLayer.path = shape.cgPath 
view.layer.mask = newLayer 
var rectToCrop: CGRect = shape.bounds 
UIGraphicsBeginImageContext(view.frame.size) 
//, NO, 0); 
view.layer.render(inContext: UIGraphicsGetCurrentContext()) 
var image: UIImage? = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 
newLayer.removeFromSuperlayer() 
newLayer = nil 
var imageRef: CGImageRef? = image?.cgImage.cropping(to: rectToCrop) 
var croppedImage = UIImage(cgImage: imageRef!, scale: imgVPhoto.image.scale, orientation: imgVPhoto.image.imageOrientation) 
CGImageRelease(imageRef)