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
在图像上设置以下形状吗

任何想法

谢谢

Mask
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 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的大小与遮罩图像的大小相同来解决此问题,反之亦然
以下是运行时的外观:

边境怎么办? 伙计们,这样做很痛苦。我试图创造一个贝塞尔路径,但老实说,我的技能,使一个确切的形状,以配合面具是不可能的。如果你有这样做的技能,贝塞尔路径可能看起来非常好,但我没有:(

所以我有了一个想法,“如果我只使用遮罩图像作为边界会怎么样?”它成功了!这样做的好处是你将来可以使用任何遮罩形状,它将为它创建一个边界,而无需计算贝塞尔路径

我是这样做的:

  • 在Assets.xcsets中,选择遮罩并将此“渲染为”属性更改为“模板图像”。这允许您通过更改UIImageView的“着色颜色”属性来更改遮罩图像的颜色
  • 然后在代码中,我将
    profileImageView
    设置为遮罩,并将着色颜色更改为我想要的边框颜色
  • 然后,我为Jason的个人资料图片创建了另一个图像视图,并对其应用了遮罩。我将其设置为与
    profileImageView
    相同的大小减去2个点(以显示作为边框的底层遮罩图像)
  • 最后一步是将遮罩图像添加为
    profileImageView
    的子视图
  • 下面是viewDidLoad now中的代码:

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