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

news2025/1/14 18:28:18

引言

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

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

本教程[1]将带你:

  • 快速上手 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 文件,最终一睹你期待已久的理想生成图像。

alt

这符合你所有的期望吗?如果答案是肯定的,那就太棒了!但如果得到的图像与你要找的差不多,但又不完全一样,那么你可以通过 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,然后运行转换脚本,查看你的图像变体。

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

alt

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

总结

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

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

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

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

Reference
[1]

Source: https://realpython.com/generate-images-with-dalle-openai-api/

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2215020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32L151 多通道ADC DMA循环扫描STM32CubeIDE STM32CubeMX参考设计

简介 项目开发过程中,采用STM32L151 芯片进行涉及,其中需要使用其片上ADC进行多路ADC数据采样。这里就记录一下实际这块的开发过程,其中涉及工程代码再项目中实际投产使用。STM32L151 多通道ADC DMA循环扫描STM32CubeIDE STM32CubeMX参考设计…

【文心智能体 | AI大师工坊】通过知识库优化智能体『万圣节之纸人还魂』:探索恐怖剧本杀的奇幻之旅

文章目录 1.1、智能体运行效果1.2、创作灵感来源1.3、如何制作智能体1.4、可能会遇到的几个问题1.5、快速调优指南 My_优质智能体『万圣节之纸人还魂👻』:https://aq58pt.smartapps.baidu.com/?_swebfr1&_swebScene3611000100000000 在当今人工智能…

Vue开发中由错误These relative modules were not found 引起的问题思考及解决

一、由Vue: These relative modules were not found 引起的问题 1、vue2.6.14 These relative modules were not found 在使用vue2.6.14开发的项目在本地windows 10上都一直成功,想放到jenkins上进行发布。之前其它的 vue 项目也都能发布正常,但此次一…

【stm32】DMA的介绍与使用

DMA的介绍与使用 1、DMA简介2、存储器映像3、DMA框图4、DMA基本结构5、DMA请求6、数据宽度与对齐7、数据转运DMA(存储器到存储器的数据转运)程序编写: 8、ADC连续扫描模式DMA循环转运DMA配置:程序编写: 1、DMA简介 DM…

Antsword-labs靶机渗透

Less-1 在当前界面开启终端 ![](https://img-blog.csdnimg.cn/img_convert/e5ab1b947b1186a43b58abaf10263cb1.png) 启动环境 plain docker-compose up -d 蚁剑连接 ![](https://img-blog.csdnimg.cn/img_convert/81a5c09987e18355335d07e4da52cb5f.png) 打开终端寻找flag …

ACL:访问控制列表

基本概念 1.访问控制: 在路由器的入或者出的接口上,匹配流量,之后产生动作,只有允许和拒绝。 2.定义感兴趣流量: 帮助其他策略抓流量的 匹配规则:至上而下 逐一匹配 上条匹配按照上条执行 不再查看下条 (思科体系中 末尾隐含拒绝所有 华为…

20个月投标战胜国际对手,中国百余台AGV进驻欧洲……

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 在全球智能制造竞争日益激烈的今天,中国制造再次传来振奋人心的好消息。 经过长达20个月的艰苦角逐,一家中国机器人企业(新松机器人)成…

microsoft edge浏览器卡死问题

win11经常遇到microsoft edge浏览器卡死的情况,有时候是一会没用浏览器就全部卡死,有时候是锁屏或者电脑休眠浏览器就不能用,找了很多的办法都没好使,用以下方法好使了: edge浏览器中打开 edge://settings/system 把 …

计算机的错误计算(一百二十三)

摘要 探讨算式 的计算精度问题。 例1. 已知 计算 不妨在Python下计算,则有: 若用Rust在线计算: fn main() {let x: f64 0.125e-6;let tan_x x.tan();let sin_x x.sin();let denominator x - (1.0 x * x).sqrt();let result (…

大学模拟电路设计期末速成总结

大学模拟电路设计期末速成总结 模拟电路设计是电子工程领域的基础,它涉及到连续信号的处理和放大。对于电子工程的学生来说,掌握模拟电路设计的基本原理和应用是至关重要的。以下是期末速成总结,帮助你快速回顾和掌握模拟电路设计的关键知识…

香橙派刷机和开发环境准备(ubuntu22.04版)_随记1

前言: 一、香橙派刷ubuntu系统和SSH登录 1、刷机前准备: ①TF卡(8G)、读卡器、OrangePi5Pro ②Win32DiskImager(烧写系统工具)、SDFormatter(TF格式化工具) ③系统镜像&#xff…

学习文档(4)

目录 Vue简介 MVVM思想 Vue指令 内容输出指令 条件渲染指令 列表渲染指令 数据绑定指令 Vue简介 Vue2.x官网:https://v2.cn.vuejs.org Vue3.x官网:https://cn.vuejs.org 官网(2.x版本)对vue的定义是:vue是一套…

kubelet PLEG实现

概述 kubelet的主要作用是确保pod状态和podspec保持一致,这里的pod状态包括pod中的container状态,个数等。 为了达到这个目的,kubelet需要从多个来源watch pod spec的变化,并周期从container runtime获取最新的container状态。比如…

I2C相关结构体讲解:i2c_adapter、i2c_algorithm、i2c_msg

往期内容 I2C子系统专栏: I2C(IIC)协议讲解SMBus 协议详解 总线和设备树专栏: 专栏地址导航篇 – 专栏未篇 1.框图 建议右击图片在新标签页打开预览 i2c_transfer函数就是读取i2c设备的信息或者输出信息给i2c设备的函数 比如发送…

信息安全工程师(49)网络物理隔离系统与类型

前言 网络物理隔离系统是指通过物理隔离技术,在不同的网络安全区域之间建立一个能够实现物理隔离、信息交换和可信控制的系统,以满足不同安全域的信息或数据交换需求。 一、网络物理隔离系统概述 网络物理隔离系统的核心在于通过物理方式将不同安全级别的…

SQL Injection | SQL 注入概述

关注这个漏洞的其他相关笔记:SQL 注入漏洞 - 学习手册-CSDN博客 0x01:SQL 注入漏洞介绍 SQL 注入就是指 Web 应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是可控的,并且参数会带入到数据库中执行,导致…

【计算机网络篇】数据链路层 协议、介质访问控制

🧸安清h:个人主页 🎥个人专栏:【计算机网络】【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 系列文章目录 【计算机网络篇】计算机网络概述 【…

[实时计算flink]CREATE DATABASE AS(CDAS)语句

CDAS支持整库级别的表结构和数据的实时同步,还支持表结构变更的同步。本文为您介绍CREATE DATABASE AS(CDAS)的使用方法,并提供了多种使用场景下的示例。 背景信息 CDAS是CTAS语法的一个语法糖,用于实现整库同步、多…

在 Unity 中创建模型动画的探索之旅

在 Unity 游戏开发或 3D 场景构建中,模型动画是赋予虚拟对象生命和个性的关键元素。它能够极大地增强用户体验,使场景更加生动和吸引人。本文将带您深入了解在 Unity 中创建模型动画的基本流程和方法。 一、准备工作 在开始创建动画之前,您…

空间大数据的数据变换与价值提炼

在数字化时代,空间大数据正成为推动社会经济发展的关键因素。空间大数据不仅体量巨大,而且具有高速流转、多样类型和真实性等特点,它们在获取、存储、管理、分析方面超出了传统数据库软件工具的能力范围。地理信息系统(GIS&#x…