WWDC Quick Look 💓 By SwiftGGTeam
Create high quality images using Image Playground

Create high quality images using Image Playground

观看原视频

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 或能力检查

核心启发

  1. 贺卡应用中的定制封面 — Image Playground 原生适合生成个性化贺卡封面。可以结合用户输入的祝福语、收信人关系、节日主题,自动生成独一无二的图片。用户还可以从照片库选择收信人的照片,生成包含对方形象的定制贺卡。

  2. 社交资料的个性化头像 — 许多应用允许用户上传头像或封面图。可以提供”用 AI 生成”选项,根据用户的昵称、个人简介、兴趣标签自动生成个性化图片。对于不想上传真实照片的用户,这是很好的替代方案。

  3. 消息应用中的表情增强 — 参考 Messages 中的实现,在对话中允许用户生成表达特定情绪或场景的图片。比如根据对话内容自动建议”庆祝""安慰""道歉”等场景的图片生成入口。

  4. 内容创作应用的配图生成 — 笔记、博客、文档类应用可以提供”为当前内容生成配图”功能。系统自动提取标题、关键词、情绪倾向作为上下文种子,用户只需调整即可得到合适的配图。

  5. 游戏或社交应用的自定义元素 — 允许用户生成个人头像、徽章、边框等个性化元素。使用 emoji 风格生成可嵌入文本的自适应字形,这些元素可以直接显示在用户名旁边,增加个性化表达。

关联 Session

评论

GitHub Issues · utterances