您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

使用CoreImage框架,实现绿幕抠图功能

时间:2021-07-23 15:42:50  来源:  作者:率真船帆LE

绿幕抠图代码实现和使用P图软件完成绿幕抠图的步骤是一致的,总共包括四步:

1、初始化前景图,需要P图的部分填充为纯色背景(绿幕/蓝幕)

2、把纯色部分的bitmap设置为透明

3、准备背景图(尺寸和前景图一致),前景图叠加到背景图生成目标图片

4、导出目标图片,完成抠图功能

 

纯色部分的bitmap设置为透明

- (CIFilter*) chromaKeyFilterHuesFrom:(CGFloat)minHue to:(CGFloat)maxHue{
     // 1
     const unsigned int size = 64;
     const size_t cubeDataSize = size * size * size * 4;
     NSMutableData* cubeData = [[NSMutableData alloc] initWithCapacity:
                                (cubeDataSize * sizeof(float))];
     // 2
     for (int z = 0; z < size; z++) {
         CGFloat blue = ((double)z)/(size-1);
         for (int y = 0; y < size; y++) {
             CGFloat green = ((double)y)/(size-1);
             for (int x = 0; x < size; x++) {
                 CGFloat red = ((double)x)/(size-1);
               
                 // 3
                 CGFloat hue = [self hueFromRed:red green:green blue:blue];
                 float alpha = (hue >= minHue && hue <= maxHue) ? 0 : 1;
               
                 // 4
                 float premultipliedRed = red * alpha;
                 float premultipliedGreen = green * alpha;
                 float premultipliedBlue = blue * alpha;
                 [cubeData AppendBytes:&premultipliedRed length:sizeof(float)];
                 [cubeData appendBytes:&premultipliedGreen length:sizeof(float)];
                 [cubeData appendBytes:&premultipliedBlue length:sizeof(float)];
                 [cubeData appendBytes:&alpha length:sizeof(float)];
             }
         }
     }

    // 5
     CIFilter* chromaKeyFilter = [CIFilter filterWithName:@"CIColorCube"];
     [chromaKeyFilter setValue:@(size) forKey:@"inputCubeDimension"];
     [chromaKeyFilter setValue:cubeData forKey:@"inputCubeData"];
     return chromaKeyFilter;
}

获取每个bitmap的颜色值

- (CGFloat) hueFromRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue {
    UIColor* color = [UIColor colorWithRed:red green:green blue:blue alpha:1];
    CGFloat hue, saturation, brightness;
     [color getHue:&hue saturation:&saturation brightness:&brightness alpha:nil];
    return hue; 
}

前景图叠加到背景图,生成目标图片

- (CIImage *)outputImage{
     CIFilter* chromaKeyFilter = [self chromaKeyFilterHuesFrom:0.3 to:0.4];
     CIImage *myImage = [[CIImage alloc] initWithImage:self.inputFilterImage];
     [chromaKeyFilter setValue:myImage forKey:kCIInputImageKey];

     CIFilter* compositor = [CIFilter filterWithName:@"CISourceOverCompositing"];

     CIImage* souceCIImage = chromaKeyFilter.outputImage;
     [compositor setValue:souceCIImage forKey:kCIInputImageKey];

     CIImage *backgroundCIImage = [[CIImage alloc] initWithImage:self.backgroundImage];
     [compositor setValue:backgroundCIImage forKey:kCIInputBackgroundImageKey];

     return compositor.outputImage; 
}

最后,把生成的图片保存到系统相册,完成抠图功能。



Tags:CoreImage框架   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
绿幕抠图代码实现和使用P图软件完成绿幕抠图的步骤是一致的,总共包括四步:1、初始化前景图,需要P图的部分填充为纯色背景(绿幕/蓝幕)2、把纯色部分的bitmap设置为透明3、准备背...【详细内容】
2021-07-23  Tags: CoreImage框架  点击:(126)  评论:(0)  加入收藏
▌简易百科推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Python阿杰    Tags:FastAPI   点击:(6)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  java老人头    Tags:框架   点击:(11)  评论:(0)  加入收藏
今天来梳理下 Spring 的整体脉络啦,为后面的文章做个铺垫~后面几篇文章应该会讲讲这些内容啦 Spring AOP 插件 (了好久都忘了 ) 分享下 4ye 在项目中利用 AOP + MybatisPlus 对...【详细内容】
2021-12-07  Java4ye    Tags:Spring   点击:(14)  评论:(0)  加入收藏
&emsp;前面通过入门案例介绍,我们发现在SpringSecurity中如果我们没有使用自定义的登录界面,那么SpringSecurity会给我们提供一个系统登录界面。但真实项目中我们一般都会使用...【详细内容】
2021-12-06  波哥带你学Java    Tags:SpringSecurity   点击:(18)  评论:(0)  加入收藏
React 简介 React 基本使用<div id="test"></div><script type="text/javascript" src="../js/react.development.js"></script><script type="text/javascript" src="../js...【详细内容】
2021-11-30  清闲的帆船先生    Tags:框架   点击:(19)  评论:(0)  加入收藏
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  叼着猫的鱼    Tags:框架   点击:(21)  评论:(0)  加入收藏
TKinterThinter 是标准的python包,你可以在linx,macos,windows上使用它,你不需要安装它,因为它是python自带的扩展包。 它采用TCL的控制接口,你可以非常方便地写出图形界面,如...【详细内容】
2021-11-30    梦回故里归来  Tags:框架   点击:(26)  评论:(0)  加入收藏
前言项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文...【详细内容】
2021-11-17  充满元气的java爱好者  博客园  Tags:SpringBoot   点击:(25)  评论:(0)  加入收藏
一、搭建环境1、创建数据库表和表结构create table account(id INT identity(1,1) primary key,name varchar(20),[money] DECIMAL2、创建maven的工程SSM,在pom.xml文件引入...【详细内容】
2021-11-11  AT小白在线中  搜狐号  Tags:开发框架   点击:(29)  评论:(0)  加入收藏
SpringBoot开发的物联网通信平台系统项目功能模块 功能 说明 MQTT 1.SSL支持 2.集群化部署时暂不支持retain&will类型消 UDP ...【详细内容】
2021-11-05  小程序建站    Tags:SpringBoot   点击:(55)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条