一、马赛克效果
马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内随机选取的一个像素点的颜色代替,这样可以模糊细节,但是可以保留大体的轮廓。
opencv2框架下载地址 https://opencv.org/
以下OpenCV程序实现马赛克效果,
1、新建一个Unitil工具类
导入opencv2.framework框架添加头文件
Unitil.h文件声明
1.#import <UIKit/UIKit.h>
//核心类
2、#import <opencv2/opencv.hpp>
//对iOS支持类
3、#import <opencv2/imgcodecs/ios.h>
//矩阵
//导入矩阵帮助类
4、#import <opencv2/highgui.hpp>
5、#import <opencv2/core/types.hpp>
//导入C++命名空间
using namespace cv;
@interface Unitil: NSObject
+(UIImage *)MosaicImage:(UIImage *)image level:(int)level;
@end
Unitil.mm方法实现
#import "Unitil.h"
@implementation Unitil
+(UIImage *)MosaicImage:(UIImage *)image level:(int)level{
Mat mat_image_src;
//转化为opencv 图片
UIImageToMat(image, mat_image_src);
int width = mat_image_src.cols;
int height = mat_image_src.rows;
//图片转化rgba转成rgb 这个地方必须实现也是需要注意的地方
Mat mat_image_dst;
cvtColor(mat_image_src, mat_image_dst, CV_RGBA2RGB,3);
//为了不影响原始图片
Mat mat_image_clone = mat_image_dst.clone();
for(int i =0;i<height - level;i+=level){
for(int j = 0;j<width - level;j+=level){
//矩阵区域
Rect2i rect = Rect2i(j, i, level, level);
//给填Rect2i区域->填充数据->原始数据
Mat roi = mat_image_dst(rect);
////让整个矩形区域颜色值保持一致
//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]);
//将处理好矩形区域->数据->拷贝到图片上面去->修改后的数据
Mat rocopy = Mat(rect.size(), CV_8UC3, scalar);
rocopy.copyTo(roi);
}
}
//把处理好的图片返回
return MatToUIImage(mat_image_dst);
}
@end