2017-03-24 1 views
2

내가하려는 것은 정사각형 이미지 뷰를 사용하여 3 포인트 삼각형 모양의 3 점 삼각형 모양의 꼭지점과 하단 점을 만듭니다. 기초.이미지 모양을 도형으로 변환하고 확대하는 방법 (swift3)

enter image description here

public func shapeImage(with bezierPath: UIBezierPath, size: CGSize, fillColor: UIColor? = UIColor.clear, 
         strokeColor: UIColor? = nil, strokeWidth: CGFloat = 0.0) -> UIImage! { 

UIGraphicsBeginImageContext(size) 
let context = UIGraphicsGetCurrentContext() 
var image = UIImage(data: try! Data(contentsOf: URL(string:"https://a248.e.akamai.net/secure.meetupstatic.com/photos/member/5/3/5/e/highres_260901342.jpeg")!))! 

if let context = context { 
    context.saveGState() 
    context.addPath(bezierPath.cgPath) 

    if let strokeColor = strokeColor { 
     strokeColor.setStroke() 
     context.setLineWidth(strokeWidth) 
    } else { 
     UIColor.clear.setStroke() 
    } 

    fillColor?.setFill() 
    context.drawPath(using: .fillStroke) 

    image = UIGraphicsGetImageFromCurrentImageContext()! 
    context.restoreGState() 
    UIGraphicsEndImageContext() 
} 
return image 

}

나는 정상을하고 더 큰하고 아래쪽에 동일한 크기를 유지하려는. 원본 이미지의 일부분을 가면이나 자르고 싶지 않습니다. 스트레칭을하고 마스킹하지 않고 이미지를 더 크게 만들고 싶습니다. 이 사이트에서이 작업을 수행하는 방법이나 사용 가능 여부를 설명하는 항목을 본 적이 없습니다.

+0

"녹색"부분이 이미지라고 가정하고 그렇지 않은 경우에도 일종의 마스킹 없이는 가능하지 않을 수 있습니다. 4 점 사변형에서 5 점 육면체 (sic?)로 이동하면 거의 마스킹 또는 자르기가 포함되어야합니다. 당신이하려는 일에 더 많은 세부 사항을 추가 할 수있는 기회가 있습니까? 지금 당장은 CIPerspectiveCorrection을 사용하는 것이 가장 좋습니다.하지만 4 포인트 사변형을 사용합니다. (세부 사항에서 도형을 다이빙해야 할 수도 있습니다.) 마스킹이 사용되는 경우 – dfd

+0

은 상관하지 않습니다. 나는 단지 이미지의 어떤 부분을 잘라 내고 싶지 않다. –

+0

생각을 끝내면 원근감 교정이 도움이되지 않습니다. 단일 점을 드래그하여 이미지를 "늘리는"방법이 필요합니다. 확신 할 수 있겠지만, 픽셀 수준에서 GLSL (OpenGL Scripting Language)이 필요할 수도 있습니다. 나는 그것을 코딩하지만 그 특별한 것은하지 않습니다. 만약 당신이 그것을 알고 있다면, 아마도 "왜곡"을위한 주변 픽셀을 알아야하기 때문에 CI 워프 커널이라고 불리는 것을 필요로 할 것입니다. 내가 더 많은 것을 도울 수 있기를 바란다. (그리고 나에게 앱 아이디어를 주었다)! 다른 사람들이 나보다 훨씬 더 나은 대답을 원하기를 바랍니다. – dfd

답변

0

당신은

https://www.innofied.com/implementing-image-masking-in-ios/

이 어떤 문제가 내가 .. 지금은 도움이 당신이나 내 최선의 노력 not..i 보여,

예를 그 코드를 제공하지만 때 참조 할 수 있습니다 :

import UIKit 

class ViewController: UIViewController { 


    @IBOutlet weak var imageView: UIImageView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     let image = UIImage(named: "image.gif") 
     let maskingImage = UIImage(named: "mask-image.gif") 
     imageView.image = maskImage(image: image!, mask: maskingImage!) 
    } 

     func maskImage(image:UIImage, mask:(UIImage))->UIImage{ 

     let imageReference = image.cgImage 
     let maskReference = mask.cgImage 

     let imageMask = CGImage(maskWidth: maskReference!.width, 
           height: maskReference!.height, 
           bitsPerComponent: maskReference!.bitsPerComponent, 
           bitsPerPixel: maskReference!.bitsPerPixel, 
           bytesPerRow: maskReference!.bytesPerRow, 
           provider: maskReference!.dataProvider!, decode: nil, shouldInterpolate: true) 

     let maskedReference = imageReference!.masking(imageMask!) 

     let maskedImage = UIImage(cgImage:maskedReference!) 

     return maskedImage 
    } 
} 
2

마스크로 자르지 않으려면 매우 이상한 왜곡 된 이미지가 있어야합니다. 만약 당신이 정말로 당신이 원하는 것을 확신한다면 https://github.com/Ciechan/BCMeshTransformView을 먼저 사용하여 모든 점들을 아래로 움직여 움직 이도록 움직여 중심점 만 움직이게하십시오. 뭔가 같은 :

BCMeshVertex vertices[] = { 
    {.from = {0.0, 0.0}, .to= {0.0, 0.5, 0.0}}, 
    {.from = {1.0, 0.0}, .to= {1.0, 0.5, 0.0}}, 
    {.from = {1.0, 1.0}, .to= {1.0, 1.0, 0.0}}, 
    {.from = {0.0, 1.0}, .to= {0.0, 1.0, 0.0}}, 
}; 

와 당신이 벡터를 업데이트 집으로 바꿀하고자 할 때 다음 :

BCMeshVertex vertices[] = { 
    {.from = {0.0, 0.0}, .to= {0.0, 0.5, 0.0}}, 
    {.from = {0.5, 0.0}, .to= {0.0, 0.0, 0.0}}, 
    {.from = {1.0, 0.0}, .to= {1.0, 0.5, 0.0}}, 
    {.from = {1.0, 1.0}, .to= {1.0, 1.0, 0.0}}, 
    {.from = {0.0, 1.0}, .to= {0.0, 1.0, 0.0}}, 
}; 

이는 것 Warp \ bend effect on a UIView? 같은 이상한 메쉬, 워프 효과 - 꽤 확신 아주 아주 못 생겼어. 그러나 그것이 당신이 요구 한 것입니다. (CAShapeLayer를 사용하여 이미지를 마스킹하는 훨씬 간단한 솔루션이 있습니다.)

+0

어떻게이 함수를 호출할까요? –

+0

https : //github.com/Ciechan/BCMeshTransformView에서 문서를 읽어보십시오. 그런 다음 블로그 게시물을 읽으십시오. 그런 다음 그것을 시험해보고 그걸 가지고 놀아 라. –

0

정말 새로운 BezierPath에 또 하나의 지점을 생성하고 동일한하고 fillColor으로 새로운 이미지를 그리는 문제가 표시되지 않는 등 뇌졸중 .. 당신은 ... 이와 같은 확장을 사용할 수

public class func shapeImage(with bezierPath: UIBezierPath, size: CGSize, fillColor: UIColor? = UIColor.clear, 
          strokeColor: UIColor? = nil, strokeWidth: CGFloat = 0.0) -> UIImage! { 

    UIGraphicsBeginImageContext(size) 
    let context = UIGraphicsGetCurrentContext() 
    var image = UIImage() 
    if let context = context { 
     context.saveGState() 
     context.addPath(bezierPath.cgPath) 

     if let strokeColor = strokeColor { 
      strokeColor.setStroke() 
      context.setLineWidth(strokeWidth) 
     } else { 
      UIColor.clear.setStroke() 
     } 

     fillColor?.setFill() 
     context.drawPath(using: .fillStroke) 

     image = UIGraphicsGetImageFromCurrentImageContext()! 
     context.restoreGState() 
     UIGraphicsEndImageContext() 
    } 
    return image 
} 
+0

나는 당신이 제안한 질문을 편집했고 아무 것도하지 않습니다. 나는 그 함수를 호출하는 방법을 모른다. –

+0

나에겐 사용자 위치의 이미지 또는 베 지어 경로로 그려지는 모양에서 스트레치를 얻고 싶다면 여전히 명확하지 않습니까?! – John

+0

맞춤 위치에서 이미지를 스트레치하고 싶습니다. –

관련 문제