在这里插入图片描述

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


前言

最近我一直在研究如何把 AI 生成内容集成到自己的 App 里。这次想聊的是“生成图片”。如果你用过苹果设备上的 Image Playground App,你可能已经体验过它生成图片的能力。而更棒的是:它也提供了 Swift API。我们可以在自己的 App 内直接调用它来生成图像。

Image Playground 框架的核心是 ImageCreator 这个类型,它负责根据文字、图像、绘图等输入生成图片。下面我们就一步一步来看怎么用。

基础入门:用文字生成一张图

先来一个最简单的例子,只输入一段文字,让系统帮我们生成图片:

import ImagePlayground

public struct Eye {
    public init() {}

    public func visualize(text: String) async throws -> CGImage? {
        // 创建 ImageCreator
        let creator = try await ImageCreator()

        // 生成图片(返回 AsyncSequence)
        let images = creator.images(
            for: [.text(text)], // 概念:只提供文字
            style: .sketch,     // 生成风格,稍后会展开说明
            limit: 1            // 只要 1 张图
        )

        // 从异步序列中逐张取出图片
        for try await image in images {
            return image.cgImage
        }

        return nil
    }
}

简单解释一下整个流程

  1. ImageCreator()
    初始化时可能会抛错,例如当前硬件不支持图像生成功能,所以需要 try/await。

  2. creator.images(…)
    这是生成图像的核心 API。
    有三个参数:

    • concepts: 描述你想让模型生成什么
    • style: 图片风格,Image Playground 内置了多种风格
    • limit: 最多返回几张图(系统最多支持 4 张)
  3. 返回的是 AsyncSequence
    表示图像不是一次性生成,而是“准备好一张就给你一张”。

这个 API 的好处是特别适合 UI 上需要“逐渐呈现生成结果”的场景。

多概念组合:文字 + 图片一起生成

有时候我们希望不仅靠文字,甚至可以输入一张已有的图片,让生成效果更丰富。例如,给一个用户头像加点创意效果。

public struct Eye {
    public init() {}

    public func visualize(text: String, image: CGImage) async throws -> CGImage? {
        let creator = try await ImageCreator()

        let images = creator.images(
            for: [.text(text), .image(image)], // 组合多个概念
            style: .sketch,
            limit: 1
        )

        for try await image in images {
            return image.cgImage
        }

        return nil
    }
}

实际场景举例

  • 用户上传一张自拍 → 你给他生成一个“动漫风格头像”
  • 用户拍了商品照片 → 你为他生成“产品海报风格”图像
  • 文章配图 → 用正文内容分析生成封面图

这些都能用 .text() + .image() 的概念组合实现。

更高级的概念类型:文本、图像、PencilKit 绘图、大段文章摘要

框架提供了四种概念:

概念类型 用法 使用场景
.text("猫在喝咖啡") 描述图像内容 文字描述生成图像
.image(someImage) 提供素材图 对图片进行二次创意
.drawing(PKDrawing) 利用 PencilKit 涂鸦 手绘草图 → 完成版图像
.extracted(largeText) 从大文本中提取主题 给文章生成封面图

比如你有一篇 1000 字的文章,让 AI 自动提炼文章主题生成配图,就可以这样:

let concept = ImagePlaygroundConcept.extracted(articleContent)

特别适合:
博客平台、阅读 App、新闻类 App 的封面图自动生成。

风格选择:动画、插画、素描 —— 不同设备支持不同

ImageCreator 提供三种默认风格:

  • .animation
  • .illustration
  • .sketch

但要注意:不是所有设备都支持所有风格!

所以调用前一定要查询:

creator.availableStyles // 返回当前设备支持的风格数组

下面是一个更健壮的版本:

public struct Eye {
    public init() {}

    public func visualize(text: String) async throws -> CGImage? {
        let creator = try await ImageCreator()

        // 找一个可用的风格,如果 animation 支持就优先 animation
        guard let fallbackStyle = creator.availableStyles.first else {
            return nil
        }

        let finalStyle = creator.availableStyles.contains(.animation)
            ? .animation
            : fallbackStyle

        let images = creator.images(
            for: [.text(text)],
            style: finalStyle,
            limit: 1
        )

        for try await image in images {
            return image.cgImage
        }

        return nil
    }
}

这是实际开发中很重要的“设备兼容性处理”。

可运行 Demo:组合文本 + 图像 + 设备兼容处理

下面是一个完整示例,你可以直接在项目里跑:

import ImagePlayground
import PencilKit

public struct ImageGeneratorService {
    public init() {}

    public func generate(
        text: String,
        sketch: PKDrawing? = nil,
        baseImage: CGImage? = nil
    ) async throws -> CGImage? {

        let creator = try await ImageCreator()

        // 动态拼接概念
        var concepts: [ImagePlaygroundConcept] = [.text(text)]

        if let sketch = sketch {
            concepts.append(.drawing(sketch))
        }

        if let baseImage = baseImage {
            concepts.append(.image(baseImage))
        }

        // 兼容设备风格
        let style = creator.availableStyles.first ?? .sketch

        // 开始生成
        let images = creator.images(
            for: concepts,
            style: style,
            limit: 1
        )

        for try await image in images {
            return image.cgImage
        }
        return nil
    }
}

你可以在 SwiftUI 里这样调用:

@State private var resultImage: UIImage?

Task {
    if let cg = try await ImageGeneratorService().generate(text: "一只穿着宇航服的猫") {
        resultImage = UIImage(cgImage: cg)
    }
}

实际项目落地场景

1. 自动封面生成(资讯/阅读类应用)

像 Medium、知乎专栏那样,发布文章时自动根据标题 + 内容生成一张封面图。

输入:.text(标题)+.extracted(正文)
输出:带风格的封面插画

2. 用户头像升级(社交类 App)

用户上传头像后:

  • 自动生成「卡通版」
  • 自动生成「赛博朋克风」
  • 自动生成「插画风」

3. 笔记应用(手写草图 → 完整插图)

用户画一个草图,生成“正式插图”。

4. 商业设计草图(草图 → 海报)

用 PencilKit 画出一个大概布局,系统自动生成配图。

总结

Image Playground 框架把苹果的生成式图像能力直接带到 Swift 里,通过极其简单的 API 就能实现:

  • 文生图(Text-to-Image)
  • 图生图(Image-to-Image)
  • 手绘生图(Drawing-to-Image)
  • 大文本提取概念生成图

不仅生成速度快,而且和系统原生框架完全融合,非常适合在 iOS/iPadOS/macOS App 里集成 AI 创意内容。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐