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;
}
}
这对我来说是可行的,但当我在相册中保存相同的图像时,它将不起作用。请给我建议!!请给我一些建议这对我来说很有用,但当我在相册中保存相同的图像时,它将不起作用。请给我一些建议!!请给我一些建议