Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone Objective-C如何避免在同一彩色图像上绘制具有UIBezierPath笔画颜色的图像_Iphone_Objective C_Uibezierpath - Fatal编程技术网

Iphone Objective-C如何避免在同一彩色图像上绘制具有UIBezierPath笔画颜色的图像

Iphone Objective-C如何避免在同一彩色图像上绘制具有UIBezierPath笔画颜色的图像,iphone,objective-c,uibezierpath,Iphone,Objective C,Uibezierpath,我们正在使用UIBezierPath开发一个绘画应用程序 我们使用贝塞尔路径绘制笔划 使用蓝色RGB值和0.5 Alpha表示透明笔划 使用路径数组。。我们几乎完成了申请 但是从PathsArray绘制笔划时存在一些性能问题,PathsArray已经绘制了Bezier路径,例如绘制了一定数量的笔划后,绘制笔划速度变慢 因此为了避免这个性能问题,我们在sketchImage视图后面使用了一个临时图像视图, 我们在顶部草图图像视图上绘制了最近的一笔,并使用PathsArray更新了底部临时图像视图

我们正在使用
UIBezierPath
开发一个绘画应用程序

我们使用贝塞尔路径绘制笔划

使用蓝色RGB值和0.5 Alpha表示透明笔划

使用路径数组。。我们几乎完成了申请

但是从PathsArray绘制笔划时存在一些性能问题,PathsArray已经绘制了Bezier路径,例如绘制了一定数量的笔划后,绘制笔划速度变慢

因此为了避免这个性能问题,我们在sketchImage视图后面使用了一个临时图像视图,

我们在顶部草图图像视图上绘制了最近的一笔,并使用PathsArray更新了底部临时图像视图

它工作正常,提高了性能,但存在一个问题

由于所有笔划都保存为图像,我们尝试绘制另一幅图像,笔划会加倍,并增加重叠点的不透明度

实际上如果我们只使用bezierPAths数组使用
kCGBlendModeCopy

但由于我们将笔划更新为图像,因此无法使用
kCGBlendModeCopy

那么,有没有办法避免在同一油漆上划伤呢

- (UIImage*)addImage:(UIImage *)image secondImage:(UIImage *)image2
{
    UIGraphicsBeginImageContext(image.size);
    [image drawInRect:CGRectMake(0,0,image.size.width,image.size.height)];

    [image2 drawInRect:CGRectMake(0,0,image.size.width,image.size.height) blendMode:kCGBlendModeXOR alpha:1.0];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}

添加两个UIImage使用上述代码。在
blendMode
中使用
kcblendmodexor


添加两个UIImage使用上述代码。在
blendMode
中,使用
kCGBlendModeXOR

您可以通过两个图像视图实现所需效果,其中一个是横向照片,另一个是我们将要绘制的图像视图。但是,与其使用0.5的
alpha
绘制,不如使用1.0的
alpha
绘制
UIBezierPath
,但要在自己的
alpha
为0.5的图像视图上进行绘制

- (void)handlePan:(UIPanGestureRecognizer *)gesture
{
    static UIBezierPath *bezierPath = nil;
    static CAShapeLayer *shapeLayer = nil;

    if (gesture.state == UIGestureRecognizerStateBegan) {
        bezierPath = [UIBezierPath bezierPath];
        [bezierPath moveToPoint:[gesture locationInView:gesture.view]];
        shapeLayer = [CAShapeLayer layer];
        shapeLayer.strokeColor = [[UIColor blueColor] CGColor];
        shapeLayer.lineWidth = 40.0;
        shapeLayer.fillColor = [[UIColor clearColor] CGColor];
        shapeLayer.lineCap = kCALineCapRound;
        shapeLayer.lineJoin = kCALineJoinRound;
        [self.drawImageView.layer addSublayer:shapeLayer];
    } else if (gesture.state == UIGestureRecognizerStateChanged) {
        [bezierPath addLineToPoint:[gesture locationInView:gesture.view]];
        shapeLayer.path = [bezierPath CGPath];
    } else if (gesture.state == UIGestureRecognizerStateEnded) {
        CGFloat saveAlpha = self.drawImageView.alpha;  // save current alpha for future reference
        self.drawImageView.alpha = 1.0;                // bring alpha back to 1.0 for the purposes of saving image

        // grab image

        UIGraphicsBeginImageContextWithOptions(self.drawImageView.bounds.size, NO, 0);
        if ([self.drawImageView respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])
            [self.drawImageView drawViewHierarchyInRect:self.drawImageView.bounds afterScreenUpdates:YES]; // iOS7+
        else
            [self.drawImageView.layer renderInContext:UIGraphicsGetCurrentContext()]; // pre iOS7
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        self.drawImageView.image = image;             // use new image
        self.drawImageView.alpha = saveAlpha;         // reduce alpha back to what it was

        [shapeLayer removeFromSuperlayer];            // get rid of shape layer
        shapeLayer = nil;
        bezierPath = nil;
    }
}


你可以通过两个图像视图来达到想要的效果,一个是风景照片,另一个是我们要绘制的图像视图。但是,与其使用0.5的
alpha
绘制,不如使用1.0的
alpha
绘制
UIBezierPath
,但要在自己的
alpha
为0.5的图像视图上进行绘制

- (void)handlePan:(UIPanGestureRecognizer *)gesture
{
    static UIBezierPath *bezierPath = nil;
    static CAShapeLayer *shapeLayer = nil;

    if (gesture.state == UIGestureRecognizerStateBegan) {
        bezierPath = [UIBezierPath bezierPath];
        [bezierPath moveToPoint:[gesture locationInView:gesture.view]];
        shapeLayer = [CAShapeLayer layer];
        shapeLayer.strokeColor = [[UIColor blueColor] CGColor];
        shapeLayer.lineWidth = 40.0;
        shapeLayer.fillColor = [[UIColor clearColor] CGColor];
        shapeLayer.lineCap = kCALineCapRound;
        shapeLayer.lineJoin = kCALineJoinRound;
        [self.drawImageView.layer addSublayer:shapeLayer];
    } else if (gesture.state == UIGestureRecognizerStateChanged) {
        [bezierPath addLineToPoint:[gesture locationInView:gesture.view]];
        shapeLayer.path = [bezierPath CGPath];
    } else if (gesture.state == UIGestureRecognizerStateEnded) {
        CGFloat saveAlpha = self.drawImageView.alpha;  // save current alpha for future reference
        self.drawImageView.alpha = 1.0;                // bring alpha back to 1.0 for the purposes of saving image

        // grab image

        UIGraphicsBeginImageContextWithOptions(self.drawImageView.bounds.size, NO, 0);
        if ([self.drawImageView respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])
            [self.drawImageView drawViewHierarchyInRect:self.drawImageView.bounds afterScreenUpdates:YES]; // iOS7+
        else
            [self.drawImageView.layer renderInContext:UIGraphicsGetCurrentContext()]; // pre iOS7
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        self.drawImageView.image = image;             // use new image
        self.drawImageView.alpha = saveAlpha;         // reduce alpha back to what it was

        [shapeLayer removeFromSuperlayer];            // get rid of shape layer
        shapeLayer = nil;
        bezierPath = nil;
    }
}


这对我来说是可行的,但当我在相册中保存相同的图像时,它将不起作用。请给我建议!!请给我一些建议这对我来说很有用,但当我在相册中保存相同的图像时,它将不起作用。请给我一些建议!!请给我一些建议