iOS-構建SDK(從無到有)
阿新 • • 發佈:2018-12-09
上一篇文章中,我們使用OpenCV封裝了圖片馬賽克話的程式碼iOS音視訊—OpenCV初體驗馬賽克的實現,現在我們利用它來構建一個SDK。
A、關於靜態庫和動態庫
- 靜態庫:.a和.framework ,動態庫:.dylib和.framework。.framework可靜可動,取決於你的配置,詳見後面過程。
- 我們做SDK的目的其實主要那麼幾個,解耦,給別人用又不想別人看見我們的原始碼。
- 我們做SDK都是做靜態庫也就上面的.a和.framework
B、如何製作.a靜態庫
- 1.新建工程,選擇Static Library
- 2.Build Active Architecture Only 設定為NO(不同機型的架構不一樣,設定為NO適配不同機型)
- 3.新增需要打包的程式碼
程式碼參考
//
// Mosaics_SDK.m
// Mosaics_SDK
//
// Created by mac on 2018/9/12.
// Copyright © 2018年 WT. All rights reserved.
//
#import "Mosaics_SDK.h"
#import <opencv2/opencv.hpp>
#import <opencv2/imgcodecs/ios.h>
#import <opencv2/highgui.hpp>
#import <opencv2/core/types.hpp>
using namespace cv;
@implementation Mosaics_SDK
+(UIImage *)openCVImage:(UIImage *)image level:(int)level{
//實現功能
//第一步:將iOS圖片轉換為openCV圖片(Mat矩陣)
Mat mat_image_src;
UIImageToMat(image, mat_image_src);
//第二步:確定寬高
int width = mat_image_src.cols;
int height = mat_image_src.rows ;
//圖片型別->進行轉換
//在OpenCV裡面
//坑隱藏
//支援->RGB處理
//圖片ARGB
//將ARGB轉換為RGB
Mat mat_image_dst;
cvtColor(mat_image_src,mat_image_dst,CV_RGBA2RGB,3);
//克隆一張圖片 為了不影響原始圖片
Mat mat_image_clone = mat_image_dst.clone();
//第三步:馬賽克處理
//分析馬賽克演算法原理
//level => 3*3矩形
//我們可以設定level 進行動態處理
int x= width - level;
int y = height - level;
//一個矩形一個矩形去處理
for (int i = 0; i < y; i += level) {
for (int j = 0; j < x; j += level) {
//建立矩形區域
Rect2i mosaicsRect = Rect2i(j,i,level,level);
//原始資料:給Rect2i區域->填充資料
Mat roi = mat_image_dst(mosaicsRect);
//讓整個Rect2i區域顏色值保持一致
//mat_image_clone.at<Vec3b>(i,j) ->畫素點(顏色值組成-》多個) ->ARGB ->陣列
//mat_image_clone.at<Vec3b>(i,j)[0] R值
//mat_image_clone.at<Vec3b>(i,j)[1] G值
//mat_image_clone.at<Vec3b>(i,j)[2] B值
Scalar scalar = Scalar(
mat_image_clone.at<Vec3b>(i,j)[0],
mat_image_clone.at<Vec3b>(i,j)[1],
mat_image_clone.at<Vec3b>(i,j)[2]);
//修改後的資料:將處理好的矩形區域->資料->拷貝到圖片上
//CV_8UC3
//CV_表示:框架的名稱空間
//8表示:每個顏色值是8位
//U表示:有符號型別(sign -> 有正負 ->簡寫"S") -128->127、無符號型別(Unsign->只有正數 ->簡寫"U") 0->255
//C表示:char型別
//3表示:3個通道 RGB
Mat roiCopy = Mat(mosaicsRect.size(),CV_8UC3,scalar);
roiCopy.copyTo(roi);
}
}
//第四步:將OpenCV格式圖片轉換為iOS圖片格式
return MatToUIImage(mat_image_dst);
}
@end
執行專案
沒有執行前,libMosaics_SDK.a
是紅色的
- 4 設定最低支援版本
然後找到Linking other Linker Flags 預設是-Objc的,但是我們在寫SDK原始碼的時候可能不只是-Objc有可能會有分類等等。要修改為-all_load,要是不修改會崩潰的。
- 5.執行程式碼生成對應庫(模擬器和真機下分別在debug和release環境下執行程式碼,總共是4次,右鍵點選上圖中的紅框內庫檔案,Show in Finder會發現4個人檔案,對應剛才4次執行結果)
設定release模式
- 6.合併庫檔案(注意空格)
說明:最終生成了兩個合併好的庫檔案,debug和release。使用時根據當前工程配置情況選用對應庫檔案。
- 生成debug庫檔案 終端:lipo -creat debug下模擬器庫檔案路徑 debug模式下真機庫檔案路徑 -output 合併後庫檔案路徑
- 生成release庫檔案 終端:lipo -creat release下模擬器庫檔案路徑 release模式下真機庫檔案路徑 -output 合併後庫檔案路徑
lipo -create /Users/mac/Library/Developer/Xcode/DerivedData/Mosaics_SDK-ayanxuupewgfntamyyimdicgeixl/Build/Products/Debug-iphonesimulator/libMosaics_SDK.a /Users/mac/Library/Developer/Xcode/DerivedData/Mosaics_SDK-ayanxuupewgfntamyyimdicgeixl/Build/Products/Debug-iphoneos/libMosaics_SDK.a -output /Users/mac/Library/Developer/Xcode/DerivedData/Mosaics_SDK-ayanxuupewgfntamyyimdicgeixl/Build/Products/MosaicsSDK/MosaicsSDK.a
最終生成的檔案
- 7 驗證。將做好的庫檔案新增到自己的工程中,看是否能正常使用。注意,.a靜態庫檔案沒有標頭檔案,需要自己手動新增,找到剛才生成的四個檔案,任選一個,拷貝include資料夾,同合併好的庫檔案一起新增到工程中才能正常使用。
對了,還要把你下載好的opencv2.framework
架包手動新增到專案中,不然會報錯哦
需要自己下載opencv2.framework
並匯入專案。