之前好奇, 想实现这样的功能   -----> iOS图像处理-(jpg去除白色背景)

把一张图片(.jpg)的白色背景抠掉,转成.png 格式的有alpha通道的透明图。

原图黑白分明, 像这样

转换成这样

然后在论坛,得到了想要的答案。这里先谢过那位大牛, 也提供了参考资料:  iOS8 Core Image In Swift:更复杂的滤镜

然后今天, 自己也总结一下。

写了个小小的demo, 实现背景图片的切换. 效果如下:

可以看到, 原先的黄色渐变背景被替换掉了。  接下去就是要实现这样一个功能。

当然. 如果感兴趣, 你可以从这里下载到源码: http://download.csdn.net/detail/hitwhylz/8186081

消除橙黄色

就像Photoshop的魔法棒一样,Core Image也有类似的滤镜,但是没有那么简单粗暴,使用起来很麻烦。
在Core Image里,我们为了消除某种颜色,需要使用CIColorCube滤镜,而CIColorCube滤镜需要一张cube映射表,这张表其实就是张颜色表(3D颜色查找表),把你想消除的颜色的alpha值设置为0,其他的颜色不变,Core Image将会把图像数据上的颜色映射为表中的颜色,以此来达到消除某种颜色的目的。
CIColorCube的这张表默认不会对inputImage作任何处理,但在我们这里要将所有的橙黄色干掉,所以需要自己来建立这张表。
我们要消除的“橙黄色”并不只是视觉上的一种颜色,而是颜色的范围,最直接的方法是将RGBA转成HSV(Hue,Saturation,Value),在HSV的格式下,颜色是围绕圆柱体中轴的角度来表现的,在这种表现方法下,你能把颜色的范围想象成连在一起的扇形,然后直接把该块区域干掉(alpha设为0),这就表示我们实际上需要指定颜色区域的范围------围绕圆柱体中轴线的最小角度以及最大角度,此范围内的颜色alpha设为0。最后,Cube Map表中的数据必须乘以alpha,所以创建Cube Map的最后一步是把RGB值乘以你刚刚计算出来的alpha值:如果是想要消除的颜色,乘出来就是0,反之则不变。这是一张代表颜色值区域的HSV(Hue值)图:
可以看到如果是纯黄色,其取值是60度,蓝色是240度,我们这种情况取值大概在35到55左右(偏黄一点),在这个网站上可以看到更详细的RGB颜色对应的HSV值。
那么接下来我们就准备创建Cube Map表,创建Cube Map表的方法在苹果官方示例中可以找到,是C语言实现的,为了方便起见,我们就直接创建一个C文件来包含这些代码。
在工程里选择新建一个.c文件,我取名为cubeMap.c,
.c文件搞完以后,即把苹果官方示例中的代码(以下代码)添加进去:
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;}
我在.c文件中导入的库:
#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开发-简单图片背景替换 实现抠图效果相关推荐

  1. iOS开发-简单图片背景替换(实现抠图效果)

    之前好奇, 想实现这样的功能   -----> iOS图像处理-(jpg去除白色背景) 把一张图片(.jpg)的白色背景抠掉,转成.png 格式的有alpha通道的透明图. 原图黑白分明, 像这 ...

  2. iOS开发------简单实现图片多选功能(Photos.framework篇)

    Photos.framework是iOS8后苹果推出的一套替代AssetsLibrary.framework获取相册资源的原生库,至于AL库,欢迎大家给博文iOS开发--简单实现图片多选功能(Asse ...

  3. 怎么把html背景换白色,美图秀秀怎么将图片背景替换成白色?

    美图秀秀是一款优秀的图片处理软件,在美图秀秀软件中,我们可以将图片进行各种各样的美化处理,本篇经验中我将向大家介绍一下,如何将图片的背景替换为白色,好了,我们的教程就正式开始咯,大家速来围观我的经验啦 ...

  4. ios开发学习-手势交互(Gesture)效果源码分享

    qianqianlianmeng ios开发学习-手势交互(Gesture)效果源码分享 All Around Pull View 介绍:实现视图四个方向(上下左右)都能够拖动更新(pull to r ...

  5. C# 背景移动加抠图效果

    using System; using System.Drawing; using System.IO; using System.Windows.Forms; namespace 背景移动加抠图效果 ...

  6. iOS开发中图片的一些处理操作(背景色,透明度,合成,大小)

    之前写过一篇有关更换图片背景色的文章,今天遇到一块儿了,就干脆重新整理一下了.iOS开发中常用的对图片的处理操作: 一.更换图片的背景颜色 /** * 改变图片背景为白色 * * @param ima ...

  7. iOS开发-简单工厂模式

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.概念很长,iOS开发中最常 ...

  8. java将图片背景替换为透明

    /*** 将背景替换为透明* @param imgBytes* @return* @throws IOException*/ public byte[] changeImgColor(byte[] i ...

  9. ios开发学习--选项卡(Tab Bar) 效果源码分享--系列教程

    自定义UITabBar 介绍: 自定义UITabBar,包括可自定义tab bar的背景图.tab bar的高度以及每个tab的图片,满足各种界面需求.但是,没有文字. http://ios.itmd ...

最新文章

  1. java闭合数据_java多线程中线程封闭详解
  2. 怎么把html4换文件夹打不开,HTML4
  3. Chapter 5 Blood Type——11
  4. 2021-05-19
  5. 阶乘与斐波那契数的理解
  6. nginx图片过滤处理模块http_image_filter_module
  7. python实现8大排序算法
  8. python用pip安装numpy完整命令_Python使用pip安装Numpy模块
  9. JUnit5 @BeforeEach注解示例
  10. lnk200无法解析的外部符号_语义解析
  11. (转)《C++ Qt 编程视频教程》(C++ Qt Programming)[MP4]
  12. TC软件详细设计文档(手机群控)
  13. c语言志愿者信息管理系统,基于C/S架构的青年志愿者管理系统
  14. TCP协议:RST标志位
  15. 读源码(四)—— js Promise
  16. 弘辽科技:淘宝新商家怎么做起来?如何经营一个新店?
  17. 脑机接口专栏 | 利用黎曼几何分析EEG脑电信号(一)
  18. 真彩色与伪彩色、直接色的区别
  19. linux和windows和mac的文件读取方式的差异
  20. windows云服务器部署web网站

热门文章

  1. gii无法访问 yii2_Gii的CURD生成无法访问?
  2. 语言模型Katz backoff以及HMM模型
  3. 10-N个你可能不知道的Mixly软件操作小技巧 | Mixly技巧系列
  4. 讯飞配音使用记录:Excel VBA 编程处理多段短文字配音切分及 Hedit、GoldWave 后期处理、编程合成 WAV 文件
  5. mysql级联更新优化_mysql级联更新
  6. php 搜索引擎 分词_PHP 实现中文分词搜索功能
  7. 【互联网人的英语】把技能当知识,是学英语最大的坑
  8. python程序设计机械工业出版社课后答案-Python 3程序设计基础
  9. Spring Boot入门教程(四十):微信支付集成-刷卡支付
  10. 有关运放自激振荡的帖子(1)