我们可以用UIImageView
在图像上设置下面的形状吗?
任何想法!
谢谢
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9pVHRWcy5wbmcifQ==” alt =“在此处输入图像描述”>
是,您可以在UIImage上设置形状。首先,在项目中添加蒙版图像(所需形状)。并编写这些代码。
[yourImageView setImage:[self createMaskImage:yourImage withMask:MaskImage]];
- (UIImage*) createMaskImage:(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 masked = CGImageCreateWithMask([image CGImage], mask);
return [UIImage imageWithCGImage:masked];
}
[就像其他人建议的那样,我将使用图像的mask
属性。
Apple提供的有关mask
属性的信息:
该图层的Alpha通道决定了该图层的内容和背景可以显示多少。完全或部分不透明的像素允许基础内容通过显示,但完全透明的像素会阻止该内容。此属性的默认值为nil nil。
[配置遮罩时,请记住设置遮罩层的大小和位置,以确保其与遮罩的层正确对齐。
最后一句话很重要!
我使用Sketch来创建具有透明背景(PNG)的黑色图像。
将其添加到您的Assets.xcassets文件夹。我的图像称为profileMask
。
为图像视图创建出口。我叫我的profileImageView
。
override func viewDidLoad() {
super.viewDidLoad()
let maskImageView = UIImageView()
maskImageView.contentMode = .scaleAspectFit
maskImageView.image = #imageLiteral(resourceName: "profileMask")
maskImageView.frame = profileImageView.bounds
profileImageView.mask = maskImageView
}
注意:
伙计们,这很痛苦。我试图创建贝塞尔曲线,但老实说,我无法制作出精确形状以匹配面罩的技能。如果您有技巧,贝塞尔曲线可能会看起来非常不错,但我没有。 :(
所以我有了一个主意,“如果我仅将蒙版图像用作边框怎么办?”有效!这样做的好处是,您将来可以使用任何遮罩形状,并且将为其创建边框,而无需弄清楚贝塞尔曲线的路径。
这是我的操作方式:
profileImageView
设置为遮罩,然后将颜色更改为我想要的边框颜色。profileImageView
减去2点(以显示将作为边框的基础蒙版图像)。profileImageView
的子视图。这是viewDidLoad中的代码:
override func viewDidLoad() {
super.viewDidLoad()
// Add border first (mask image)
profileImageView.contentMode = .scaleAspectFit
profileImageView.tintColor = .lightGray // Border Color
profileImageView.image = #imageLiteral(resourceName: "profileMask")
// Profile Image
let profileImage = UIImageView()
profileImage.image = #imageLiteral(resourceName: "Profile")
profileImage.contentMode = .scaleAspectFill
// Make a little bit smaller to show "border" image behind it
profileImage.frame = profileImageView.bounds.insetBy(dx: 2, dy: 2)
// Mask Image
let maskImageView = UIImageView()
maskImageView.image = #imageLiteral(resourceName: "profileMask")
maskImageView.contentMode = .scaleAspectFit
maskImageView.frame = profileImage.bounds
// Apply mask to profile iamge
profileImage.mask = maskImageView
// Add profile image as a subview on top of the "border" image
profileImageView.addSubview(profileImage)
}
所以现在我们运行它时看起来像这样:
真正酷的是,如果我们创建一个具有mask和border width属性的自定义UIImageView。然后,您可以只分配这些属性,而自定义类将负责其余的工作。让我知道你们是否想看到类似的内容,我将其创建并发布在此处。也许还为我的频道制作了YouTube视频教程。
UIImageView
您可以使用imageView的CALayer的mask
属性:
CALayer *mask = [CALayer layer];
mask.contents = (id)[[UIImage imageNamed:@"mask.png"] CGImage];
mask.frame = CGRectMake(0, 0, imageView.image.size.width, imageView.image.size.height);
imageView.layer.mask = mask;
imageView.layer.masksToBounds = YES;
UIImage
这仅适用于ImageView,因此,如果您想直接更改UIImage-您应该使用Core Graphics遮罩:
- (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);
// returns new image with mask applied
return maskedImage;
}
Swift 5]。
let image = UIImage(named: "Lenna.png")! let mask = UIImage(named: "mask-image.png")! // background is transparent let size = image.size let renderer = UIGraphicsImageRenderer(size: size) let newImage = renderer.image { context in image.draw(in: CGRect(origin: .zero, size: size), blendMode: .normal, alpha: 1) mask.draw(in: CGRect(origin: .zero, size: size), blendMode: .destinationIn, alpha: 1) }
游乐场:
抱歉,您的硬编码。尝试使用UIBezierPath
设置所需的任何形状。
使用起来很容易