2012-01-20 4 views
2

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

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

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

--update

Используя помощь Rob мне удалось повернуть изображение я получил от камеры 90 градусов, чтобы она правильно отображаться в UIImageView ..

Единственная проблема, я оставил это PATH Мне нужно рисовать все еще на 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 математику и тем, что нет .. Хотя я мог бы наблюдать за что-то ..?

ответ

2

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

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); 
+0

Thanks Rob! Ты действительно помог мне здесь. В основном я думал, что это слишком сложно .. Попытка создать маску, скопировать содержимое, раскрасить его и слить его обратно в исходное изображение ... –

+0

Только странная вещь, которую я оставил, состоит в том, что изображение, содержащее изображение поворачивает изображение на 90deg при применении colorburn. Похоже, он авторотирует пейзаж или что-то в этом роде. UIImage - это фотография из изображения, взятого в портретном режиме. Я установил режим Imageview на «scale to fill». –

+0

http://stackoverflow.com/questions/1260249/resizing-uiimages-pulled-from-the-camera-also-rotates-the-uiimage –