CoreImage 处理图片

1.CoreImage 滤镜的使用(马赛克模糊)

CoreImage是苹果公司为了简化图片处理的难度而开发出来的类库。

随着iOS版本号升级以及硬件性能的不断提升,CoreImage将支持越来越多的滤镜

  • (void)hFilter {

// 0. 导入CIImage 图片

CIImage *ciImage = [[CIImagealloc] initWithImage:[UIImageimageNamed:@”demo”]];

// 1. 创建出Filter 滤镜

CIFilter *filter = [CIFilterfilterWithName:@”CIPixellate”];

[filtersetValue:ciImage

forKey:kCIInputImageKey];

NSLog(@”%@”, filter.attributes);

[filtersetDefaults];

CIImage *outImage = [filter valueForKey:kCIOutputImageKey];

// 2. 用CIContext 将滤镜中的图片渲染出来

CIContext *context = [CIContextcontextWithOptions:nil];

CGImageRef cgImage = [context createCGImage:outImage

fromRect:[outImage extent]];

// 3. 导出图片

UIImage *showImage = [UIImageimageWithCGImage:cgImage];

CGImageRelease(cgImage);

// 4. 载入出来

UIImageView *imageView = [[UIImageViewalloc] initWithImage:showImage];

imageView.center =self.view.center;

[self.viewaddSubview:imageView];

2.CoreImage 滤镜的组合

不同的滤镜能够组合在一起使用。

能够动态的改动滤镜组合中单个滤镜的參数来实现一种动态调整的效果

  • (void)complexCoreImage {

// 0. 导入CIImage 图片

CIImage *ciImage = [[CIImagealloc] initWithImage:[UIImageimageNamed:@”demo”]];

// 1. 创建出Filter 滤镜

CIFilter *filterOne = [CIFilterfilterWithName:@”CIPixellate”];

[filterOnesetValue:ciImage

forKey:kCIInputImageKey];

[filterOnesetDefaults];

CIImage *outImage = [filterOne valueForKey:kCIOutputImageKey];

CIFilter *filterTwo = [CIFilterfilterWithName:@”CIHueAdjust”];

[filterTwosetValue:outImage

forKey:kCIInputImageKey];

[filterTwosetDefaults];

//默觉得0,不设置不能改变。能够封装一个调用

[filterTwosetValue:@(3.14)

forKey:kCIInputAngleKey];

NSLog(@”%@”,filterTwo.attributes);//能够看到一些參数key

CIImage *outputImage = [filterTwo valueForKey:kCIOutputImageKey];

// 2. 用CIContext 将滤镜中的图片渲染出来

CIContext *context = [CIContextcontextWithOptions:nil];

CGImageRef cgImage = [context createCGImage:outputImage

fromRect:[outImage extent]];

// 3. 导出图片

UIImage *showImage = [UIImageimageWithCGImage:cgImage];

CGImageRelease(cgImage);

// 4. 载入出来

UIImageView *imageView = [[UIImageViewalloc] initWithImage:showImage];

imageView.center =self.view.center;

[self.viewaddSubview:imageView];

3.在 OpenGLES 下进行渲染

在OpenGLES下进行滤镜的渲染能够提高效率。(GPU渲染,不占用CPU)

假设须要实时查看多个滤镜动态渲染的效果,使用OpenGLES 是一个好的选择

import

@interfaceViewController ()

@property (nonatomic,strong) GLKView *glkView;//渲染用的buffer 视图

@property (nonatomic,strong) CIFilter *filter;

@property (nonatomic,strong) CIImage *ciImage;

@property (nonatomic,strong) CIContext *ciContext;

@end

@implementation ViewController

  • (void)viewDidLoad {

[superviewDidLoad];

UIImage *showImage = [UIImageimageNamed:@”demo”];

CGRect rect = CGRectMake(0, 0, showImage.size.width, showImage.size.height);

// 获取OpenGLES 渲染的上下文

EAGLContext *eagContext = [[EAGLContextalloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

// 创建出渲染的buffer

_glkView = [[GLKViewalloc] initWithFrame:rect

context:eagContext];

[_glkViewbindDrawable];

[self.viewaddSubview:_glkView];

// 创建出CoreImage 用的上下文

_ciContext = [CIContextcontextWithEAGLContext:eagContext

options:@{kCIContextWorkingColorSpace : [NSNullnull]}];

// CoreImage 相关设置

_ciImage = [[CIImagealloc] initWithImage:showImage];

_filter = [CIFilterfilterWithName:@”CISepiaTone”];

[_filtersetValue:_ciImageforKey:kCIInputImageKey];

[_filtersetValue:@(0)forKey:kCIInputIntensityKey];

// 開始渲染

[_ciContextdrawImage:[_filteroutputImage]

inRect:CGRectMake(0,0, _glkView.drawableWidth,_glkView.drawableHeight)

fromRect:[_ciImageextent]];

[_glkViewdisplay];

// 动态渲染

UISlider *slider = [[UISlideralloc] initWithFrame:CGRectMake(0,400, 320, 20)];

slider.minimumValue =0.f;

slider.maximumValue =1.f;

[slider addTarget:selfaction:@selector(sliderEvent:)forControlEvents:UIControlEventValueChanged];

[self.viewaddSubview:slider];

  • (void)sliderEvent:(UISlider *)slider {

[_filtersetValue:_ciImageforKey:kCIInputImageKey];

[_filtersetValue:@(slider.value )

forKey:kCIInputIntensityKey];

// 開始渲染

[_ciContextdrawImage:[_filteroutputImage]

inRect:CGRectMake(0,0, _glkView.drawableWidth,_glkView.drawableHeight)

fromRect:[_ciImageextent]];

[_glkViewdisplay];

Original: https://www.cnblogs.com/bhlsheji/p/5411354.html
Author: phlsheji
Title: CoreImage 处理图片

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/545778/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 理解 RESTful API 设计规范

    RESTful是目前最流行的API设计规范,它是用于Web数据接口的设计。从字面可以看出,他是Rest式的接口,所以我们先了解下什么是Rest。 REST与技术无关,它代表的是一种…

    技术杂谈 2023年6月1日
    096
  • Dijkstra算法求最短路

    例题链接 Dijkstra算法是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。其主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的…

    技术杂谈 2023年6月21日
    092
  • 接口自动化测试用例如何设计

    转载请注明出处❤️ 你好,我是测试蔡坨坨。 说到自动化测试,或者说接口自动化测试,多数人的第一反应是该用什么工具,比如:Python Requests、Java HttpClien…

    技术杂谈 2023年7月11日
    085
  • MarkDown的基础语法

    MarkDown学习 ## 标题 几个#号+空格代表几级标题 ## 字体 注: 两边分别使用**即可实现字体加粗效果。 注: 两边分别使用两个*即可实现字体斜体效果。 注: 两边分…

    技术杂谈 2023年6月21日
    093
  • Bootstrap表单

    Bootstrap 提供了下列类型的表单布局: 垂直表单(默认) -> 这个不好看,都是手机版了,PC版占一排不好看; 内联表单 -> 我相信这个才是你想要的,PC版响…

    技术杂谈 2023年5月31日
    085
  • C++的回调函数

    一、简介 本文主要介绍C++中如何使用回调函数。 二、回调函数介绍 回调函数主要在”回”字,和正常的函数调用方式不太一样。正常的函数由开发者自己定义返回类型…

    技术杂谈 2023年7月24日
    072
  • Kafka 概述

    kafka 是一个为事件流而生的分布式消息系统,广泛应用于网页用户记录跟踪,IOT 设备,日志采集,系统监控等场景。 kafka 是用于构建实时数据管道和流应用程序。具有横向扩展,…

    技术杂谈 2023年7月24日
    059
  • Docker 部署 Kibana

    Docker 部署 Kibana 本篇主要介绍 使用 Docker 部署 kibana 用于操作 Elasticsearch 使用. 1. 前置准备 1.1 Elasticsear…

    技术杂谈 2023年7月10日
    061
  • 利用taskset,绑定cpu逻辑核心

    1.不设置CPU绑定: ./main.so 2.设置绑定到0号CPU逻辑核心: taskset -c 0 ./bind_core 3.设置绑定到0,1号CPU逻辑核心 taskse…

    技术杂谈 2023年6月1日
    094
  • LESS详解之函数(四)

    之前已经为大家介绍了一些LESS函数,大家应该对之前介绍的有所了解了。下面依旧为大家介绍LESS的函数,附加着一些小例子。希望这些有关LESS的函数能在大家编写LESS的时候有所帮…

    技术杂谈 2023年6月1日
    096
  • 免费公测 标贝声音理解,检测声音性别和年龄

    古有听声辨位,今有听声”识”人。说到声音,其本质是不同频率声音的集合,以波的形式振动(震动)传播。由于每个人的发声器官(口腔、鼻腔、声带)各不相同,因此每个…

    技术杂谈 2023年7月25日
    070
  • curl 命令远程连接 kubernetes 集群

    尝试通过远程的一台电脑用 curl 命令连接 k8s 集群,实地体验 k8s 的安全机制。 直接 curl 命令连接 control plane curl https://k8s-…

    技术杂谈 2023年5月30日
    0114
  • RDD(弹性分布式数据集)及常用算子

    RDD(弹性分布式数据集)及常用算子 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是 Spark 中最基本的数据 处理模型。代码中是一…

    技术杂谈 2023年7月11日
    074
  • 浏览器上写代码,4核8G微软服务器免费用,Codespaces真香

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 一图胜千言 先上图,下面是欣宸在自…

    技术杂谈 2023年7月11日
    081
  • Ruoyi表单构建

    Ruoyi表单构建通过拖动组件就能自动生成前端代码,很方便,所以本文简单通过上层函数源码来梳理一下大致流程,如有需要再自行仔细一行行分析底层代码。 组件拖动 实现组件拖动功能主要依…

    技术杂谈 2023年6月21日
    075
  • 重载规则

    1、可重载的运算符 + – * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >&gt…

    技术杂谈 2023年7月11日
    065
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球