gpt4 book ai didi

ios - 将颜色加深限制在 CGPath 的内部

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:49 27 4
gpt4 key购买 nike

我有一个定义为 CGPath(实际上是 CGMutablePath)的封闭路径。

我想对路径定义的 UIImage 的特定区域进行颜色加深。我一直在摆弄 Core Graphics,但目前我唯一的选择是对由 CGRect 定义的矩形区域着色,而不是路径。

谁能指出我正确的方向?

--更新

在 Rob 的帮助下,我设法将从相机获得的图像旋转 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;
}

下图是结果。 De red rectangle 是 CGPATH 的表示。白色方 block 其实就是上述方法在路径上的结果。

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

关于ios - 将颜色加深限制在 CGPath 的内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8947593/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com