2013-11-28 1 views
1

Мы работаем над нанесением краски с использованием UIBezierPath,Objective-C Как избежать нанесения на одного цвета изображения, имеющие обводки цвет UIBezierPath

Мы делали мазки, используя путь Безье,

со значениями синего цвета RGB и 0,5 Альфа для прозрачного хода

с использованием трактов массива .. мы почти заполнить заявку,

Но есть некоторые проблемы с производительностью до drayong мазок из PathsArray, который имеющие настройки уже обращается Bezierpaths, как мазки получать медленно после нанесения некоторого количества ударов,

Так , чтобы избежать этой проблемы производительности мы использовали temperary вид изображений позади sketchImage View,

Мы нарисованный в последнее время один удар по верхнему Sketch просмотр изображения и обновленный нижний Temperary iamge вида с PathsArray,

он работает отлично и imrove производительности, но есть проблема

, что поскольку все штрихи сохраняются как изображения, и мы стараемся сделать еще одно изображение штрихи получают двойные и увеличить прозрачность в перекрывающихся точках

фактически мы можем избежать, если мы используем только bezierPAths массив используя kCGBlendModeCopy

Но так как мы обновленный инсульт как изображение его не в состоянии с kCGBlendModeCopy

Так есть ли способ избежать инсульта на той же краской

enter image description here

ответ

0
- (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; 
} 

Добавление двух UIImages использовать приведенный выше код. в сети blendMode использование kCGBlendModeXOR.

1

Вы можете добиться желаемого эффекта, имея два изображения, пейзажную фотографию в одном и, кроме того, другой вид изображения, на который мы собираемся рисовать. Но, вместо того, чтобы рисовать с alpha из 0,5, нарисуйте UIBezierPath с alpha из 1.0, но сделайте это на изображении, собственное alpha - 0.5.

enter image description here

- (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

свою работу для меня, но когда я сохранить тот же образ в фотоальбоме не будет работать ..Please дать мне предложения !! – Sapanesh

+0

Хорошо спасибо ... Позвольте мне задать вопрос – Sapanesh

+0

http://stackoverflow.com/questions/28358447/how-to-save-image-with-transpranet-stroke-objective-c – Sapanesh