iOS开发-简单图片背景替换 实现抠图效果
之前好奇, 想实现这样的功能 -----> iOS图像处理-(jpg去除白色背景)
把一张图片(.jpg)的白色背景抠掉,转成.png 格式的有alpha通道的透明图。
原图黑白分明, 像这样
转换成这样
然后在论坛,得到了想要的答案。这里先谢过那位大牛, 也提供了参考资料: iOS8 Core Image In Swift:更复杂的滤镜
然后今天, 自己也总结一下。
写了个小小的demo, 实现背景图片的切换. 效果如下:
可以看到, 原先的黄色渐变背景被替换掉了。 接下去就是要实现这样一个功能。
当然. 如果感兴趣, 你可以从这里下载到源码: http://download.csdn.net/detail/hitwhylz/8186081
消除橙黄色
struct CubeMap { int length; float dimension; float *data;};struct CubeMap createCubeMap(float minHueAngle, float maxHueAngle) { const unsigned int size = 64; struct CubeMap map; map.length = size * size * size * sizeof (float) * 4; map.dimension = size; float *cubeData = (float *)malloc (map.length); float rgb[3], hsv[3], *c = cubeData; for (int z = 0; z < size; z++){ rgb[2] = ((double)z)/(size-1); // Blue value for (int y = 0; y < size; y++){ rgb[1] = ((double)y)/(size-1); // Green value for (int x = 0; x < size; x ++){ rgb[0] = ((double)x)/(size-1); // Red value rgbToHSV(rgb,hsv); // Use the hue value to determine which to make transparent // The minimum and maximum hue angle depends on // the color you want to remove float alpha = (hsv[0] > minHueAngle && hsv[0] < maxHueAngle) ? 0.0f: 1.0f; // Calculate premultiplied alpha values for the cube c[0] = rgb[0] * alpha; c[1] = rgb[1] * alpha; c[2] = rgb[2] * alpha; c[3] = alpha; c += 4; // advance our pointer into memory for the next color value } } } map.data = cubeData; return map;}
我将这个方法稍微改造了一下,选择一个结构体,因为外面要用到length和dimension。苹果没有提供rgbToHSV方法的实现,可以用我找到的这个:
void rgbToHSV(float *rgb, float *hsv) { float min, max, delta; float r = rgb[0], g = rgb[1], b = rgb[2]; float *h = hsv, *s = hsv + 1, *v = hsv + 2; min = fmin(fmin(r, g), b ); max = fmax(fmax(r, g), b ); *v = max; delta = max - min; if( max != 0 ) *s = delta / max; else { *s = 0; *h = -1; return; } if( r == max ) *h = ( g - b ) / delta; else if( g == max ) *h = 2 + ( b - r ) / delta; else *h = 4 + ( r - g ) / delta; *h *= 60; if( *h < 0 ) *h += 360;}
#include <stdio.h>#include <stdlib.h>#include <math.h>
使用这个文件的时候, 需要把调用方, 比如我这里的ViewController.m 改为 ViewController.mm
这样就能支持c文件。 然后导入头文件 #include "cubeMap.c"
之后就是简单的调用了, 具体参加如下代码:
- (void)viewDidLoad{ [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //size 600 × 450 //显示原图片 UILabel *oldLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 65, 160, 15)]; oldLabel.text = @"原图"; oldLabel.textAlignment = NSTextAlignmentCenter; [self.view addSubview:oldLabel]; UIImageView *oldImageView = [[UIImageView alloc]initWithFrame:CGRectMake(5, 80, 150, 112)]; oldImageView.image = [UIImage imageNamed:@"beautyPic.jpg"]; [self.view addSubview:oldImageView]; //显示背景图片 UILabel *backLabel = [[UILabel alloc]initWithFrame:CGRectMake(160, 65, 160, 15)]; backLabel.text = @"背景图"; backLabel.textAlignment = NSTextAlignmentCenter; [self.view addSubview:backLabel]; UIImageView *backImageView = [[UIImageView alloc]initWithFrame:CGRectMake(165, 80, 150, 112)]; backImageView.image = [UIImage imageNamed:@"background"]; [self.view addSubview:backImageView]; //更换背景图片 CubeMap myCube = createCubeMap(35, 55); NSData *myData = [[NSData alloc]initWithBytesNoCopy:myCube.data length:myCube.length freeWhenDone:true]; CIFilter *colorCubeFilter = [CIFilter filterWithName:@"CIColorCube"]; [colorCubeFilter setValue:[NSNumber numberWithFloat:myCube.dimension] forKey:@"inputCubeDimension"]; [colorCubeFilter setValue:myData forKey:@"inputCubeData"]; [colorCubeFilter setValue:[CIImage imageWithCGImage:oldImageView.image.CGImage] forKey:kCIInputImageKey]; CIImage *outputImage = colorCubeFilter.outputImage; CIFilter *sourceOverCompositingFilter = [CIFilter filterWithName:@"CISourceOverCompositing"]; [sourceOverCompositingFilter setValue:outputImage forKey:kCIInputImageKey]; [sourceOverCompositingFilter setValue:[CIImage imageWithCGImage:backImageView.image.CGImage] forKey:kCIInputBackgroundImageKey]; outputImage = sourceOverCompositingFilter.outputImage; CGImage *cgImage = [[CIContext contextWithOptions: nil]createCGImage:outputImage fromRect:outputImage.extent]; UILabel *newLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 200, 320, 15)]; newLabel.text = @"合成图"; newLabel.textAlignment = NSTextAlignmentCenter; [self.view addSubview:newLabel]; UIImageView *newImageView = [[UIImageView alloc]initWithFrame:CGRectMake(10, 220, 300, 225)]; newImageView.image = [UIImage imageWithCGImage:cgImage]; [self.view addSubview:newImageView]; }
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
iOS开发-简单图片背景替换 实现抠图效果相关推荐
- iOS开发-简单图片背景替换(实现抠图效果)
之前好奇, 想实现这样的功能 -----> iOS图像处理-(jpg去除白色背景) 把一张图片(.jpg)的白色背景抠掉,转成.png 格式的有alpha通道的透明图. 原图黑白分明, 像这 ...
- iOS开发------简单实现图片多选功能(Photos.framework篇)
Photos.framework是iOS8后苹果推出的一套替代AssetsLibrary.framework获取相册资源的原生库,至于AL库,欢迎大家给博文iOS开发--简单实现图片多选功能(Asse ...
- 怎么把html背景换白色,美图秀秀怎么将图片背景替换成白色?
美图秀秀是一款优秀的图片处理软件,在美图秀秀软件中,我们可以将图片进行各种各样的美化处理,本篇经验中我将向大家介绍一下,如何将图片的背景替换为白色,好了,我们的教程就正式开始咯,大家速来围观我的经验啦 ...
- ios开发学习-手势交互(Gesture)效果源码分享
qianqianlianmeng ios开发学习-手势交互(Gesture)效果源码分享 All Around Pull View 介绍:实现视图四个方向(上下左右)都能够拖动更新(pull to r ...
- C# 背景移动加抠图效果
using System; using System.Drawing; using System.IO; using System.Windows.Forms; namespace 背景移动加抠图效果 ...
- iOS开发中图片的一些处理操作(背景色,透明度,合成,大小)
之前写过一篇有关更换图片背景色的文章,今天遇到一块儿了,就干脆重新整理一下了.iOS开发中常用的对图片的处理操作: 一.更换图片的背景颜色 /** * 改变图片背景为白色 * * @param ima ...
- iOS开发-简单工厂模式
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.概念很长,iOS开发中最常 ...
- java将图片背景替换为透明
/*** 将背景替换为透明* @param imgBytes* @return* @throws IOException*/ public byte[] changeImgColor(byte[] i ...
- ios开发学习--选项卡(Tab Bar) 效果源码分享--系列教程
自定义UITabBar 介绍: 自定义UITabBar,包括可自定义tab bar的背景图.tab bar的高度以及每个tab的图片,满足各种界面需求.但是,没有文字. http://ios.itmd ...
最新文章
- java闭合数据_java多线程中线程封闭详解
- 怎么把html4换文件夹打不开,HTML4
- Chapter 5 Blood Type——11
- 2021-05-19
- 阶乘与斐波那契数的理解
- nginx图片过滤处理模块http_image_filter_module
- python实现8大排序算法
- python用pip安装numpy完整命令_Python使用pip安装Numpy模块
- JUnit5 @BeforeEach注解示例
- lnk200无法解析的外部符号_语义解析
- (转)《C++ Qt 编程视频教程》(C++ Qt Programming)[MP4]
- TC软件详细设计文档(手机群控)
- c语言志愿者信息管理系统,基于C/S架构的青年志愿者管理系统
- TCP协议:RST标志位
- 读源码(四)—— js Promise
- 弘辽科技:淘宝新商家怎么做起来?如何经营一个新店?
- 脑机接口专栏 | 利用黎曼几何分析EEG脑电信号(一)
- 真彩色与伪彩色、直接色的区别
- linux和windows和mac的文件读取方式的差异
- windows云服务器部署web网站
热门文章
- gii无法访问 yii2_Gii的CURD生成无法访问?
- 语言模型Katz backoff以及HMM模型
- 10-N个你可能不知道的Mixly软件操作小技巧 | Mixly技巧系列
- 讯飞配音使用记录:Excel VBA 编程处理多段短文字配音切分及 Hedit、GoldWave 后期处理、编程合成 WAV 文件
- mysql级联更新优化_mysql级联更新
- php 搜索引擎 分词_PHP 实现中文分词搜索功能
- 【互联网人的英语】把技能当知识,是学英语最大的坑
- python程序设计机械工业出版社课后答案-Python 3程序设计基础
- Spring Boot入门教程(四十):微信支付集成-刷卡支付
- 有关运放自激振荡的帖子(1)