ZUNL7OS33q.gif

这是一个类似于QQ头像的处理方法,据我所知QQ也是用这种方式处理的,当然我们有两种方案可以选择

第一种方案

使用第三方工具 ---OpenCV(官网内可下载包文件)

OpenCV 它是可以运行在Linux、Windows、Android和Mac OS操作系统上,轻量级而且高效,由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。包括了现在很多平台使用的,人机互动,人脸识别,动作识别,运动分析图像分割等等一系列的图像算法操作。

闲言碎语不要讲,直接上代码

//第一步:导入OpenCV头文件

#import

#import

//第二步:导入命名空间

using namespace cv;

@implementation ImageUtils

- (UIImage*)imageToGrayImage:(UIImage*)image{

//image:表示源文件(原始图片)

//第一步:将iOS的UIimage转成C++的图片(数据:矩阵)

Mat mat_image_gray;

UIImageToMat(image, mat_image_gray);

//第二步:将C++的彩色图片转成灰度图片

//参数1:数据源(原图片)

//参数2:目标数据(目标图片)

//参数3:转换类型(图片格式)

//COLOR_BGR2GRAY :将彩色图片转成灰度图片

Mat mat_image_dst;

cvtColor(mat_image_gray, mat_image_dst, COLOR_BGR2GRAY);

//第三步:转回可显示的图片 灰度->可显示图片

//普及:RGB(3个通道的颜色) ARGB(4个通道颜色,增加了1个透明度)

cvtColor(mat_image_dst, mat_image_gray, COLOR_GRAY2BGR);

//第四步将C++处理后的图片转成iOS可以识别的UIimage

return MatToUIImage(mat_image_gray);

}

由于openCV是用C /C ++写的,所以,需要导入命名空间,然后将Object-C的.m文件改成C++的.mm文件,这样才能够运行C++的代码

第二种方案

使用系统底层API

闲言碎语不要讲,直接上代码

//系统方法实现

- (UIImage*)systemImageToGrayImage:(UIImage*)image{

int width = image.size.width;

int height = image.size.height;

//第一步:创建颜色空间(说白了就是 开辟一块颜色内存空间)

//图片灰度处理(创建灰度空间)

CGColorSpaceRef colorRef = CGColorSpaceCreateDeviceGray();

//第二步:颜色空间的上下文(保存图像数据信息)

//参数1:内存大小(指向这块内存区域的地址)(内存地址)

//参数2:图片宽

//参数3:图片高

//参数4:像素位数(颜色空间,例如:32位像素格式和RGB颜色空间,8位)

//参数5:图片每一行占用的内存比特数

//参数6:颜色空间

//参数7:图片是否包含A通道(ARGB通道)

CGContextRef context = CGBitmapContextCreate(nil, width, height, 8, 0, colorRef, kCGImageAlphaNone);

//释放内存

CGColorSpaceRelease(colorRef);

if (context == nil) {

return nil;

}

//第三步:渲染图片(绘制图片)

//参数1:上下文

//参数2:渲染区域

//参数3:源文件(原图片)(说白了现在是一个C/C++的内存区域)

CGContextDrawImage(context, CGRectMake(0, 0, width, height), image.CGImage);

//第四步:将绘制颜色空间转成CGImage(转成可识别图片类型)

CGImageRef grayImageRef = CGBitmapContextCreateImage(context);

//第五步:将C/C++ 的图片CGImage转成面向对象的UIImage(转成iOS程序认识的图片类型)

UIImage* dstImage = [UIImage imageWithCGImage:grayImageRef];

//释放内存

CGContextRelease(context);

CGImageRelease(grayImageRef);

return dstImage;

}

实现类似qq灰色头像的样式,我们就写完了,是不是很6。

这就完事儿了?怎么可能!

接下来我来讲解架构设计--策略模式

什么是策略模式呢?分析我们平时写的代码结构,通常写法是不是将所有类似功能写在一个类中(算法结构类似)。现实中是不是碰到过,自己写了一天的代码,提交上去,结果被人家给替换掉呢,有吧!我就遇到过,当时真想冲上去爆揍他一顿,哈哈,还好我控制住了。

而策略模式呢是将我们的算法结构进行分离,一个类中存在相同的算法,你可以单独定义,便于扩展。

1)策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。

闲言碎语不要讲,直接上代码

1.第一步:创建协议(面向协议编程)

我们依旧是使用上面的两个算法,来介绍策略模式。

我们创建一个名为strategy的protocol

#import

//策略协议:面向协议编程

@protocol Strategy

//定义算法

- (UIImage*)imageToGrayImage:(UIImage*)image;

@end

2.第二步:创建两个类

#import

#import "Strategy.h"

@interface systemStrategy : NSObject

@end

#import

#import "Strategy.h"

@interface OpencvStrategy : NSObject

@end

将之前的代码放到.m实现文件里

//系统方法实现

- (UIImage*)imageToGrayImage:(UIImage*)image{

int width = image.size.width;

int height = image.size.height;

//第一步:创建颜色空间(说白了就是 开辟一块颜色内存空间)

//图片灰度处理(创建灰度空间)

CGColorSpaceRef colorRef = CGColorSpaceCreateDeviceGray();

//第二步:颜色空间的上下文(保存图像数据信息)

//参数1:内存大小(指向这块内存区域的地址)(内存地址)

//参数2:图片宽

//参数3:图片高

//参数4:像素位数(颜色空间,例如:32位像素格式和RGB颜色空间,8位)

//参数5:图片每一行占用的内存比特数

//参数6:颜色空间

//参数7:图片是否包含A通道(ARGB通道)

CGContextRef context = CGBitmapContextCreate(nil, width, height, 8, 0, colorRef, kCGImageAlphaNone);

//释放内存

CGColorSpaceRelease(colorRef);

if (context == nil) {

return nil;

}

//第三步:渲染图片(绘制图片)

//参数1:上下文

//参数2:渲染区域

//参数3:源文件(原图片)(说白了现在是一个C/C++的内存区域)

CGContextDrawImage(context, CGRectMake(0, 0, width, height), image.CGImage);

//第四步:将绘制颜色空间转成CGImage(转成可识别图片类型)

CGImageRef grayImageRef = CGBitmapContextCreateImage(context);

//第五步:将C/C++ 的图片CGImage转成面向对象的UIImage(转成iOS程序认识的图片类型)

UIImage* dstImage = [UIImage imageWithCGImage:grayImageRef];

//释放内存

CGContextRelease(context);

CGImageRelease(grayImageRef);

return dstImage;

return nil;

}

@end

#import "OpencvStrategy.h"

//第一步:导入OpenCV头文件

#import

#import

//第二步:导入命名空间

using namespace cv;

@implementation OpencvStrategy

- (UIImage*)imageToGrayImage:(UIImage*)image{

//image:表示源文件(原始图片)

//第一步:将iOS的UIimage转成C++的图片(数据:矩阵)

Mat mat_image_gray;

UIImageToMat(image, mat_image_gray);

//第二步:将C++的彩色图片转成灰度图片

//参数1:数据源(原图片)

//参数2:目标数据(目标图片)

//参数3:转换类型(图片格式)

//COLOR_BGR2GRAY :将彩色图片转成灰度图片

Mat mat_image_dst;

cvtColor(mat_image_gray, mat_image_dst, COLOR_BGR2GRAY);

//第三步:转回可显示的图片 灰度->可显示图片

//普及:RGB(3个通道的颜色) ARGB(4个通道颜色,增加了1个透明度)

cvtColor(mat_image_dst, mat_image_gray, COLOR_GRAY2BGR);

//第四步将C++处理后的图片转成iOS可以识别的UIimage

return MatToUIImage(mat_image_gray);

}

@end

3.第三步:创建两个类

然后我们在Viewcontroller里面调用

#import "ViewController.h"

#import "systemStrategy.h"

#import "OpencvStrategy.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@property (nonatomic) id utils;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

_utils1 = [[ImageUtils alloc]init];

_utils = [[systemStrategy alloc]init];//系统方法协议

// _utils = [[OpencvStrategy alloc]init];//OpenCV方法

}

//灰度

- (IBAction)clickImageGray:(UIButton *)sender {

//三个颜色值相同就是灰色

//底层算法就是通过动态修改颜色OpenCV和系统自带的API底层算法是相同的

_imageView.image = [_utils imageToGrayImage:_imageView.image];

}

这样我们就大功告成了!面向协议编程协议模式,完美实现,如果有不懂得地方,这里有demo别忘记点Star哦!

还可以联系我。嘻嘻!

Linux图片的灰度化,iOS图像灰度解决方案--架构设计相关推荐

  1. IOS图像拉伸解决方案

    IOS图像拉伸解决方案 参考文章: (1)IOS图像拉伸解决方案 (2)https://www.cnblogs.com/ios8/p/ios-pic-lashen.html 备忘一下.

  2. iOS底层原理之架构设计

    文章目录 何为架构? MVC - Apple版 MVC – 变种 MVP MVVM 设计模式 面试题 何为架构? 架构(Architecture):软件开发中的设计方案,类与类之间的关系.模块与模块之 ...

  3. Python-OpenCV 处理图像(六)(七)(八):对象识别 图像灰度化处理 图像二值化处理

    为了加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像. 0x00. 灰度图 灰度数字图像是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度. 灰度图像与黑 ...

  4. 【python图像处理】图像灰度化处理、图像灰度线性变换、图像灰度非线性变换

    一.图像灰度化处理 1.最大值灰度处理方法 2.平均灰度处理方法 3.加权平均灰度处理方法 二.图像灰度线性变换 1.图像灰度上移变换 2.图像对比度增强变换 3.图像对比度减弱变换 4.图像灰度反色 ...

  5. html5图片灰度显示,实现各浏览器html图像灰度 跨浏览器图像灰度(grayscale)解决方案...

    实现图像灰度(grayscale)最初有ie6推出的专属属性filter实现,后来在css3里w3c实现了标准的filter,但是在不同浏览器的实现程度不一样,因此需要一种浏览器兼容的解决方案. IE ...

  6. 去中心化的 RTC 通信平台架构设计

    去中心化的RTC网络无需关心其它媒体服务状态,可快速增加地域媒体服务节点部署,与信令服务无耦合.本文来自融云联合创始人,CTO杨攀在LiveVideoStackCon 2019上海的演讲内容,由Liv ...

  7. linux图片添加滤镜,PhotoFlare开源图像和照片编辑器,附在Ubuntu 18.04下的安装方法...

    如果您正在寻找可在Linux或Windows系统上使用的免费照片编辑器,这里推荐PhotoFlare,它是一款开源图像和照片编辑器,可安装在Ubuntu 18.04系统下,包括Linux Mint 1 ...

  8. iOS:关于APP架构设计的简单理解

    App架构是软件设计的一个分支,它关心的是如何设计一个 App 的结构.我的理解结构设计分水平和垂直两个方向.垂直方向分:基础层.核心层.业务层.界面层.水平方向可以理解为对界面的的设计模式,目前比较 ...

  9. 2种图像增强方法:图像点运算和图像灰度化处理

    摘要:本文主要讲解图像点运算的灰度化处理,详细介绍常用的灰度化处理方法,并分享了图像颜色空间相互转换,以及三种灰度转换算法的实现. 本文分享自华为云社区<[Python从零到壹] 四十三.图像增 ...

最新文章

  1. ICML进行时 | 一文看尽获奖论文及Google、Facebook、微软、腾讯的最新科研成果
  2. 黄冈师范计算机考研,2019年黄冈师范学院计算机基础复试自命题考试大纲
  3. 虚拟机(VMware Workstation Pro)安装多台Linux
  4. 在Spring Boot启动时运行代码
  5. 2017计算机等级考试试题,2017年计算机二级考试练习题及答案
  6. CDH版Phoenix的安装(图文详解)
  7. ELV局部视图与差分隐私【敏感度到底怎么理解】【下】
  8. 【20090702-03】ArcEngine的类库介绍(转)
  9. 安卓案例:帧式布局演示(切换颜色)
  10. Docker下安装GitLab
  11. 选择在共享模式中运行时使用的采样频率和位深度_优化的逻辑(三)干扰相关及扫频仪的使用...
  12. HDU5904 LCIS【LCIS】
  13. Maven - Maven3实战学习笔记(3)使用maven构建Web应用
  14. BZOJ2191:Splite
  15. JavaScript + jQuery 知识复习总结(附超实用jQuery中文文档)
  16. 利用ziparchive压缩文件、zip_file解压文件
  17. 堪培拉地理位置经纬度_澳大利亚堪培拉和悉尼及墨尔本的地理位置
  18. matlab srgb,matlab – 将Photoshop sRGB复制到LAB转换
  19. 加快打造“云上贵州”,靠大数据实现“后发赶超”
  20. css3制作吃豆豆动画

热门文章

  1. c语言中mw shl code,cacoshl - [ C语言中文开发手册 ] - 在线原生手册 - php中文网
  2. 天津盈克斯机器人科技_网红新科技,走进家居新时代|环渤海爱乐屋门窗amp;威卢克斯天窗双旦狂欢节送您一个温暖的家!...
  3. php编译freetds,Linux 下 PHP 5.2.x 连接 SQL Server 数据库 FreeTDS 配置笔记
  4. Ant Design(ui框架)
  5. Jmeter之Bean shell使用(四)——跨线程组之间的全局参数传递
  6. hdu 2586(LCA的离线做法)
  7. 加入新的地方,要开始积累了
  8. 使用I/O 系统调用--copy.c
  9. 转:两种转换mysql数据编码的方法-latin1转utf8
  10. 关于《用C#编写ActiveX控件》的几点说明