iOS 不规则(多边形)图形切图

作者: 小沛2016 | 来源:发表于2018-03-23 16:16 被阅读847次

效果如下:


Untitled.gif
研究背景
最近在做一个和人脸识别有关的
把人脸的眉毛、眼睛、鼻子等切出来  (后来改成只切一张人脸)
解决方法
第三方人脸识别的SDK会返回一些点给我们,如下图所示 
然后用这些坐标绘制一个不规则的图像
最后用这个不规则的图像做遮罩层,把图片切出来
如果有需要  保存不规则图片的大小就好,把空白的去掉,那就要再写多一步,原理相同
image.png
多边形切图代码
- (UIImage *) cropImageWithImageV:(UIImageView *)imageV pointArr:(NSMutableArray *)pointArr {
    
    CGRect rect = CGRectZero;
    rect.size = imageV.image.size;
    
    UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0.0);
    
    [[UIColor blackColor] setFill];
    UIRectFill(rect);
    [[UIColor whiteColor] setFill];
    
    UIBezierPath *aPath = [UIBezierPath bezierPath];
    
    //起点
    NSValue * v = pointArr[0];
    CGPoint p = [v CGPointValue];
    CGPoint m_p = [self convertCGPoint:p fromRect1:imageV.frame.size toRect2:imageV.frame.size];
    [aPath moveToPoint:m_p];
    
    //其他点
    for (int i = 1; i< pointArr.count; i++) {
        NSValue * v1 = pointArr[i];
        CGPoint p1 = [v1 CGPointValue];
        CGPoint m_p = [self convertCGPoint:p1 fromRect1:imageV.frame.size toRect2:imageV.frame.size];
        [aPath addLineToPoint:m_p];
    }
    
    [aPath closePath];
    [aPath fill];
    
    //遮罩层
    UIImage *mask = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0);
    
    CGContextClipToMask(UIGraphicsGetCurrentContext(), rect, mask.CGImage);
    [imageV.image drawAtPoint:CGPointZero];
    
    UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return maskedImage;
}

- (CGPoint)convertCGPoint:(CGPoint)point1 fromRect1:(CGSize)rect1 toRect2:(CGSize)rect2 {
    point1.y = rect1.height - point1.y;
    CGPoint result = CGPointMake((point1.x*rect2.width)/rect1.width, (point1.y*rect2.height)/rect1.height);
    return result;
}

而如果你需要把空白的去掉 只保留有内容的图片大小就好,则要求 包含所有点的最小矩形 或直接求多边形 直接求多边形的算法我还没去研究 现在我只需要一个矩形就可以了

最小矩形算法
//算出包含数组里所有点的最小矩形
- (CGRect)returnMinRectangleWith:(NSMutableArray <NSValue *> *)arr {
    
    if (arr.count<=0) return CGRectZero;
    
    NSValue * tempValue = arr[0];

    CGPoint tempP = [tempValue CGPointValue];

    CGFloat xMin = tempP.x;
    CGFloat xMax = tempP.x;
    CGFloat yMin = tempP.y;
    CGFloat yMax = tempP.y;
    
    for (int i = 1; i< arr.count; i++) {
        
        NSValue * value = arr[I];
        
        CGPoint p = [value CGPointValue];
        
        if (p.x > xMax) xMax = p.x;

        if (p.x < xMin) xMin = p.x;

        if (p.y > yMax) yMax = p.y;

        if (p.y < yMin) yMin = p.y;
        
    }
    
    return CGRectMake(xMin, yMin, xMax-xMin, yMax-yMin);
    
}

切割图片
//缩小图片
- (UIImage *)screenshotWithRect:(CGRect)rect imageView:(UIImageView *)imageV {
    
    UIGraphicsBeginImageContextWithOptions(rect.size, NO, [UIScreen mainScreen].scale);
    
    CGContextRef context = UIGraphicsGetCurrentContext();

    if (context == NULL) return nil;
    
    CGContextSaveGState(context);
    CGContextTranslateCTM(context, -rect.origin.x, -rect.origin.y);
    
    if( [self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])
    {
        [imageV drawViewHierarchyInRect:imageV.bounds afterScreenUpdates:NO];
    }
    else
    {
        [imageV.layer renderInContext:context];
    }
    
    CGContextRestoreGState(context);
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return image;
}

相关文章

  • iOS 不规则(多边形)图形切图

    iOS 不规则(多边形)图形切图 iOS 不规则(多边形)图形切图

  • iOS 不规则(多边形)图形切图

    效果如下: 研究背景 解决方法 多边形切图代码 而如果你需要把空白的去掉 只保留有内容的图片大小就好,则要求 包含...

  • 降低填充小操作和弃用Text效果组件

    Slice的九宫切图,镂空中间部分,但是有局限性,不规则图形用这种方法很难获得完美的效果,可以写代码修改不规则图形...

  • 1 Konva大纲

    最简单的一个例子 基本形状 矩形,圆,椭圆,直线,多边形,曲线,不规则图形,图片,文字等 样式 填充`纯色、渐变色...

  • ios绘图基础

    ios常见的图形绘制 画线 画圆、圆弧 画矩形,画椭圆,多边形 画图片 画文字 1:ios绘图基础 几个基本的概念...

  • ios 绘制不规则 图形

    最近才知道有一个软件paintcode它可以根据画出的图形自动的生成对应的 OC 代码 不用UI切图 我们也可以用...

  • ios 绘制不规则 图形

    有一个软件paintcode它可以根据画出的图形自动的生成对应的 OC 代码 不用UI切图 我们也可以用代码实现自...

  • CSS之clip-path

    不规则的设计在实现(CSS)成本上也是一个麻烦,毕竟在CSS3之前,我们实现一个圆都要切图,更何况那些复杂的多边形...

  • 222 效率工具:雷达图&气泡图

    一、雷达图 雷达图也称网络图、蜘蛛图、星图、蜘蛛网图、不规则多边形、极坐标图或Kiviat图,用于同一坐标系内展示...

  • iOS中的不规则图形与CoreAnimation动画

    由于最近会接触到K线图,走势图这部分,所以我提前巩固了下关于不规则图形和一些动画的知识。不规则图形,有很多种实现方...

网友评论

  • cbe1b8ba35b3:我做过类似的一个扣图,但是你的这个核心部分,还是需要第三方库的人脸识别把关键的点集合返回回来
    小沛2016:@肥仔聪 嗯,会了不规则 人脸的数据不也很简单吗

本文标题:iOS 不规则(多边形)图形切图

本文链接:https://www.haomeiwen.com/subject/jpjxcftx.html