Ограничить запись цвета внутри CGPath

У меня есть закрытый путь, определенный как CGPath (фактически, CGMutablePath).

Я хочу раскрасить определенную область UIImage, определенную путем. Я возился с Core Graphics, но в настоящее время мои единственные варианты — это окрашивание прямоугольной области, определенной CGRect, а не пути.

Может кто-то указать мне верное направление?

--Обновлять

С помощью Роба мне удалось повернуть изображение, полученное с камеры, на 90 градусов, чтобы оно правильно отображалось в UIImageview.

Единственная проблема, которая у меня осталась, это то, что ПУТЬ, который мне нужно нарисовать, все еще составляет 90 градусов и выходит за пределы масштаба. Код, который я сейчас использую, выглядит следующим образом:

- (UIImage*)applyColorFillWithPath:(CGMutablePathRef) path withColor:(UIColor*)color {

CGFloat targetWidth = self.size.width;
CGFloat targetHeight = self.size.height;
CGImageRef imageRef = [self CGImage];
CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);

if (bitmapInfo == kCGImageAlphaNone) {
    bitmapInfo = kCGImageAlphaNoneSkipLast;
}

CGContextRef context;
if (self.imageOrientation == UIImageOrientationUp || self.imageOrientation == UIImageOrientationDown) {
    //UIGraphicsBeginImageContext(CGSizeMake(targetWidth, targetHeight));
    context = CGBitmapContextCreate(NULL, targetWidth, targetHeight, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);

} else {
    //UIGraphicsBeginImageContext(CGSizeMake(targetHeight, targetWidth));
    context = CGBitmapContextCreate(NULL, targetHeight, targetWidth, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);

}   

// set the fill color
//[color setFill];

if (self.imageOrientation == UIImageOrientationLeft) {
    CGContextRotateCTM(context, radians(90));
    CGContextTranslateCTM (context, 0, -targetHeight);

} else if (self.imageOrientation == UIImageOrientationRight) {
    CGContextRotateCTM (context, radians(-90));
    CGContextTranslateCTM (context, -targetWidth, 0);

} else if (self.imageOrientation == UIImageOrientationUp) {
    // NOTHING
} else if (self.imageOrientation == UIImageOrientationDown) {
    CGContextTranslateCTM (context, targetWidth, targetHeight);
    CGContextRotateCTM (context, radians(-180));
}

CGContextDrawImage(context, CGRectMake(0, 0, targetWidth, targetHeight),imageRef);

CGContextBeginPath(context);
CGContextAddPath(context, path);
CGContextSaveGState(context);
CGContextClip(context);
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextSetFillColorWithColor(context, color.CGColor);
CGContextFillRect(context, CGPathGetBoundingBox(path));
CGContextRestoreGState(context);

// Turn the bitmap context into a UIImage.
CGImageRef cgImage = CGBitmapContextCreateImage(context);
CGContextRelease(context);
UIImage *coloredImg = [UIImage imageWithCGImage:cgImage scale:1 orientation:UIImageOrientationUp];
CGImageRelease(cgImage);

//return the color-burned image
return coloredImg;
}

Следующее изображение является результатом. Красный прямоугольник — это представление CGPATH. Белый квадрат на самом деле является результатом описанного выше метода на пути.

http://i41.tinypic.com/f1zbdi.png

Я предполагаю, что мне нужно вручную повернуть CGPATH на 90 градусов, используя математику COS, а что нет.. Хотя я могу что-то контролировать..?


person Timon Van Rooijen    schedule 20.01.2012    source источник


Ответы (1)


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

CGContextRef gc = myGraphicsContext();
CGMutablePathRef path = myMutablePathRef();

CGContextBeginPath(gc);
CGContextAddPath(gc, path);
CGContextSaveGState(gc); {
    CGContextClip(gc);

    // Do color burn.  For example:
    CGContextSetBlendMode(gc, kCGBlendModeColorBurn);
    CGContextSetFillColorWithColor(gc, [UIColor redColor].CGColor);
    CGContextFillRect(gc, CGPathGetBoundingBox(path));
} CGContextRestoreGState(gc);
person rob mayoff    schedule 20.01.2012
comment
Спасибо Роб! Вы действительно помогли мне здесь. По сути, я думал, что это слишком сложно. Попытка создать маску, скопировать содержимое, раскрасить его и объединить обратно с исходным изображением... - person Timon Van Rooijen; 22.01.2012
comment
Единственная странная вещь, которую я оставил, - это тот факт, что изображение, содержащее изображение, поворачивает изображение на 90 градусов при применении цветового ожога. Похоже, он автоматически поворачивается в ландшафт или что-то в этом роде. UIImage — это фотография из средства выбора изображений, сделанная в портретном режиме. Я установил режим просмотра изображений для масштабирования для заполнения. - person Timon Van Rooijen; 22.01.2012
comment
stackoverflow.com/questions/1260249/ - person rob mayoff; 22.01.2012
comment
Спасибо (еще раз) Роб ... Я искал похожие проблемы, но я продолжаю неправильно рисовать CGPath, например, на 90 градусов ... Я переформулировал свой первоначальный вопрос на основе вашего ввода. - person Timon Van Rooijen; 23.01.2012