-
使用 Image Playground 制作高质量图像
使用 Image Playground 框架,为你的 App 启用高质量图像生成功能。借助基于专用云计算运行的全新生成式模型,用户可以在你的 App 中制作写实以及其他各种风格的图像。你还可以指定尺寸来扩展应用场景,并允许用户使用自然语言描述和触控来修改图像。了解如何采用 Image Playground 框架,基于描述和照片生成图像,并管理 App 内功能的可用性。
章节
- 0:00 - Introduction
- 2:03 - Capabilities
- 5:02 - Adopt Image Playground
- 8:29 - Options
- 12:15 - Availability
资源
相关视频
WWDC26
WWDC24
-
搜索此视频…
你好 我是Antonio Image Playground团队的工程师
今天 我将向你展示 如何将Image Playground集成到你的App中
用户一直在Messages中 使用Image Playground创建图像 在Freeform以及其他App中 他们一直在组合场景 尝试不同的风格 让内容更具个人特色 我们正在以强大的图像模型为核心 重新构想这一体验 如今 它实现了真正的飞跃 能够生成几乎任何风格的 高质量图像 甚至是照片级真实感的图像 看起来与真实照片别无二致
ImagePlayground框架 带来完整的体验 同样强大的模型 同样的风格 同样的质量 直接集成到你的App中 Image Playground App适用于 iOS、iPadOS、macOS和visionOS 它运行于支持Apple Intelligence 的设备上 将生成模型的全部能力 带入你的App
就像Image Playground App一样 你可以使用 ImagePlayground.framework API 在同样的平台上 让我们来了解如何将 Image Playground添加到你的App中 我将从功能介绍开始 了解图像创建模型 能够生成的内容
然后 我将向你展示 如何采用Image Playground 如何呈现面板并用 App中的上下文来填充它
之后是选项 配置尺寸 宽高比和风格 最后是可用性 确保你的App能优雅地处理 支持的设备 以及不支持的设备 在编写任何代码之前 让我们了解Image Playground 能为你的App带来哪些功能 给模型提供文字描述 它就会创建相应的图像 你可以非常具体 也可以非常宽泛 "有狗、气球和彩纸的 生日庆典" 或者只是"庆典" 模型会处理其余的工作 模型可以创建包含人物的图像 包括单一场景中的 多个人物 启用个性化后 用户可以从照片图库中 添加某个人 或仅通过文字 描述某人的外貌 结果是一张具有个人特色的图像 你有多种风格可供选择 你可以请求图像 而不指定风格 你也可以在文字中 指定所需的风格 例如要求 油画风格
或使用我们的预设之一 Animation风格增添了俏皮的个性 Illustration风格呈现出 精致的编辑感
Sketch风格呈现出手绘效果
Genmoji是一种专为 表现力调整的风格 可直接嵌入文字的 Emoji大小字符
Image Playground支持 多种尺寸和宽高比 你可以请求横向图像 用于横幅 竖向图像 用于iPhone全屏 或正方形用于缩略图 模型会选择 最接近你所请求尺寸的 受支持的分辨率 所有这些都在Private Cloud Compute上运行 Apple保护隐私的 云基础设施 你的数据不会被存储或共享 即使是Apple也不会 要深入了解其工作原理 请查看 "Build with the new Apple Foundation Model on Private Cloud Compute"
Image Playground有使用限制 因为它依赖于 强大的服务器模型 大多数iCloud+订阅计划 提供更多的使用额度 作为开发者 这些都不是你需要解决的问题 无需配置服务器 无需维护基础设施 系统代表你的用户 管理使用限制 你无需构建任何 与使用量相关的界面 你调用框架 Apple处理其余的事情 将模型迁移到Private Cloud Compute 也意味着重新思考API ImageCreator 用于在代码中直接生成图像的非UI API 已被弃用
现在一切都可以 通过新API获取 具有更高的图像质量 内置隐私保护 以及人们已经熟悉 如何使用的完整体验 如果你的App目前使用了ImageCreator 请继续收看 现在让我们来了解如何 将Image Playground添加到你的App 为了向你展示 这在代码中是如何实现的 我一直在构建Postcards 一款贺卡创建App 使用Postcards 你可以设计自定义卡片 写一条个人留言 并选择布局 最后一部分是为每张卡片 正面定制插图 这就是Image Playground 发挥作用的地方 采用Image Playground 从一个视图修饰符开始 无需SDK初始化 无需API密钥 无需服务器端点 只需修饰符 我在按钮上添加.imagePlaygroundSheet 并绑定到一个@State布尔值 当绑定值变为true时 面板就会出现 Image Playground处理一切 界面 模型交互 风格选择器
当有人接受图像时 完成闭包会收到一个指向 生成文件的URL 该URL指向你App容器内 的临时位置 在会话结束前将其保存到其他位置 面板以完整一致的体验 融入你的App 用户可以输入描述 浏览风格选项 从图库中添加人物 并在确认前预览结果 你的App获得最终URL 可直接显示 面板可以用空提示词打开 也可以用App中的上下文填充 以获得更丰富的初始体验
ImagePlaygroundConcept 有两个工厂方法 text包装直接描述 我传入的是卡片的主题 比如cherry blossoms extracted处理较长的文本 并让 系统提取最相关的想法 我传入的是卡片的消息 让模型了解卡片的主题 有了概念之后 面板打开时就已经针对 这张特定卡片做好了准备 用户无需从头开始 你也可以用图像来填充面板 将任意SwiftUI Image 传入sourceImage参数 从图库中选取的照片 或卡片已有的图像 Image Playground将它作为 视觉灵感与概念结合使用 用户可以在面板内 替换或调整它 它是起点 而非约束 在iPad上 Postcards在 卡片正面下方显示一块小画布 ImagePlaygroundConcept.drawing 接受PencilKit中的PKDrawing 并将其作为概念与文字一起添加 模型将笔画作为视觉建议处理 它们引导构图 而不会将其锁定 要了解更多关于PencilKit中绘图的信息 请查看 "Read between the strokes with PencilKit"
如果你正在构建UIKit或AppKit App ImagePlaygroundViewController提供 与视图控制器相同的体验 在呈现前将概念和选项 设置为属性 然后实现 imagePlaygroundViewController, didCreateImageAt 在代理上接收结果 该API与SwiftUI相对应 现在 让我们配置面板 以适配Postcards 配置尺寸 风格 和个性化等选项 ImagePlaygroundOptions 和ImagePlaygroundStyle 让你可以管理 Playground的配置 尺寸和宽高比 可用和预选的风格 以及个性化 无论你是在生成卡片插图 锁定屏幕壁纸 横幅还是Genmoji图标 同一API都能适配 Postcards支持三种卡片格式 横向 竖向和正方形 每种格式存储一个CGSize 我将其直接传入.closest(to: 系统会将其映射到 最接近的受支持宽高比和分辨率 因为格式是卡片的属性 尺寸请求会自动适配 横向卡片请求宽图 竖向卡片请求高图 我使用.imagePlaygroundOptions 将选项传入面板
ImagePlaygroundStyle有多个值 例如illustration sketch、animation和emoji imagePlaygroundGenerationStyle 接受两个参数 一个是选择器默认打开的风格 另一个是限制显示哪些风格 的允许列表 如果在允许列表中只传入一种风格 选择器将锁定为该风格
在Postcards中 每张卡片都带有一个StylePreset 直接映射到这些值 经典卡片默认使用illustration 并且只允许illustration和sketch 而富有表现力的卡片 默认使用animation 并且也允许illustration和emoji 风格选择器自动反映 当前打开的卡片
externalProvider是一种 可选的风格 它会显示用户在设置中 配置的第三方提供商 例如ChatGPT 要提供此选项 请将其附加到.allowedStyles列表中 如果用户配置了提供商 该标签会出现在选择器中 如果没有配置 系统会处理设置流程 你这边无需进行任何检查 你也可以将其作为默认风格传入 如果你的App有合适的使用场景 无论哪种情况 选择器都会 根据实际可用的选项进行调整 ImagePlaygroundStyle.emoji专为 表现力强的Emoji大小字符进行了调整 当其激活时 面板会触发另一个独立的完成回调 onAdaptiveImageGlyphCreation 并提供一个NSAdaptiveImageGlyph 而非URL 自适应图像字形比较特殊 它可以直接嵌入文字中 就像Emoji一样 这正是卡片缩略图所需要的 显示在收件人姓名旁边
关于自适应图像字形在文字中的 所有使用方式 渲染 存储 自定义文本引擎 请查看"Bring expression to your app with Genmoji"
个性化默认情况下处于启用状态 它让用户可以纳入 照片图库中的某个人 这是让贺卡感觉 真正个性化的强大方式 如果你的App场景不需要这一功能 比如你正在构建 一个产品图像生成器 可以将 options.personalization设置为disabled 人物选择器和姓名检测 将完全从面板中消失 最后 确保Postcards能 优雅地处理每台设备 Image Playground适用于 支持Apple Intelligence的设备 以及越来越多的 语言和地区 并且需要用户在设置中 启用图像生成功能 supportsImageGeneration 环境值就是你所需要的一切 当图像生成完全可用时 它返回true 设备具备相应能力 当前语言 和地区受支持 且用户已启用该功能 当值为true时 我会导航到CardEditorView 完整的Image Playground体验 当值为false时 我会导航到CardPickerView 一个简单的照片选择器备用方案 无需权限 无需额外的能力检查 无需设置步骤 只需环境值和一个条件判断 这就是干净地支持 两种路径所需的全部
有了Image Playground 在你的App中提供高质量的 图像创建体验变得轻而易举
思考图像在你的设计中的位置 一张发给朋友的卡片 一个代表自己的个人主页 一条他们一直试图 用语言表达的消息 合适的形式和感觉 能改变一切 然后思考 只有你的App才知道什么 哪些关系 哪些记忆 你可以将哪些背景信息 带入画面中 让结果感觉是专门为 那个特定的人制作的 这才是真正的机遇所在 Image Playground提供模型 你来提供故事 感谢收看 现在去构建一些让人 想贴在冰箱上展示的作品吧
-
-
5:28 - Adopt Image Playground in SwiftUI
// Adopt Image Playground in SwiftUI func imagePlaygroundSheet( isPresented: Binding<Bool>, concepts: [ImagePlaygroundConcept] = [], sourceImage: Image? = nil, onCompletion: @escaping (URL) -> Void, onCancellation: (() -> Void)? = nil ) -> some View -
5:39 - Add Image Playground sheet with binding to @State
// Adopt Image Playground @State private var showingPlayground = false var body: some View { Button("Create image") { showingPlayground = true } .imagePlaygroundSheet( isPresented: $showingPlayground, onCompletion: { url in var updated = currentCard store.saveImage(url, for: &updated) } ) } -
6:29 - Seeding the sheet with context from your card
// Seeding the sheet with context from your card var concepts: [ImagePlaygroundConcept] { [ .text(card.theme), .extracted(from: card.message, title: card.theme), ] } var body: some View { Button("Create image") { showingPlayground = true } .imagePlaygroundSheet( isPresented: $showingPlayground, concepts: concepts, onCompletion: { url in var updated = card store.saveImage(url, for: &updated) } ) } -
7:11 - Starting from a reference photo
// Starting from a reference photo @State private var sourceImage: Image? var body: some View { Button("Create image") { showingPlayground = true } .imagePlaygroundSheet( isPresented: $showingPlayground, concepts: concepts, sourceImage: sourceImage, onCompletion: { url in var updated = card store.saveImage(url, for: &updated) } ) } -
7:42 - Providing a visual suggestion using a drawing
// Providing a visual suggestion using a drawing @State private var drawing = PKDrawing() var concepts: [ImagePlaygroundConcept] { var result: [ImagePlaygroundConcept] = [ .text(card.theme), .extracted(from: card.message) ] if !drawing.strokes.isEmpty { result.append(.drawing(drawing)) } return result } -
8:06 - Adopt Image Playground in UIKit or AppKit
// Adopt Image Playground in UIKit or AppKit func presentViewController() { let viewController = ImagePlaygroundViewController() viewController.concepts = [ .text(card.theme), .extracted(from: card.message) ] viewController.delegate = self present(viewController, animated: true) } func imagePlaygroundViewController( _ viewController: ImagePlaygroundViewController, didCreateImageAt url: URL ) { var updated = card store.saveImage(url, for: &updated) dismiss(animated: true) } -
9:02 - Size Specification
// Size Specification var options: ImagePlaygroundOptions { var options = ImagePlaygroundOptions() options.sizeSpecification = .closest(to: card.format.size) return options } var body: some View { Button("Create image") { showingPlayground = true } .imagePlaygroundSheet( isPresented: $showingPlayground, concepts: concepts, onCompletion: { url in var updated = card store.saveImage(url, for: &updated) } ) .imagePlaygroundOptions(options) } -
9:39 - Styles
// Styles var options: ImagePlaygroundOptions { var options = ImagePlaygroundOptions() options.sizeSpecification = .closest(to: card.format.size) return options } var body: some View { Button("Create image") { showingPlayground = true } .imagePlaygroundSheet( isPresented: $showingPlayground, concepts: concepts, onCompletion: { url in var updated = card store.saveImage(url, for: &updated) } ) .imagePlaygroundOptions(options) .imagePlaygroundGenerationStyle( pendingStylePreset.defaultStyle, in: pendingStylePreset.allowedStyles ) } -
10:27 - External Provider Style
// External Provider Style var options: ImagePlaygroundOptions { var options = ImagePlaygroundOptions() options.sizeSpecification = .closest(to: card.format.size) return options } var body: some View { Button("Create image") { showingPlayground = true } .imagePlaygroundSheet( isPresented: $showingPlayground, concepts: concepts, onCompletion: { url in var updated = card store.saveImage(url, for: &updated) } ) .imagePlaygroundOptions(options) .imagePlaygroundGenerationStyle( pendingStylePreset.defaultStyle, in: pendingStylePreset.allowedStyles + [.externalProvider] ) } -
11:02 - Generating an expressive icon for the card thumbnail
// Generating an expressive icon for the card thumbnail @State private var showingIconPlayground = false var body: some View { Button("Create icon") { showingIconPlayground = true } Color.clear .imagePlaygroundSheet( isPresented: $showingIconPlayground, concepts: concepts, onCompletion: { _ in } , onAdaptiveImageGlyphCreation: { glyph in var updatedCard = card store.saveIcon(glyph, for: &updatedCard) } ) .imagePlaygroundGenerationStyle(.emoji, in: [.emoji]) } -
12:01 - Disabling personalization when it doesn't fit your context
// Disabling personalization when it doesn't fit your context var options: ImagePlaygroundOptions { var options = ImagePlaygroundOptions() options.sizeSpecification = .closest(to: card.format.size) options.personalization = .disabled return options } -
12:32 - Supports image generation
// Supports image generation @Environment(\.supportsImageGeneration) private var supportsImageGeneration var body: some View { NavigationLink(card.recipient) { if supportsImageGeneration { CardEditorView(card: card) }γelse { CardPickerView(card: card) } } }
-
-
- 0:00 - Introduction
The ImagePlayground framework brings high-quality, true-to-life image creation into your app, on devices with Apple Intelligence support.
- 2:03 - Capabilities
Image Playground enables the creation of high-quality images with people, styles, and different aspect ratios.
- 5:02 - Adopt Image Playground
Present the Image Playground sheet and seed it with context from your app.
- 8:29 - Options
Configure the Image Playground sheet with options like size, style, and personalization.
- 12:15 - Availability
Ensure your app gracefully handles both supported and unsupported devices, presenting the full Image Playground experience when available.