将彩色图片变成灰度图片的两种方式:

1.使用openCV 

2.使用IOS系统自带的开发库实现

3.实现架构布局(设计模式:策略模式)

第一:使用openCV

1.下载openCV框架:http://opencv.org/

2.导入项目

3.创建渲染灰度图片类:

#import "ImageUtils.h"
//第一步导入OpenCV 头文件
#import <opencv2/opencv.hpp>
#import <opencv2/imgcodecs/ios.h>
//#import <opencv2/imgproc/types_c.h>
 
//导入命名空间支持,C++或则C语言也可以之间改一个.m文件为.mm 文件
 
using namespace cv;//命名空间是为了解决OC不能出现相同命名,而C++语言可以出现相同命名
 
@implementation ImageUtils
 
-(UIImageUIImage *)image
{
//image 表示源文件(图片)
    //第二步:将IOS的UIImage 转为C++的图片(数据)
Mat mat_image_Ogray;
UIImageToMat(image, mat_image_Ogray);
    
    //第三步:将C++的彩色图片转成灰度图片
//cvtColor:第一个参数是:源图片,第二个参数:是目标图片第三个参数:转换类似(灰度)
Mat mat_image_dst;
    
cvtColor(mat_image_Ogray, mat_image_dst, COLOR_RGB2GRAY);
    
//第四步:将灰度图片--》可显示的图片
cvtColor(mat_image_dst, mat_image_Ogray, COLOR_GRAY2BGR);
    
//将C++的图片转成ios的UIImage图片
returnMatToUIImage(mat_image_Ogray);
}
 
//系统方法
-(UIImage*)systemImageToGrayImage:(UIImage*)image
{
NSIntegersize.width;
NSIntegersize.height;
    
//创建颜色空间(开辟一个颜色内存空间)
//图片灰度空间(创建灰度空间)
CGColorSpaceRefCGColorSpaceCreateDeviceGray();
    
//第二步:颜色空间的上下文(保存图像的数据信息)
//参数一:指向图像的内存地址
//参数二、三:图像的宽、高
//参数四:像素位数(颜色空间,例如;32位像素格式或RGB颜色空间)
//参数五:图片每一行暂用的比特数
//参数六:颜色空间
//参数七:图片是否包含A(透明度)通道(ARGB四个通道)
CGContextRefCGBitmapContextCreate(nil, width, height, 8, 0, colorREF, kCGImageAlphaNone);
//第三步:释放内存
CGColorSpaceRelease(colorREF);
ifnil) {
       returnnil;
    }
    
//第四步:渲染图片(绘制图片)
//参数一:图片空间上下文
//参数二:渲染区域
//参数三:数据源(图片源)(说白了现在是C++内存区域)
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image.CGImage);
    
//第五步:将绘制的颜色空间转成CGImage(转成图片类型)
CGImageRefCGBitmapContextCreateImage(context);
    
//第六步:将C++图片CGIamge转成面向对象的UIIamge(ios程序认识的图片)
    
UIImageUIImageimageWithCGImage:grayIamgeRef];
//释放内存
CGContextRelease(context);
CGImageRelease(grayIamgeRef);
return desImage;
}
@end

3.架构设计(设计模式:策略模式)

简单策略模式:一个类中相同的方法,可以单独定义,便于扩展,将我们的算法进行分离

第一步定义:策略模式(面向协议开发)

#import <UIKit/UIKit.h>
//策略协议(面向协议开发)
@protocolNSObject>
 //算法设计
-(UIImage*)imageToGrayImage:(UIImage*)image;
@end

 

第二步:创建遵守协议的类

(1)系统方法类

import <Foundation/Foundation.h>
#import "Strategy.h"
 @interfaceNSObject<Strategy>
@end
.m
导入系统的实现方法
implementation SystemStrategy
 //系统自带的方法
-(UIImage*)imageToGrayImage:(UIImage *)image
{}

(2)创建OpenCV策略类

#import <Foundation/Foundation.h>
#import "Strategy.h"
@interfaceNSObject<Strategy>
 @end
//导入OpenCV
#import <opencv2/opencv.hpp>
#import <opencv2/imgcodecs/ios.h>
 //导入命名空间支持,C++或则C语言也可以之间改一个.m文件为.mm 文件
 using namespace cv;//命名空间是为了解决OC不能出现相同命名,而C++语言可以出现相同命名
 
@implementation OpenCVStrategy
 -(UIImage *)imageToGrayImage:(UIImage *)image
{}
 
 
//