Как раскрасить изображение независимо от цвета, представленного на изображении в iphone?

Я использую следующий код для окрашивания изображения при касании. У меня есть подкласс uiview и для этого используется следующий код. Он работает, но цвет отличается в разных частях изображений. Предположим, я раскрашиваю изображение красным цветом, а есть зеленый, желтый или другие цвета, присутствующие в разных частях изображений. Затем красный цвет имеет разные эффекты в зависимости от цвета, уже присутствующего в изображении. Вместо этого я хочу, чтобы тот же красный цвет (или любой другой выбранный цвет) был заполнен во всем изображении. Как можно я этого добиваюсь?

@synthesize selImage,isReset;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) 
    {
        arrBezierPaths = [[NSMutableArray alloc] init];
        globalPath = [[UIBezierPath alloc] init];
        myPath = [[UIBezierPath alloc] init];

        self.userInteractionEnabled = TRUE;

        myPath.lineWidth = 30;
        brushPattern = [UIColor redColor];

        NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:myPath, @"Path", brushPattern, @"Color", nil];
        [arrBezierPaths addObject:dict];
    }
    return self;
}

// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    for (int i=0; i<[arrBezierPaths count]; i++)
    {
        NSDictionary *dict = [arrBezierPaths objectAtIndex:i];
        UIColor *tempBrushpatter = [[UIColor alloc] init];
        tempBrushpatter = [dict valueForKey:@"Color"];
        globalPath = [dict valueForKey:@"Path"];

        [globalPath strokeWithBlendMode:kCGBlendModeOverlay alpha:1.0];
        [tempBrushpatter setStroke];
    }
}

#pragma mark - Touch Methods

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *mytouch = [[touches allObjects] objectAtIndex:0];
    [globalPath moveToPoint:[mytouch locationInView:self]];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *mytouch = [[touches allObjects] objectAtIndex:0];
    CGPoint pointTouched = [mytouch locationInView:self];

    for (int i=0; i<[arrBezierPaths count]; i++)
    {
        UIBezierPath *tempErasePath = [[UIBezierPath alloc] init];
        NSDictionary *dictTemp = [arrBezierPaths objectAtIndex:0];
        UIBezierPath *temppath = [dictTemp valueForKey:@"Path"];
        if ([temppath containsPoint:pointTouched])
        {
            //[temppath removeAllPoints];
        }
    }

    [globalPath addLineToPoint:[mytouch locationInView:self]];

    [self setNeedsDisplay];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
}

-(void)changeColor:(UIColor *)color
{
    [arrRemovePaths removeAllObjects];
    UIBezierPath *temp = [[UIBezierPath alloc] init];

    temp.lineWidth = 30;
    UIColor *brushColor = color;
    NSLog(@"initWithFrame method called");
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:temp, @"Path", brushColor, @"Color", nil];
    [temp release];
    [arrBezierPaths addObject:dict];
    brushPattern = [color retain];
    [self setNeedsDisplay];
}

- (void)dealloc
{
    // [brushPattern release];
    [super dealloc];
}

person iosdev1111    schedule 24.04.2012    source источник


Ответы (1)


попробуйте заменить строку [globalPath strokeWithBlendMode:kCGBlendModeOverlay alpha:1.0]; на

[globalPath strokeWithBlendMode:kCGBlendModeCopy alpha:1.0];
            ;

Если вы хотите посмотреть, как работает другой режим наложения, здесь (рис. 2-1).

Режимы наложения

person Vignesh    schedule 24.04.2012
comment
когда я использую kCGBlendModeCopy и некоторые другие цветовые эффекты одинаковы для всего изображения. но изображение не видно. я хочу создать эффект, что пользователь раскрашивает изображение. я установил изображение в фоновый цвет uiview, используя colorwithpatternimage - person iosdev1111; 24.04.2012
comment
Если вы хотите это сделать, самым простым способом было бы добавить прозрачный UIview поверх UIImage и позволить пользователю рисовать. Как только он закончит рисовать, вы можете сделать снимок вида и создать из него новое изображение. - person Vignesh; 24.04.2012
comment
если я добавляю прозрачный uiview поверх uiimageview, который содержит uiimage, тогда также эффект аналогичен цвету только на прозрачном uiview.uiimage не виден - person iosdev1111; 24.04.2012