将彩色图片变成灰度图片的两种方式:
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
-(UIImage *)imageToGrayImage:(UIImage *)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图片
return MatToUIImage(mat_image_Ogray);
}
//系统方法
-(UIImage*)systemImageToGrayImage:(UIImage*)image
{
NSInteger width = image.size.width;
NSInteger height = image.size.height;
//创建颜色空间(开辟一个颜色内存空间)
//图片灰度空间(创建灰度空间)
CGColorSpaceRef colorREF = CGColorSpaceCreateDeviceGray();
//第二步:颜色空间的上下文(保存图像的数据信息)
//参数一:指向图像的内存地址
//参数二、三:图像的宽、高
//参数四:像素位数(颜色空间,例如;32位像素格式或RGB颜色空间)
//参数五:图片每一行暂用的比特数
//参数六:颜色空间
//参数七:图片是否包含A(透明度)通道(ARGB四个通道)
CGContextRef context = CGBitmapContextCreate(nil, width, height, 8, 0, colorREF, kCGImageAlphaNone);
//第三步:释放内存
CGColorSpaceRelease(colorREF);
if (context == nil) {
return nil;
}
//第四步:渲染图片(绘制图片)
//参数一:图片空间上下文
//参数二:渲染区域
//参数三:数据源(图片源)(说白了现在是C++内存区域)
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image.CGImage);
//第五步:将绘制的颜色空间转成CGImage(转成图片类型)
CGImageRef grayIamgeRef = CGBitmapContextCreateImage(context);
//第六步:将C++图片CGIamge转成面向对象的UIIamge(ios程序认识的图片)
UIImage *desImage = [UIImage imageWithCGImage:grayIamgeRef];
//释放内存
CGContextRelease(context);
CGImageRelease(grayIamgeRef);
return desImage;
}
@end
3.架构设计(设计模式:策略模式)
简单策略模式:一个类中相同的方法,可以单独定义,便于扩展,将我们的算法进行分离
第一步定义:策略模式(面向协议开发)
#import <UIKit/UIKit.h>
//策略协议(面向协议开发)
@protocol Strategy <NSObject>
//算法设计
-(UIImage*)imageToGrayImage:(UIImage*)image;
@end
第二步:创建遵守协议的类
(1)系统方法类
import <Foundation/Foundation.h>
#import "Strategy.h"
@interface SystemStrategy : NSObject<Strategy>
@end
.m
导入系统的实现方法
implementation SystemStrategy
//系统自带的方法
-(UIImage*)imageToGrayImage:(UIImage *)image
{}
(2)创建OpenCV策略类
#import <Foundation/Foundation.h>
#import "Strategy.h"
@interface OpenCVStrategy : NSObject<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
{}
//