iOS:使用Swift处理图像的句
在GreedyGame,我们尝试在不影响Gamer游戏体验的前提下帮助游戏开发者获利。 我们致力于通过将原生广告引入手机游戏并创建广告人❤️,来创建更好的广告生态系统。
在本博客中,我们想带您简短地了解使用Core Graphics和Core Image库对iOS图像进行的各种精美操作。
什么是图像处理? 它为什么如此重要?
图片无处不在。 从精美的Insta过滤器到灵巧的Snapchat或任性的Google图像搜索,图像处理无处不在。
这是一种对图像执行某些操作以获取增强图像或从中提取一些有用信息的方法。 这是一种信号处理,其中输入是图像,输出可以是图像或与该图像关联的特征/特征。
开始之前
iOS开发人员使用许多不同的编程界面在屏幕上渲染图形。 UIKit和AppKit具有各种图像,颜色和路径类。 核心动画可让您四处移动图层。 SpriteKit可让您设置动画。 AVFoundation可让您播放视频。 处理低级的图形可能会有些棘手。
但幸运的是,对于开发人员来说,Apple提供了用于与较低级别的图形处理程序进行交互的抽象/接口。 核心图像和核心图形框架只是这些抽象中的少数。
核心形象
Core Image是这些抽象之一,它是在Apple生态系统中进行编码时经常会遇到的一个库。 从编辑静态图像到在实时视频内容上使用过滤器,Core Image的用途十分广泛,可以处理各种用例。
Core Image是一种图像处理和分析技术,旨在为静止图像和视频图像提供即时处理。 它使用GPU或CPU渲染路径处理来自Core Graphics,Core Video和Image I / O框架的图像数据类型。
核心图形
Core Graphics是一个相当大的API,涵盖了基本几何数据结构(例如点,大小,矢量和矩形)的色域以及对其进行操纵的调用,这些东西将像素渲染为图像或显示在屏幕上,一直到事件处理。 您可以使用Core Graphics创建“事件点击”,使您可以监听和操纵进入应用程序的事件流(鼠标单击,屏幕点击,随机键盘混搭)。
iOS中的不同图像类型
在开始使用上述框架之前,先来看一下iOS中不同类型的图像:
UIImage —一个对象,用于管理应用程序中的图像数据。此对象是在UIImageView上显示图像的高级方式。
CIImage —由Core Image过滤器处理或产生的图像的表示形式。 它仅具有与图像关联的图像数据,并且具有产生新图像的所有必要信息。
CGImage —它仅表示位图。 在核心图形中使用CIFilter进行裁剪,遮罩,滤镜之类的操作将返回CGImage /位图。
现在让这些框架付诸实践。
操作清单:
我将在图像上演示以下简单操作列表。
- 模糊影像
- 在图像上应用不透明度
- 文字合成(在图像顶部渲染文字)
- 图像合成(在图像顶部渲染图像)
- 水印
i)创建画布:
在执行任何操作之前,我们需要通过创建画布来定义输出图像的边界。
在渲染任何图像之前,我们必须定义区域,并在该区域内,然后在其上渲染图像。 例如,艺术家将使用绘画/绘制图片所需的特定尺寸的图纸。 在我们的例子中,工作表将是画布。 可以使用’ UIGraphicsBeginImageContextWithOptions ‘函数创建画布。
UIGraphicsBeginImageContextWithOptions(size,opaque,scaleFactor)
此方法创建具有给定大小的区域,根据不透明布尔值启用/禁用不透明度,并设置图像的给定比例因子。
size — CGRect值,用于指定画布的大小。
opaque —布尔值,用于指定输出是否为透明。
scaleFactor —此值将通过更改图像包含的像素数来放大或缩小图像的物理尺寸。
ii)渲染背景图片:
在最后一种方法中,我们创建了画布。 现在,我们将看到如何在画布内渲染背景图像。 UIImage具有“ draw(in 🙂 ”方法以使用给定的CGRect值渲染图像。 此绘制方法将在图形堆栈中找到当前可用的上下文来处理图像。
UIGraphicsGetImageFromCurrentImageContext将生成并返回具有当前上下文内容的新图像。 然后,您必须调用UIGraphicsEndImageContext()从呈现环境中清除当前上下文。 这将从图形堆栈中弹出当前上下文。
现在,我们将使用核心图像滤镜模糊最后一种方法的输出图像。 Core Image具有内置过滤器的数量。 由此,我们使用“ GaussianBlur ”来模糊图像。 滤波器主要使用“ 高斯分布函数 ”根据半径值对像素数据进行更改。 CIImage类型,其中包含有关图像的信息。 因此我们必须将输入图像转换为CIImage类型,并且必须使用“ kCIInputImageKey”键将图像传递到过滤器中,如下所示:
让blurFilter = CIFilter(name:“ CIGaussianBlur”)
让ciImage = CIImage(image:image)
blurFilter!.setValue(ciImage,forKey:kCIInputImageKey)
在创建过滤器之前,我们应该使用CIContext创建上下文来处理/分析输入图像并进行渲染。
同样,我们使用裁剪滤镜在模糊图像后以宽高比图像尺寸裁剪图像。 然后使用创建的上下文在此“ createCGImage(_:from :)”方法中传递作物过滤器的输出图像,将生成并返回CGImage。
现在,像第二步一样,以所需的大小和位置在模糊的图像上渲染Luigi图像。 但是这里我们用透明(不透明)渲染图像。 所以我们需要在“ UIGraphicsBeginImageContextWithOptions ”方法中启用不透明度,如下所示:
UIGraphicsBeginImageContextWithOptions(size, true ,scaleFactor)
并使用具有混合模式和透明度的alpha值的方法“ draw(in:blendMode:alpha :)”代替“ draw(in :)” 。
image.draw(in:subImageSize,blendMode:.hardLight,alpha:0.8)
v)文字渲染:
基本上,iOS具有纯文本(定义为字符串类型)和属性字符串(定义为NSAttributedString类型)。 我们可以在String中定义基本属性,例如字体名称,大小,粗细等。 但是NSAttributedString字符串允许我们使用其属性来自定义文本,以自定义文本样式,颜色,笔触颜色等。字符串属性只是形式为[NSAttributedStringKey:Any]的字典。
自定义文本/段落的另一件有趣的事情是NSMutableParagraphStyle。NSMutableParagraphStyle用于定义文本的对齐方式,间距,缩进,换行模式,行高等……NSMutableParagraphStyle用于呈现多行文本。
另外,我们需要将文本从String强制转换为NSString类型。 因为NSString类型具有’ draw(in:withAttributes 🙂 ‘方法,该方法允许在图形上下文下呈现文本。
最后,像第二步一样,在图像上渲染徽标。 您可以用其他任何可以替换的东西替换新创建的图像上的最终签名!
下图是上述步骤的顺序。 由此,您可以了解每个步骤的输出图像过渡:
图像处理本身的主题非常详尽且广泛。 我已经介绍了其中的一小部分,以帮助菜鸟开始在iOS上进行图像处理。