img.ly SDK for iOS
img.ly SDK for iOS 是一个 Cocoa Touch 框架,用于创建具有精美滤镜库的出色图像。
前言
该项目最初由此处的@9elements 创建。由于它仅兼容 Swift 2,我决定将其转换为现代 Swift 语法并分享给你们。
imglyKit2 版本 | Swift 版本 |
---|---|
1.1.0 - 1.3.0 | 5 |
1.0.0 | 4 |
概览
img.ly SDK 提供用于创建具有各种实时预览功能的照片应用的工具。与其他允许实时预览滤镜的应用程序不同,img.ly SDK 在使用高分辨率图像时也提供实时预览。
功能
- 40 种令人惊叹的内置滤镜可供选择。
- 开源,需要什么?想更改什么?请随意,我们提供完整的源代码。
- 原生代码。我们的后端是基于 Core Image 的,因此避免了其他框架面临的所有糟糕的 OpenGL 问题。此外,添加新滤镜更容易。只需从
CIFilter
派生,重写outputImage
图像属性即可。 - 支持 iPad。
- 在Photoshop中设计滤镜!以前,您需要在代码中调整值,或者从Photoshop或您喜欢的图像编辑器中复制并粘贴它们。有了我们的响应技术,这已经成为过去的事情。在Photoshop中设计您的滤镜,完成后将其应用于提供的身份图像。这将“记录”滤波器响应。保存它,添加为新的滤波器,完成!
- Swift。与时俱进,我们使用Swift编写了img.ly SDK,从而实现了更精简、更易于编码的代码。
- 您可以在相机预览中预览滤镜。
- 内存占用低。
- 非破坏性。不喜欢所做的效果?没问题,只需重新设计或甚至删除它。
- 除了向您的照片添加美丽的滤镜外,您现在还可以录制视频并添加相同的滤镜。
需求
- Xcode 10.0
- Swift 5.0
- iOS 9.0+
- macOS 10.10+
安装
CocoaPods
imglyKit可以通过CocoaPods获取。要安装它,只需将以下行添加到您的Podfile中
pod 'imglyKit2'
Carthage
Carthage 是一个去中心化的依赖关系管理器,它构建您的依赖关系并提供二进制框架。
要使用Carthage将imglyKit集成到您的Xcode项目中,请将其指定在您的Cartfile
中
github "ky1vstar/imgly-sdk-ios-2"
运行 carthage update
以构建框架,然后将构建的 imglyKit.framework
拖动到您的Xcode项目中。
在您的应用程序目标“构建阶段”设置选项卡中,单击“+”图标,选择“新运行脚本阶段”,并添加Carthage入门步骤4、5和6中提到的框架路径
Swift 包管理器
要使用 Apple 的 Swift 包管理器 集成,请将以下内容添加到您的 Package.swift
作为依赖项:
dependencies: [
.package(url: "https://github.com/ky1vstar/imgly-sdk-ios-2.git", from: "1.3.0")
]
或者,前往您的 Xcode 项目,选择 Swift 包
并点击 +
图标以搜索 imgly-sdk-ios-2
。
结构
SDK 可以分为前端和后端两部分。我们还提供了一个实例工厂,它可以为您处理对象生成。它的类名为 IMGLYInstanceFactory
。它有一个名为 sharedInstance
的属性,使用单例模式,因此无需每次都创建它。除了视图和视图控制器之外,它还有创建不同过滤器以及下面描述的图片处理器的功能。
前端
SDK 的前端部分包含所有视图和视图控制器,或一般而言,是 UI。前端本身由两部分组成。与相机相关的 UI 以及与滤镜或操作相关的 UI。
对于相机 UI,有 IMGLYCameraViewController
。该控制器显示相机实时流、滤镜选择器以及控制相机设置,如闪光灯、前置相机或后置相机。您必须使用您希望提供记录模式的 IMGLYCameraViewController
进行实例化,目前支持 .Photo
和 .Video
。拍照后,IMGLYCameraViewController
调用传入的完成处理器,或如果没有设置,以模态方式在一个 IMGLYNavigationController
中显示 IMGLYMainEditorViewController
。拍摄视频后,IMGLYCameraViewController
调用一个包含生成视频文件 URL 的完成块。
IMGLYMainEditorViewController
充当主要编辑器。它连接到子编辑器,允许用户编辑图像。内置的子编辑器包括魔法(自动图像增强)、滤镜、贴纸、方向(翻转/旋转)、焦点(倾斜置换)、裁剪、亮度、对比度、饱和度和文本。这些对话框使用低分辨率图像作为预览来提高性能。当用户按下主编辑器的完成按钮时,所选设置将应用于全分辨率图像。可以像这样使用 IMGLYMainEditorViewController
而<不>使用 IMGLYCameraViewController
:
func callEditorViewController() {
var editorViewController = IMGLYMainEditorViewController()
editorViewController.highResolutionImage = image
editorViewController.initialFilterType = .none
editorViewController.initialFilterIntensity = 0.5
editorViewController.completionBlock = editorCompletionBlock
}
...
func editorCompletionBlock(result: IMGLYEditorResult, image: UIImage?) {
...
}
固定滤镜堆叠
IMGLYPhotoProcessor
允许将任何滤镜列表应用于图像。为了使处理过程更容易且不会破坏原有图像,所有编辑器视图控制器都使用固定滤镜堆叠。这意味着滤镜的顺序是不可变的,用户只需设置不同滤镜的参数。输入始终是原始捕获的图像,而输出图像包含所有做出的更改。
添加自定义编辑器
您可以通过继承 IMGLYSubEditorViewController
来轻松创建自己的子编辑器。主编辑器会自动将固定滤镜栈、低分辨率图像和完成处理程序深拷贝传递给每个子编辑器。每个子类还有一个名为 previewImageView
的 UIImageView
,用于显示预览图像,以及一个名为 bottomContainerView
的 UIView
,您可以使用它来显示自己的控件。在您的子类中,您应该修改传入的 fixedFilterStack
,并在必要时通过使用 updatePreviewImageWithCompletion(completionHandler:)
更新预览图像。最后,如果用户点击完成按钮,则更新的固定滤镜栈将传递回主编辑器;如果用户点击取消按钮,则更新的固定滤镜栈将被简单地丢弃。您还必须将新的 IMGLYActionButton
添加到 IMGLYMainEditorViewController
的 actionButtons
属性。
img.ly SDK 附带一个示例应用程序,以展示 SDK 的简单性和强大功能。
后端
后端负责实际的图像处理。IMGLYPhotoProcessor
是主要类,其 processWithCIImage
/ processWithUIImage
方法接受一个图像和一个 CIFilter
对象数组,然后将滤镜按顺序应用到指定图像上。
以下代码使用钢滤镜对图像进行滤波。
let filter = IMGLYInstanceFactory.sharedInstance.effectFilterWithType(.steel)
let filteredImage = IMGLYPhotoProcessor.processWithUIImage(image, filters: [filter])
响应式滤镜
这些功能使您能够在像ps一样的程序中创建过滤器。它们背后的主要思想是将代表图像中颜色的恒等函数图像应用于该图像的效果。结果图像表示颜色对效果的反应。要在您的项目中使用此过滤器,您需要
-
将结果图像添加到项目中的
Filter Responses
组。注意:图像必须以PNG格式保存。 -
创建一个从
IMGLYResponseFilter
派生的新类。 -
添加一个init方法,将
responseName
属性设置为添加图像的文件名。 -
向
IMGLYFilterType
添加一个新类型。 -
在实例工厂中的
effectFilterWithType
方法中添加一个新的case。 -
将新类型添加到可用过滤器列表中。
框架将处理其余部分,例如预览渲染。以下是一个响应过滤器的示例:
class IMGLYSteelTypeFilter: IMGLYResponseFilter {
override init() {
super.init()
self.responseName = "Steel"
self.imgly_displayName = "steel"
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override var filterType: FilterType {
return IMGLYFilterType.steel
}
}
选择可用过滤器
如示例应用所示,我们添加了许多可供选择的过滤器。要选择一组过滤器,请更改实例工厂的availableFilterList
方法。它仅返回一个过滤器类型数组。这些将在框架内使用。
许可证
有关许可证详细信息,请参阅LICENSE。
作者
9elements GmbH,@9elements,http://www.9elements.com