Linux图片的灰度化,iOS图像灰度解决方案--架构设计
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图像灰度解决方案--架构设计相关推荐
- IOS图像拉伸解决方案
IOS图像拉伸解决方案 参考文章: (1)IOS图像拉伸解决方案 (2)https://www.cnblogs.com/ios8/p/ios-pic-lashen.html 备忘一下.
- iOS底层原理之架构设计
文章目录 何为架构? MVC - Apple版 MVC – 变种 MVP MVVM 设计模式 面试题 何为架构? 架构(Architecture):软件开发中的设计方案,类与类之间的关系.模块与模块之 ...
- Python-OpenCV 处理图像(六)(七)(八):对象识别 图像灰度化处理 图像二值化处理
为了加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像. 0x00. 灰度图 灰度数字图像是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度. 灰度图像与黑 ...
- 【python图像处理】图像灰度化处理、图像灰度线性变换、图像灰度非线性变换
一.图像灰度化处理 1.最大值灰度处理方法 2.平均灰度处理方法 3.加权平均灰度处理方法 二.图像灰度线性变换 1.图像灰度上移变换 2.图像对比度增强变换 3.图像对比度减弱变换 4.图像灰度反色 ...
- html5图片灰度显示,实现各浏览器html图像灰度 跨浏览器图像灰度(grayscale)解决方案...
实现图像灰度(grayscale)最初有ie6推出的专属属性filter实现,后来在css3里w3c实现了标准的filter,但是在不同浏览器的实现程度不一样,因此需要一种浏览器兼容的解决方案. IE ...
- 去中心化的 RTC 通信平台架构设计
去中心化的RTC网络无需关心其它媒体服务状态,可快速增加地域媒体服务节点部署,与信令服务无耦合.本文来自融云联合创始人,CTO杨攀在LiveVideoStackCon 2019上海的演讲内容,由Liv ...
- linux图片添加滤镜,PhotoFlare开源图像和照片编辑器,附在Ubuntu 18.04下的安装方法...
如果您正在寻找可在Linux或Windows系统上使用的免费照片编辑器,这里推荐PhotoFlare,它是一款开源图像和照片编辑器,可安装在Ubuntu 18.04系统下,包括Linux Mint 1 ...
- iOS:关于APP架构设计的简单理解
App架构是软件设计的一个分支,它关心的是如何设计一个 App 的结构.我的理解结构设计分水平和垂直两个方向.垂直方向分:基础层.核心层.业务层.界面层.水平方向可以理解为对界面的的设计模式,目前比较 ...
- 2种图像增强方法:图像点运算和图像灰度化处理
摘要:本文主要讲解图像点运算的灰度化处理,详细介绍常用的灰度化处理方法,并分享了图像颜色空间相互转换,以及三种灰度转换算法的实现. 本文分享自华为云社区<[Python从零到壹] 四十三.图像增 ...
最新文章
- ICML进行时 | 一文看尽获奖论文及Google、Facebook、微软、腾讯的最新科研成果
- 黄冈师范计算机考研,2019年黄冈师范学院计算机基础复试自命题考试大纲
- 虚拟机(VMware Workstation Pro)安装多台Linux
- 在Spring Boot启动时运行代码
- 2017计算机等级考试试题,2017年计算机二级考试练习题及答案
- CDH版Phoenix的安装(图文详解)
- ELV局部视图与差分隐私【敏感度到底怎么理解】【下】
- 【20090702-03】ArcEngine的类库介绍(转)
- 安卓案例:帧式布局演示(切换颜色)
- Docker下安装GitLab
- 选择在共享模式中运行时使用的采样频率和位深度_优化的逻辑(三)干扰相关及扫频仪的使用...
- HDU5904 LCIS【LCIS】
- Maven - Maven3实战学习笔记(3)使用maven构建Web应用
- BZOJ2191:Splite
- JavaScript + jQuery 知识复习总结(附超实用jQuery中文文档)
- 利用ziparchive压缩文件、zip_file解压文件
- 堪培拉地理位置经纬度_澳大利亚堪培拉和悉尼及墨尔本的地理位置
- matlab srgb,matlab – 将Photoshop sRGB复制到LAB转换
- 加快打造“云上贵州”,靠大数据实现“后发赶超”
- css3制作吃豆豆动画
热门文章
- c语言中mw shl code,cacoshl - [ C语言中文开发手册 ] - 在线原生手册 - php中文网
- 天津盈克斯机器人科技_网红新科技,走进家居新时代|环渤海爱乐屋门窗amp;威卢克斯天窗双旦狂欢节送您一个温暖的家!...
- php编译freetds,Linux 下 PHP 5.2.x 连接 SQL Server 数据库 FreeTDS 配置笔记
- Ant Design(ui框架)
- Jmeter之Bean shell使用(四)——跨线程组之间的全局参数传递
- hdu 2586(LCA的离线做法)
- 加入新的地方,要开始积累了
- 使用I/O 系统调用--copy.c
- 转:两种转换mysql数据编码的方法-latin1转utf8
- 关于《用C#编写ActiveX控件》的几点说明