iOS — рисование на изображении — применить маску

У меня есть одно изображение, где пользователи могут закрашивать его. Для рисования я использую что-то вроде:

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
    if (touches.count == 1) {
        let touch = touches.first as! UITouch
        if (touch.tapCount == 1) {
            let touch = touches.first as! UITouch
            let currentPoint = touch.locationInView(self)
            UIGraphicsBeginImageContextWithOptions(self.frame.size, false, self.scale)
            self.image?.drawInRect(CGRectMake(0, 0, self.frame.size.width, self.frame.size.height))
            CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound)
            CGContextSetLineWidth(UIGraphicsGetCurrentContext(), self.width);
            CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), UIColor.whiteColor().colorWithAlphaComponent(1.0).CGColor);
            CGContextBeginPath(UIGraphicsGetCurrentContext());

            CGContextMoveToPoint(UIGraphicsGetCurrentContext(), startPoint.x, startPoint.y);
            CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y)

            CGContextStrokePath(UIGraphicsGetCurrentContext());
            self.image = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
        }
    }
}

В результате получается белая линия над исходным изображением.

Затем на следующем экране я хочу показать только нарисованную линию, но в прозрачном цвете, чтобы можно было показать исходное изображение. Я пытаюсь применить маски, но белая линия не совсем прозрачна.

func mergeImages(image: UIImage) {
    let maskImage = UIImage(named: "03-tobacco.png")
    let maskRef = maskImage?.CGImage;

    let mask = CGImageMaskCreate(
        CGImageGetWidth(maskRef),
        CGImageGetHeight(maskRef),
        CGImageGetBitsPerComponent(maskRef),
        CGImageGetBitsPerPixel(maskRef),
        CGImageGetBytesPerRow(maskRef),
        CGImageGetDataProvider(maskRef),
        nil,
        false)
    let masked = CGImageCreateWithMask(image.CGImage, mask)
    let maskedImage = UIImage(CGImage: masked)!
    self.signatureImage.image = maskedImage
}

Как я могу этого добиться?


person nano    schedule 14.08.2015    source источник


Ответы (3)


Вместо применения масок я решил это так:

UIGraphicsBeginImageContextWithOptions(size, false, 0.0)

let areaSize = CGRect(x: 0, y: 0, width: size.width, height: size.height)
image.drawInRect(areaSize
    maskImage!.drawInRect(areaSize, blendMode: kCGBlendModeSourceIn, alpha: 1.0)        
var newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()

Сначала я рисую линию, а затем применяю «фоновое» изображение, используя режим наложения kCGBlendModeSourceIn, чтобы он закрашивал только эту линию.

Надеюсь, это поможет другим!

person nano    schedule 17.08.2015

вы используете не белую линию в качестве маски, а 03-tobacco.png

если вы хотите, чтобы белая линия маскировалась, вам нужно изменить maskImage и self.image

person Daij-Djan    schedule 14.08.2015
comment
В этом случае у меня будет исходное изображение (прямоугольник) без линии (прозрачное), и я хочу только форму линии с исходным изображением. - person nano; 14.08.2015
comment
тогда я не понял :) извините - person Daij-Djan; 14.08.2015

Чтобы избежать неудобств, попробуйте настроить подкласс UIView выше UIImageView. Установите его цвет фона, чтобы очистить. И дроу внутри подкласса UIView - вот и все.

person Roman Mykitchak    schedule 02.08.2018