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哦!
還可以聯系我。嘻嘻!
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Linux图片的灰度化,iOS图像灰度解决方案--架构设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux中的keeplived源码装,
- 下一篇: linux 其他常用命令