ios - カラーバーンをCGPathの内側に制限する

ios uiimage core-graphics cgpath tint

CGPath(実際にはCGMutablePath)として定義されている閉じたパスがあります。

パスで定義されたUIImageの特定の領域をカラーバーンしたい。私はCore Graphicsをいじっていますが、現在の唯一のオプションは、パスではなく、CGRectで定義された長方形の領域に色を付けることです。

誰かが私を正しい方向に向けることができますか?

- 更新

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

COSの数式を使用してCGPATHを手動で90度回転する必要があると思いますが、そうでない場合はどうでしょう。
答え
コンテキストのクリッピングパスをパスに設定して、影響を受けるピクセルを制限します。

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);
関連記事

c# - UITableViewでランダムに「NIBをバンドルでロードできませんでした」

objective-c - NSNotificationはスーパークラスで監視され、スーパークラスと子クラスで処理されます

iphone - ビューとWebサービスの同期呼び出しの読み込みに関する問題

ios - NSDateComponentsのweekOfYearでのクラッシュ

ios - UILabelクリップを作成できません

javascript - / JavaScriptを使用したPhoneGapアプリのプッシュ通知?

ios - UIViewでのUIImage画像の高速描画

ios - コアデータの元に戻す/やり直し-元に戻された内容によってアクションが異なります

iphone - 特定のiOSバージョンでサポートされていないライブラリをバイパスする方法は?

iphone - プログラムでスイッチをscrollviewに追加すると例外がスローされる