Ios uiimageview上的特定形状图像
我们可以用Ios uiimageview上的特定形状图像,ios,objective-c,uiimageview,uiimage,Ios,Objective C,Uiimageview,Uiimage,我们可以用UIImageView在图像上设置以下形状吗 任何想法 谢谢 MaskUIImageView 您可以使用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.im
UIImageView
在图像上设置以下形状吗
任何想法
谢谢
MaskUIImageView
您可以使用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 mask:
- (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;
}
基于混合的核心图形图像合成
斯威夫特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
设置所需的任何形状
CAShapeLayer* maskLayer = [CAShapeLayer layer];
UIBezierPath* path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(75, 200)];
[path addCurveToPoint:CGPointMake(0, 100) controlPoint1:CGPointMake(0, 150) controlPoint2:CGPointMake(0, 150)];
[path addArcWithCenter:CGPointMake(75, 100) radius:75 startAngle:M_PI endAngle:0 clockwise:YES];
[path addCurveToPoint:CGPointMake(75, 200) controlPoint1:CGPointMake(150, 150) controlPoint2:CGPointMake(150, 150)];
[path closePath];
maskLayer.backgroundColor = [[UIColor clearColor] CGColor];
maskLayer.path = [path CGPath];
yourImageView.layer.mask = maskLayer;
是的,您可以在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];
}
使用它很容易
UIImageView *image=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"balloon_selected_left.png"] ];
self.maskImage.layer.mask=image.layer;
Swift 3版本-带边框
像其他人建议的那样,我会使用图像的mask
属性
苹果公司提供的有关掩码
属性的信息:
层的alpha通道确定层的内容和背景的显示量。完全或部分不透明的像素允许底层内容显示,但完全透明的像素会阻止该内容。
此属性的默认值为nil nil
配置遮罩时,请记住设置遮罩层的大小和位置,以确保其与遮罩层正确对齐
最后一句话很重要
1.创造你的面具
我使用Sketch创建了一个带有透明背景(PNG)的黑色图像
将其添加到Assets.xcsets文件夹。我的图像称为profileMask
2.将UIImageView添加到情节提要
为图像视图创建一个插座。我调用了我的profileImageView
3.代码viewDidLoad
注:
- 我添加了contentMode,因为没有它,我的遮罩会拉伸以匹配UIImageView的边界(宽度)。您可以通过使UIImageView的大小与遮罩图像的大小相同来解决此问题,反之亦然
profileImageView
设置为遮罩,并将着色颜色更改为我想要的边框颜色profileImageView
相同的大小减去2个点(以显示作为边框的底层遮罩图像)profileImageView
的子视图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)
}
现在我们运行它时,它看起来是这样的:
结束
如果我们创建一个带有掩码和边框宽度属性的自定义UIImageView,那会很酷。然后你可以分配这些属性,自定义类会处理其余的。如果你们想看这样的内容,请告诉我,我会创建它并发布在这里。也许还可以为我的频道制作一个YouTube视频教程我不知道为什么,但他的相同代码不适用于我。我不知道如何可能的图像中心部分曲线形状像苗条,所以任何人都知道这个概念请让我知道。我的项目主图像视图图像一些选定的部分像身材苗条任何人都知道请家伙帮助这个概念目标C这只适用于白色背景,而不是白色背景透明。如何在透明背景下工作?@FreeAppl3“不工作”是什么意思?它没有应用掩码?或者应用后背景不正确?这个答案有两种解决方案,你试过这两种吗?@freeapp3最好用你的代码和示例图片创建新问题。我从来没有说过“不行”不确定你的意思是什么,但如果蒙版背景是透明的,并且这是初始问题所使用的,则它不会应用蒙版。此方法适用于蒙版的黑色区域和白色背景。不希望复制问题。@FreeAppl3检查更新的答案。我已添加透明背景混合的解决方案(如果我没听错的话)。
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)
}