iOS CoreGraphics: поглаживание с полупрозрачными узорами приводит к искажению цветов - PullRequest
8 голосов
/ 09 июня 2011

Моя задача - создать что-то вроде инструмента стирания (работающего с пальцем), который будет отображать фоновое изображение вместо стертого.

Вот мои исходные и конечные изображения (только для проверки, настоящиебудут отличаться):

image1 http://img232.imageshack.us/img232/6030/29572847.png

А вот и мой код.Создание шаблона:

- (void)setFrame:(CGRect)frame {
   [super setFrame:frame];
   if(revealPattern) CGPatternRelease(revealPattern);
   CGPatternCallbacks callbacks = { 0, &patternCallback, NULL};
   revealPattern = CGPatternCreate(self, self.bounds, CGAffineTransformIdentity, self.bounds.size.width, self.bounds.size.height, kCGPatternTilingConstantSpacing, true, &callbacks);   
}

Функция обратного вызова шаблона (** info * содержит указатель на self ):

void patternCallback(void *info, CGContextRef context) {
   CGRect rect = ((DrawView *)info).bounds;
   CGImageRef imageRef = ((DrawView *)info).backgroundImage.CGImage;
   CGContextTranslateCTM(context, 0, rect.size.height);
   CGContextScaleCTM(context, 1.0, -1.0);
   CGContextDrawImage(context, rect, imageRef);
}

И метод рисования:

- (void)drawPoints:(CGContextRef)context{
   if([points count] < 2) return;
   CGPoint lastPoint = [[points objectAtIndex: 0] CGPointValue];
   CGContextBeginPath(context);
   CGContextMoveToPoint(context, lastPoint.x, lastPoint.y);

   CGContextSetBlendMode(context, kCGBlendModeNormal);
   CGColorSpaceRef revealPatternSpace = CGColorSpaceCreatePattern(NULL);        
   CGContextSetStrokeColorSpace(context, revealPatternSpace);
   CGFloat revealAlpha = 1.0;
   CGContextSetStrokePattern(context, revealPattern, &revealAlpha);
   CGContextSetAlpha(context, 0.1);
   CGColorSpaceRelease(revealPatternSpace);

   CGContextSetLineCap(context, kCGLineCapRound);
   CGContextSetLineJoin(context, kCGLineJoinRound);
   CGContextSetLineWidth(context, self.lineWidth);
   for(int i = 1; i < [points count]; i++){
       CGPoint currPoint = [[points objectAtIndex: i] CGPointValue];
       CGContextAddLineToPoint(context, currPoint.x, currPoint.y);
       lastPoint = currPoint;
   }
   CGContextStrokePath(context);
}

Если локальная переменная showAlpha имеет значение 1.0 (как показано в последнем фрагменте кода), все работает нормально.Но мне нужно, чтобы стирание было полупрозрачным (чтобы пользователю нужно было несколько раз провести пальцем по одному и тому же месту, чтобы полностью стереть его).И тут возникает проблема.Если я сделаю показывает, что Альфа меньше, чем 1,0 , обнаруженное целевое изображение выглядит испорченным.и showAlpha == 0,1 :

image2 http://img593.imageshack.us/img593/1809/69373874.png

Если вы посмотрите достаточно близко, вы заметите, что синий градиент на правом изображении не плавныйбольше.

1 Ответ

0 голосов
/ 03 мая 2012

Я согласен с другим постером.Не похоже, что ваше изображение повреждено.Скорее похоже, что вы оставляете вид спереди частично видимым.В качестве теста, попробуйте изменить выявить альфа на .5.Таким образом, одним прикосновением пальца будет установлена ​​непрозрачность на переднем слое на 50%, а вторым проведением будет установлено значение 0%.Будет легче сказать, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...