I’ll Never finish falling in love with you.
上一篇文章中,我们使用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
架包手动添加到项目中,不然会报错哦
https://github.com/Goddreamwt/iOS_AudioVideoProcessing/tree/master/OpenCV
需要自己下载opencv2.framework
并导入项目。