임의의 형식으로 그림의 견본을 절취하다

6656 단어 SwiftCGPath
12/24 제목과github 링크 수정
유럽과

모든 소스를 github 위에 놓았다.
ClipSample
단계
탄젠트를 긋다.
디스플레이상의 절취선과 실제 이미지용 절취선을 별도로 준비해 이를 바탕으로 마스크 이미지를 제작한다.
마스크 이미지와 실제 이미지를 작성합니다.
커팅선을 둘러싼 사각형 커팅으로 이미지를 합성하여 다른 이미지addsubView로 만듭니다.
캡처된 느낌을 표현하기 위해 원 이미지의 캡처선 내부를 회색으로 변경합니다.
다른 이미지가 포착되면 떠나기 전에 자유롭게 이동할 수 있습니다.단지 한 번뿐이다.
이런 느낌이야.
잘라낸 선은 CGPath에 그려집니다.CALayer를 추가하고 그 속성의 path에 설정하여 선을 나타낼 수 있습니다.
    override func viewDidLoad() {
        super.viewDidLoad()

        clipLayer = CAShapeLayer()
        clipLayer.frame = self.view.frame
        clipLayer.backgroundColor = UIColor.clearColor().CGColor
        clipLayer.name = "clipLayer"
        clipLayer.strokeColor = UIColor.blueColor().CGColor
        clipLayer.fillColor = UIColor.clearColor().CGColor
        clipLayer.lineWidth = 3.0
        clipLayer.lineDashPattern = [2,3]

        self.view.layer.addSublayer(clipLayer)

        isClipView = false

    }

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
        super.touchesMoved(touches, withEvent: event)


                CGPathAddLineToPoint(path, nil, location.x, location.y)

                let convertLocation = convertPointFromView(location)
                CGPathAddLineToPoint(convertPath, nil, convertLocation.x, convertLocation.y)


                clipLayer.path = path
                }

화면에 있는 그림과 실제 그림의 크기가 다르기 때문에 실제 그림에 사용할 path를 미리 추가합니다.
               let convertLocation = convertPointFromView(location)
               CGPathAddLineToPoint(convertPath, nil, convertLocation.x, convertLocation.y)

표시된 View 좌표를 실제 이미지의 좌표로 변환하려면 다음 소스를 참조하십시오.이 소스는 MIT 라이선스이기 때문에 이번 소스도 MIT 라이선스입니다.만약 방법이 틀렸다면 떳떳하지 못할 것이다.
UIImageView-GeometryConversion
터치Endd가 호출된 path의 그림을 토대로 path 안쪽에 검은색을 만들고 그 외에 흰색 마스크용 그림을 만든다
    func createMaskImage() -> UIImage{

        UIGraphicsBeginImageContextWithOptions(imageView.image!.size, false, 0)
        let context = UIGraphicsGetCurrentContext()
        CGContextSaveGState(context)

        CGContextSetFillColorWithColor(context, UIColor.whiteColor().CGColor)
        CGContextFillRect(context, CGRectMake(0, 0, imageView.image!.size.width, imageView.image!.size.height))
        CGContextAddPath(context, convertPath)
        CGContextSetFillColorWithColor(context, UIColor.blackColor().CGColor)
        CGContextDrawPath(context, CGPathDrawingMode.Fill)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        CGContextRestoreGState(context)
        UIGraphicsEndImageContext()

        return image
    }

이를 토대로 CGImage를 제작해 마스크 적용 이미지를 제작한다. 
                let maskImage = createMaskImage()
                let m : CGImageRef = maskImage.CGImage!
                let mask = CGImageMaskCreate(CGImageGetWidth(m),
                    CGImageGetHeight(m),
                    CGImageGetBitsPerComponent(m),
                    CGImageGetBitsPerPixel(m),
                    CGImageGetBytesPerRow(m),
                    CGImageGetDataProvider(m),
                    nil,
                    false)
주의해야 할 것은 원래 이미지의 CGImage를 제작할 때 이미지의 방향이 달라진다는 것이다.
이 경우 현재 이미지가 아닌 CGContext를 사용하여 현재 이미지를 다시 그립니다.
    //写真の向きがおかしくなるので、作り直す
    func reDrawImage(img: UIImage) -> UIImage{

        let motoImage = img

        UIGraphicsBeginImageContextWithOptions((motoImage.size), false, 0)
        let context = UIGraphicsGetCurrentContext()
        CGContextSaveGState(context)

        motoImage.drawInRect(CGRectMake(0, 0, (motoImage.size.width), (motoImage.size.height)))

        let reImage = UIGraphicsGetImageFromCurrentImageContext()
        CGContextRestoreGState(context)
        UIGraphicsEndImageContext()

        return reImage
    }

그런 다음 그것에 따라 마스크 이미지를 만듭니다.자른 그림을 다시 추출하기 위해 최소한의 사각형의 그림을 만들다.
                //CGImageにしたら向きが変わることがあるのでimageを作り直す
                let motoImage : UIImage = reDrawImage(imageView.image!)
                let masked : CGImageRef = CGImageCreateWithMask(motoImage.CGImage, mask)!
                let maskedImage : UIImage = UIImage(CGImage: masked, scale: 1.0, orientation: UIImageOrientation.Up)

                //切り取った画像を囲める画像を作成
                let s = UIScreen.mainScreen().scale
                let scale : CGRect = CGRectMake((minX-5)*s, (minY-38)*s, (maxX-minX+10)*s, (maxY-minY+5)*s)
                let convertScale = convertRectFromView(scale)

                let clipedImageRef : CGImageRef = CGImageCreateWithImageInRect(maskedImage.CGImage, convertScale)!
                let clipedImage : UIImage = UIImage(CGImage: clipedImageRef)

그런 다음 UIImageView에 추가하고 논리 변수를 True로 설정합니다.
그리고 원래 그림을 회색으로 그린 path 안쪽으로 바꿉니다
                //切り取った画像を画面上に追加
                let clipScale = CGRectMake(minX-5, (minY), (maxX-minX+10), (maxY-minY+5))
                clipImageView = UIImageView(frame:clipScale)
                clipImageView.userInteractionEnabled = true
                clipImageView.contentMode = UIViewContentMode.ScaleAspectFit
                clipImageView.clipsToBounds = true
                clipImageView.image = clipedImage
                clipImageView.layer.borderWidth = 2.0
                clipImageView.layer.borderColor = UIColor.blackColor().CGColor
                clipImageView.layer.cornerRadius = 10.0
                self.view.addSubview(clipImageView)


                isClipView = true

                clipLayer.path = nil

                //切り取られた箇所を灰色にする
                imageView.image = clipedMotoImage(imageView.image!)

논리 변수는 다음에 터치Ended를 호출할 때까지 진실하게 유지되며, 실제 시간에 커팅된 이미지를 이동할 수 있습니다.
    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
        super.touchesMoved(touches, withEvent: event)

        if let touch = touches.first {
            let location = touch.locationInView(self.view)

            if(isClipView){

                clipImageView.frame.origin.x = location.x
                clipImageView.frame.origin.y = location.y

            } else {
            //以下path追加

대략적인 설명이지만 이렇게 한 것이다.여러 장의 그림을 만들었기 때문인지 커팅선이 완성될 때부터 커팅된 그림이 완성될 때까지 느려서 뭔가를 하고 싶었다.

좋은 웹페이지 즐겨찾기