日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux图片的灰度化,iOS图像灰度解决方案--架构设计

發布時間:2024/4/20 linux 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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图像灰度解决方案--架构设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。