如何将图像放在自定义路径中
Posted
技术标签:
【中文标题】如何将图像放在自定义路径中【英文标题】:How to put an image in a custom path 【发布时间】:2014-01-31 14:32:37 【问题描述】:我是 ios 编程的新手,这是我的问题。我用 CGContext(一个六边形)创建了一个路径,我想把一个图像放到这个路径中。下面是创建路径代码:
-(void)drawAllShapes:(float)xcoord :(float)ycoord :(float)cote :(CGContextRef)c :(CGFloat *) fillcolor inRect:(CGRect)rect
xcoord = xcoord*rect.size.width;
ycoord = ycoord*rect.size.height;
cote = cote*rect.size.height;
float x = 0.1835f*rect.size.width;
float y = 0.06162f*rect.size.height;
CGFloat strokecolor[4] = 1.0f, 1.0f, 1.0f, 1.0f;
CGContextSetStrokeColor(c, strokecolor);
CGContextSetFillColor(c, fillcolor);
CGContextSetLineWidth(c, 4.0f);
CGContextBeginPath(c);
CGContextMoveToPoint(c, xcoord, ycoord);
CGContextAddLineToPoint(c, xcoord+x, ycoord+y);
CGContextAddLineToPoint(c, xcoord+x, ycoord+cote+y);
CGContextAddLineToPoint(c, xcoord, ycoord+cote+2*y);
CGContextAddLineToPoint(c, xcoord-x, ycoord+cote+y);
CGContextAddLineToPoint(c, xcoord-x, ycoord+y);
CGContextClosePath(c);
CGContextDrawPath(c, kCGPathFillStroke);
有人可以帮帮我吗?
【问题讨论】:
不清楚你想达到什么目标?您想在屏幕上绘制图像吗?还是要将形状绘制到图像文件中? 我想显示一个内有图像的六边形。 【参考方案1】:尝试在此处添加一些内容:
创建属性:
@property(nonatomic) CGPathRef yourPath;
@property(strong, nonatomic) UIImageView *imageView;
在你的 draw 方法中,注释掉以下几行:
//CGContextSetFillColor(c, fillcolor);
//CGContextDrawPath(c, kCGPathFillStroke);
//CGContextSetLineWidth(c, 4.0f);
关闭路径后,添加以下内容:
CGContextClosePath(c);
self.yourPath = CGContextCopyPath(c);
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.bounds = (CGRect)<Specify_Rect>;
shapeLayer.path = self.yourPath;
self.imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"<Your_Image>"]];
self.imageView.layer.frame = (CGRect)<Specify_Rect>; //Minor correction: changed to frame.
self.imageView.layer.masksToBounds = YES;
self.imageView.layer.mask = shapeLayer;
[self addSubview:self.imageView];
CGPathRelease(self.path);
CGContextRelease(c);
您应该能够看到您的图像被您的路径“包裹”。我在这里发布之前对其进行了测试;玩得开心,尽情享受吧。
【讨论】:
最后一个问题:如何更改路径中的图像位置? @user3225023 你可以使用:self.imageview.layer.position = (CGPoint)<Points>;
self.imageview.layer.position 更改“块”位置(块 = 六边形+图像)。我希望六边形保持在相同的位置,并且我可以更改内部图像的位置。
@user3225023 然后改用这个:shapeLayer.position = (CGPoint)<Points>;
【参考方案2】:
在您拥有有效CGContext
的地方写:
UIImage * image = ...;
float x = 10;
float y = 10;
[image drawInRect:CGRectMake(x, y, image.size.width, image.size.height)];
如果要缩放或拉伸图像,请为 image.size.width
和 image.size.height
使用不同的值
x 和 y 是您想要绘制的位置。
【讨论】:
我试过你的方法,但图像超过了六边形。但我想按六边形裁剪图像。【参考方案3】:您确定要为此目的使用 CGContext 吗?这是另一种方式:
- (UIImage *)maskImage: (UIImage *)image withMask:(UIImage *)maskImage
CGImageRef maskRef = maskImage.CGImage;
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef), NULL, false);
CGImageRef maskedImageRef = CGImageCreateWithMask([image CGImage], mask);
UIImage *maskedImage = [UIImage imageWithCGImage:maskedImageRef];
CGImageRelease(mask);
CGImageRelease(maskedImageRef);
return maskedImage;
这个函数接受一个图像,你想要遮罩,和一个遮罩,它将应用于初始图像并准确返回你想要的。您只需要在您的项目中添加适当的六边形图像。
除此之外,您可以查看this question。
【讨论】:
好的,但是如何将我的 CGContext 六边形转换为 UIImage? 添加了一个类似问题的链接。以上是关于如何将图像放在自定义路径中的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Amazon S3 中自定义 Rails 5.2 ActiveStorage 附件的路径?