Highlight
Apple 将 Image Playground 的生成模型迁移到私有云计算,使开发者能在应用中集成高质量图片生成能力,支持写实风格、多种尺寸、自定义风格,以及基于照片和绘图的视觉参考。
核心内容
过去在应用中集成 AI 图片生成需要处理一系列复杂问题:申请 API 密钥、配置服务器、管理用量限制、构建风格选择界面、处理用户隐私担忧。非技术用户往往不知道如何描述自己想要的图片。
Apple 将 Image Playground 的能力完整打包成 ImagePlayground 框架。这套框架已经在 Messages、Freeform 等系统应用中验证过,用户熟悉它的操作方式。开发者只需要添加一个视图修饰符,就能获得完整的图片生成界面。
生成模型迁移到 Private Cloud Compute(私有云计算)。这使得图片质量显著提升,能够生成真正写实的照片风格图片,同时保证用户数据不被存储或分享。从开发者的角度看,没有任何服务器需要维护,用量限制由系统自动管理。
详细内容
00:00 框架概览
Image Playground 框架支持 iOS、iPadOS、macOS 和 visionOS,要求设备支持 Apple Intelligence。图片生成在 Apple 的私有云计算上完成,用户数据不会被存储或分享。
框架提供以下核心能力:基于文本描述生成图片、支持多个人物场景、多种预设风格(动画、插画、素描、Genmoji)、多种尺寸和宽高比(横幅、竖屏、方形)、支持从照片库导入人物、支持基于现有图片和草图进行生成。
05:28 SwiftUI 集成
在 SwiftUI 中采用 Image Playground 只需要一个视图修饰符:
// Adopt Image Playground in SwiftUI
@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)
}
)
}
关键点:
isPresented是一个Binding<Bool>,控制 sheet 显示onCompletion回调返回生成的图片 URL,URL 指向应用容器内的临时位置- 需要在 session 结束前将图片保存到其他位置
06:29 上下文种子
可以为 sheet 提供初始上下文,让用户不需要从空白开始:
// 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)
}
)
}
关键点:
.text()直接包装文本描述.extracted()从长文本中提取最相关的概念- 传递给 sheet 后会自动填充到提示词输入框
07:11 基于参考图片生成
可以传入一张图片作为视觉参考:
// 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)
}
)
}
关键点:
sourceImage接受任何 SwiftUI Image- 图片作为视觉灵感,用户可以在 sheet 中替换或调整
- 适合用户从图库选择照片作为起点的场景
07:42 基于草图生成
结合 PencilKit 可以用草图引导生成:
// 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
}
关键点:
.drawing()接受 PencilKit 的PKDrawing- 笔触作为视觉建议,引导构图但不锁定结果
- 适合 iPad 上提供手绘体验的应用
08:06 UIKit/AppKit 集成
UIKit 和 AppKit 使用 ImagePlaygroundViewController:
// 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)
}
关键点:
- 在展示前设置
concepts属性 - 通过 delegate 模式接收结果
- API 与 SwiftUI 版本保持一致
09:02 尺寸配置
ImagePlaygroundOptions 可以配置图片尺寸:
// 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)
}
关键点:
.closest(to:)接受一个CGSize- 系统自动映射到最接近支持的宽高比和分辨率
- 适合支持多种格式的应用
09:39 风格配置
可以限制和预设可用风格:
// 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
)
}
关键点:
- 第一个参数是默认选中的风格
- 第二个参数是允许的风格列表
- 如果只传入一个风格,选择器会锁定到该风格
- 预设风格包括:illustration、sketch、animation、emoji
10:27 第三方风格支持
可以支持用户在设置中配置的第三方生成服务:
// 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]
)
}
关键点:
.externalProvider是可选风格- 用户在设置中配置后(如 ChatGPT),该标签会自动出现
- 无需检查用户是否配置,系统自动处理
11:02 Genmoji 图标生成
使用 emoji 风格时,可以生成可嵌入文本的自适应图片字形:
// 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])
}
关键点:
- emoji 风格激活时会触发
onAdaptiveImageGlyphCreation - 回调返回
NSAdaptiveImageGlyph而非 URL - 自适应图片字形可以直接嵌入文本,像 emoji 一样显示
12:01 禁用个性化
某些场景不需要个性化功能时可以禁用:
// 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
}
关键点:
- 个性化默认启用
- 禁用后,人物选择器和名称检测会从 sheet 中消失
- 适合产品图片生成等不需要个人化的场景
12:32 检测功能可用性
使用环境值检测设备是否支持图片生成:
// Supports image generation
@Environment(\.supportsImageGeneration)
private var supportsImageGeneration
var body: some View {
NavigationLink(card.recipient) {
if supportsImageGeneration {
CardEditorView(card: card)
} else {
CardPickerView(card: card)
}
}
}
关键点:
supportsImageGeneration综合考虑设备能力、语言地区、用户设置- 返回 true 时才显示完整体验
- 返回 false 时可以回退到图库选择等其他方案
- 无需额外的 entitlement 或能力检查
核心启发
-
贺卡应用中的定制封面 — Image Playground 原生适合生成个性化贺卡封面。可以结合用户输入的祝福语、收信人关系、节日主题,自动生成独一无二的图片。用户还可以从照片库选择收信人的照片,生成包含对方形象的定制贺卡。
-
社交资料的个性化头像 — 许多应用允许用户上传头像或封面图。可以提供”用 AI 生成”选项,根据用户的昵称、个人简介、兴趣标签自动生成个性化图片。对于不想上传真实照片的用户,这是很好的替代方案。
-
消息应用中的表情增强 — 参考 Messages 中的实现,在对话中允许用户生成表达特定情绪或场景的图片。比如根据对话内容自动建议”庆祝""安慰""道歉”等场景的图片生成入口。
-
内容创作应用的配图生成 — 笔记、博客、文档类应用可以提供”为当前内容生成配图”功能。系统自动提取标题、关键词、情绪倾向作为上下文种子,用户只需调整即可得到合适的配图。
-
游戏或社交应用的自定义元素 — 允许用户生成个人头像、徽章、边框等个性化元素。使用 emoji 风格生成可嵌入文本的自适应字形,这些元素可以直接显示在用户名旁边,增加个性化表达。
关联 Session
- Bring expression to your app with Genmoji — 深入了解自适应图片字形在文本中的使用
- Read between the strokes with PencilKit — 学习 PencilKit 绘图功能的更多细节
- Build with the new Apple Foundation Model on Private Cloud Compute — 了解私有云计算和基础模型的更多技术细节
- What’s new in Apple Intelligence — Keynote 中 Apple Intelligence 的整体更新
评论
GitHub Issues · utterances