將彩色圖片變成灰度圖片的兩種方式:ios
1.使用openCV 算法
2.使用IOS系統自帶的開發庫實現設計模式
3.實現架構佈局(設計模式:策略模式)架構
第一:使用openCV框架
1.下載openCV框架:http://opencv.org/佈局
2.導入項目spa
3.建立渲染灰度圖片類:架構設計
#import "ImageUtils.h"設計
//第一步導入OpenCV 頭文件code
#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();
//第二步:顏色空間的上下文(保存圖像的數據信息)
//參數一:指向圖像的內存地址
//參數2、三:圖像的寬、高
//參數四:像素位數(顏色空間,例如;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
{}
//