Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)

简介: Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)

引言

想象一下,只要描述你想要的画面,电脑就能帮你画出来。这在几年前还像是科幻小说里的场景,但随着神经网络和潜在扩散模型(LDM)技术的发展,现在已经成为可能。OpenAI 推出的 DALL·E 工具,因其能生成令人惊叹的艺术作品和逼真的图像而广受欢迎。

你可以通过 OpenAI 的 API 访问 DALL·E,这样你就可以将它的功能集成到你的 Python 程序中。

本教程将带你:

  • 快速上手 OpenAI 的 Python 库
  • 探索与图像生成相关的 API 调用
  • 根据文本提示生成图像
  • 制作生成图像的不同版本
  • 将 Base64 格式的 JSON 响应转换成 PNG 图像文件

将图像数据保存到文件

虽然利用 Python、DALL·E 和 OpenAI API 从文本生成图像非常酷,但目前得到的响应是临时的。如果你想在 Python 脚本中继续使用这些生成的图像,最好是跳过 URL,直接获取图像数据:

from openai import OpenAI

client = OpenAI()

PROMPT = "An eco-friendly computer from the 90s in the style of vaporwave"

response = client.images.generate(
    model="dall-e-2",
    prompt=PROMPT,
    n=1,
    size="256x256",
    response_format="b64_json",
)

print(response.data[0].b64_json[:50])

API 提供了一个选项,允许你将响应格式从 URL 改为 Base64 编码的图像数据。在脚本的第 12 行,你通过设置 response_format 参数为 "b64_json" 来实现这一点。这个参数的默认设置是 "url",这也是为什么你之前收到的 JSON 响应中包含的是 URL。

尽管你修改后的 JSON 响应在外观上与之前类似,但获取图像数据的键值已经从 "url" 变为了 "b64_json"。你在第 15 行的 print() 函数调用中应用了这一更改,并且只输出了前五十个字符。

如果你使用这些设置来执行脚本,你将获得生成图像的实际数据。但是,先别急着运行脚本,因为一旦脚本执行完毕,图像数据就会立即丢失,你将无法查看到图像!

为了防止丢失那个完美的图像,你可以选择将 JSON 响应保存到文件中,而不是仅仅将其打印到终端上:

import json
from pathlib import Path

from openai import OpenAI

client = OpenAI()

PROMPT = "An eco-friendly computer from the 90s in the style of vaporwave"
DATA_DIR = Path.cwd() / "responses"

DATA_DIR.mkdir(exist_ok=True)

response = client.images.generate(
    model="dall-e-2",
    prompt=PROMPT,
    n=1,
    size="256x256",
    response_format="b64_json",
)

file_name = DATA_DIR / f"{PROMPT[:5]}-{response.created}.json"

with open(file_name, mode="w", encoding="utf-8") as file:
    json.dump(response.to_dict(), file)

通过几行额外的代码,你利用 pathlibjson 模块在你的 Python 脚本中实现了文件操作功能:

第 9 行和第 11 行定义并创建了一个名为 "responses/" 的文件夹,用来存储 API 响应的 JSON 文件。

第 21 行设定了一个变量,用于指定你想要保存数据的文件路径。你结合了提示的开头和 JSON 响应中的时间戳来生成一个独特的文件名。

第 23 行和第 24 行在数据文件夹中创建了一个新的 JSON 文件,并将 API 响应以 JSON 格式写入该文件。

有了这些新增的功能,你现在可以运行你的脚本来生成图像,并且图像数据会被妥善保存在你数据文件夹内的一个特定文件中。

你是否已经运行了脚本并检查了生成的 JSON 文件?看起来像天书,对吧?那么,你确定由 DALL·E 创建的那张最佳图像在哪里呢?

它就在那里,只是目前它是以 Base64 编码的形式存在的,这对于人类来说可不太方便查看。在下一节中,你将学习如何将 Base64 编码的图像数据转换成 PNG 文件,这样你就可以直接查看了。

解码 Base64 编码的 JSON 响应

你刚刚已经将一个 PNG 图像以 Base64 编码的字符串形式保存在了 JSON 文件中。这很棒,因为它意味着你的图像不会在互联网上消失,这与你持续通过 API 调用生成 URL 的情况不同。

然而,现在你无法查看你的图像——除非你学会如何解码这些数据。幸运的是,在 Python 中实现这一点并不需要太多的代码,所以请继续创建一个新的脚本文件来完成这项转换:

import json
from base64 import b64decode
from pathlib import Path

DATA_DIR = Path.cwd() / "responses"
JSON_FILE = DATA_DIR / "An ec-1667994848.json"
IMAGE_DIR = Path.cwd() / "images" / JSON_FILE.stem

IMAGE_DIR.mkdir(parents=True, exist_ok=True)

with open(JSON_FILE, mode="r", encoding="utf-8") as file:
    response = json.load(file)

for index, image_dict in enumerate(response["data"]):
    image_data = b64decode(image_dict["b64_json"])
    image_file = IMAGE_DIR / f"{JSON_FILE.stem}-{index}.png"
    with open(image_file, mode="wb") as png:
        png.write(image_data)

convert.py 脚本将读取你在变量 JSON_FILE 中指定的 JSON 文件名。请记得,你需要根据你的 JSON 文件的实际名字来调整 JSON_FILE 的值。

接下来,脚本会从 JSON 数据中提取 Base64 编码的字符串,解码它,并将解码后的图像数据保存为 PNG 文件到指定目录。如果目录不存在,Python 会为你创建它。

请注意,即使你一次获取多张图片,这个脚本同样有效。for 循环会逐个解码每张图片并分别保存为新文件。

提示:如果你想生成包含多张图片 Base64 编码数据的 JSON 文件,可以在运行 create.py 脚本时,将参数 n 的值设置为大于 1 的数字。

这个脚本的大部分代码都涉及从正确的文件夹中读取和写入文件。真正的亮点是 b64decode() 函数。你在第 2 行导入了这个函数,并在第 15 行使用它来解码 Base64 编码的字符串,以便将实际的图像数据保存为 PNG 文件。这样,你的计算机就能识别出 PNG 图像格式,并知道如何将其显示给你。

运行脚本后,你可以前往新创建的文件夹结构,打开 PNG 文件,最终一睹你期待已久的理想生成图像。

这符合你所有的期望吗?如果答案是肯定的,那就太棒了!但如果得到的图像与你要找的差不多,但又不完全一样,那么你可以通过 API 再次提交你的图像作为输入,并创建它的一些变体。

创建图像的变体

如果你手头有一张图像——无论它是机器生成的还是其他来源——它与你想要的相似,但又不完全符合要求,那么你可以利用 OpenAI 的 DALL·E 2 潜在扩散模型来创建它的变体。

基于你在本教程中早先编写的代码,你可以创建一个名为 vary.py 的新文件:

import json
from base64 import b64decode
from pathlib import Path

from openai import OpenAI

client = OpenAI()

DATA_DIR = Path.cwd() / "responses"
SOURCE_FILE = DATA_DIR / "An ec-1667994848.json"

with open(SOURCE_FILE, mode="r", encoding="utf-8") as json_file:
    saved_response = json.load(json_file)
    image_data = b64decode(saved_response["data"][0]["b64_json"])

response = client.images.create_variation(
    image=image_data,
    n=3,
    size="256x256",
    response_format="b64_json",
)

new_file_name = f"vary-{SOURCE_FILE.stem[:5]}-{response.created}.json"

with open(DATA_DIR / new_file_name, mode="w", encoding="utf-8") as file:
    json.dump(response.to_dict(), file)

在该脚本中,你将之前 JSON 响应中的 Base64 编码图像数据发送到 Images API,并请求生成该图像的三个变体。然后,你将这三个变体图像的数据保存在你数据目录下的一个新 JSON 文件中:

第 10 行设定了一个常量,该常量指定了包含你想要生成变体的图像 Base64 编码数据的 JSON 文件名。如果你希望为另一张不同的图像创建变体,你需要在重新执行脚本前修改这个常量。

第 14 行使用 b64decode() 函数解码图像数据,与在 convert.py 中的操作相同,并将解码后的数据保存到 image_data 中。请注意,代码默认选取了 JSON 文件中的第一张图像。如果你保存的响应中包含多张图像,且你希望基于另一张图像来创建变体,你需要相应地调整索引值。

第 17 行将 image_data 作为参数传递给 .create_variation() 方法。注意,该方法的 image 参数需要有效的 PNG 图像数据,这也是为什么你需要在将 JSON 响应中的字符串传递给方法之前先对其进行解码。

第 18 行设定了你希望获得的原始图像变体的数量。在这里,你将 n 设置为 3,意味着你将得到三张新的变体图像。

如果你查看你的 responses/ 目录,你将看到一个新的 JSON 文件,其名称以 vary- 开头。这个文件包含了你的新图像变体的数据。你可以复制这个文件名,并在 convert.py 中将其设置为 JSON_FILE,然后运行转换脚本,查看你的图像变体。

您的图像变化看起来如何?也许其中之一最适合您正在寻找的东西:

如果你对其中一张图像感到满意,但它仍未完全达到你的期望,那么你可以通过修改 vary.py 中的 SOURCE_FILE 值再次运行脚本。如果你想基于第一张以外的其他图像来创建变体,你还需要更改你想要使用的图像数据的索引。

总结

幻想拥有既环保又具有出色美学的电脑固然有趣 - - 但更棒的是,通过使用 Python 和 OpenAI 的 Images API 来实现这些图像的创造!

在本教程中,你已经学会了:

  • 如何在本地安装配置 OpenAI Python 库
  • 如何利用 OpenAI API 的图像生成功能
  • 如何使用 Python 根据文本提示生成图像
  • 如何制作生成图像的变体
  • 如何将 Base64 JSON 响应转换为 PNG 图像文件

最重要的是,你获得了将 API 调用整合到你的 Python 脚本中的实际经验,这使你能够将令人惊叹的图像创造功能带入你自己的应用中。

相关文章
|
2月前
|
机器学习/深度学习 人工智能 编解码
OpenAI 最新多模态图像生成模型 GPT-image-1:一句话生成商业图+智能修图
GPT-image-1是OpenAI推出的新一代多模态图像生成模型,通过API提供专业级图像生成与编辑能力,支持多种分辨率、格式和艺术风格定制。
313 10
OpenAI 最新多模态图像生成模型 GPT-image-1:一句话生成商业图+智能修图
|
1月前
|
JSON 算法 API
1688商品详情API实战:Python调用全流程与数据解析技巧
本文介绍了1688电商平台的商品详情API接口,助力电商从业者高效获取商品信息。接口可返回商品基础属性、价格体系、库存状态、图片描述及商家详情等多维度数据,支持全球化语言设置。通过Python示例代码展示了如何调用该接口,帮助用户快速上手,适用于选品分析、市场研究等场景。
|
1月前
|
监控 供应链 数据挖掘
淘宝商品详情API接口解析与 Python 实战指南
淘宝商品详情API接口是淘宝开放平台提供的编程工具,支持开发者获取商品详细信息,包括基础属性、价格、库存、销售策略及卖家信息等。适用于电商数据分析、竞品分析与价格策略优化等场景。接口功能涵盖商品基础信息、详情描述、图片视频资源、SKU属性及评价统计的查询。通过构造请求URL和签名,可便捷调用数据。典型应用场景包括电商比价工具、商品数据分析平台、供应链管理及营销活动监控等,助力高效运营与决策。
166 26
|
15天前
|
JSON API 数据格式
深入浅出:微店商品详情API接口Python攻略
本教程介绍如何使用Python与微店商品详情API交互。首先,确保安装`requests`库(`pip install requests`)。接着,在微店开发者平台注册应用以获取API访问权限。然后,通过编写Python代码调用API,示例函数`get_weidian_product_detail`可传入商品ID和AppKey获取商品详情(如名称、价格、图片等)。最后,处理返回的JSON数据并注意错误处理和查阅最新API文档。按此步骤,即可顺利获取商品信息。
|
15天前
|
JSON API 开发者
深入浅出:拼多多商品列表API接口Python攻略
拼多多是中国领先的社交电商平台,为开发者提供了丰富的API接口,用于集成商品数据到第三方应用。通过Python可以轻松调用这些API获取商品列表。主要步骤包括:1) 安装必要库(如`requests`);2) 使用AppKey和AppSecret获取访问令牌;3) 调用商品列表API,传入参数如商品ID、页码等;4) 解析返回的JSON数据提取所需信息。按照此流程,开发者能够快速实现与拼多多平台的数据交互。
|
1月前
|
JSON API 数据格式
手把手教你抓取京东商品评论:API 接口解析与 Python 实战
京东商品评论蕴含用户对产品质量、体验和服务的真实反馈,分析这些数据有助于企业优化产品和满足用户需求。由于京东未提供官方API,需通过逆向工程获取评论数据。其主要接口为“商品评论列表接口”,支持按商品ID、评分、排序方式等参数获取评论,返回JSON格式数据,包含评论列表、摘要(如好评率)及热门标签等信息。
|
1月前
|
人工智能 缓存 搜索推荐
1688图片搜索API接口解析与 Python实战指南
1688图片搜索API接口支持通过上传图片搜索相似商品,适用于电商及商品推荐场景。用户上传图片后,经图像识别提取特征并生成关键词,调用接口返回包含商品ID、标题和价格的相似商品列表。该接口需提供图片URL或Base64编码数据,还可附加分页与筛选参数。示例代码展示Python调用方法,调试时建议使用沙箱环境测试稳定性,并优化性能与错误处理逻辑。
|
2月前
|
数据采集 JSON API
Python 实战:用 API 接口批量抓取小红书笔记评论,解锁数据采集新姿势
小红书作为社交电商的重要平台,其笔记评论蕴含丰富市场洞察与用户反馈。本文介绍的小红书笔记评论API,可获取指定笔记的评论详情(如内容、点赞数等),支持分页与身份认证。开发者可通过HTTP请求提取数据,以JSON格式返回。附Python调用示例代码,帮助快速上手分析用户互动数据,优化品牌策略与用户体验。
|
2月前
|
数据采集 搜索推荐 API
Python 原生爬虫教程:京东商品列表页面数据API
京东商品列表API是电商大数据分析的重要工具,支持开发者、商家和研究人员获取京东平台商品数据。通过关键词搜索、分类筛选、价格区间等条件,可返回多维度商品信息(如名称、价格、销量等),适用于市场调研与推荐系统开发。本文介绍其功能并提供Python请求示例。接口采用HTTP GET/POST方式,支持分页、排序等功能,满足多样化数据需求。
|
2月前
|
数据采集 JSON API
Python 实战!利用 API 接口获取小红书笔记详情的完整攻略
小红书笔记详情API接口帮助商家和数据分析人员获取笔记的详细信息,如标题、内容、作者信息、点赞数等,支持市场趋势与用户反馈分析。接口通过HTTP GET/POST方式请求,需提供`note_id`和`access_token`参数,返回JSON格式数据。以下是Python示例代码,展示如何调用该接口获取数据。使用时请遵守平台规范与法律法规。

推荐镜像

更多