如何将图像放在自定义路径中

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)&lt;Points&gt;; self.imageview.layer.position 更改“块”位置(块 = 六边形+图像)。我希望六边形保持在相同的位置,并且我可以更改内部图像的位置。 @user3225023 然后改用这个:shapeLayer.position = (CGPoint)&lt;Points&gt;;【参考方案2】:

在您拥有有效CGContext 的地方写:

UIImage * image = ...;
float x = 10;
float y = 10;
[image drawInRect:CGRectMake(x, y, image.size.width, image.size.height)];

如果要缩放或拉伸图像,请为 image.size.widthimage.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 附件的路径?

如何在 SwiftUI WidgetKit 占位符中自定义占位符外观?

如何在 vue bootstrap 中自定义卡片的图像大小

在 Android 中自定义状态选项卡

在 Tomcat 中自定义 404 页面(简单配置)

在 Tailwind CSS 中自定义输入范围