Skip to main content
Orux AIOruxAI

Orux AI / 模型观察

FLUX.2 Pro 图片排版:用 Python 制作 A4 观察学习单

把 FLUX.2 Pro 已有狐狸案例排成 A4 学习单:保留完整方图,分开处理文字与插图,用实际 Python 导出核对尺寸、打印比例和复用成本。

Orux AI发布于 10 分钟阅读
FLUX.2 Pro 图片排版:用 Python 制作 A4 观察学习单 — 把 FLUX.2 Pro 已有狐狸案例排成 A4 学习单:保留完整方图,分开处理文字与插图,用实际 Python 导出核对尺寸、打印比例和复用成本。
文章目录

从实际拿到的图片出发设计页面

一张方形 FLUX.2 Pro 插图,可以在不拉伸动物、不让模型生成学习单文字的前提下,排成 A4 观察学习单。 把完整图片放进尺寸明确的正方形区域,单独排版问题,并标明图片由 AI 生成。本文使用 Orux 已有的雪地狐狸案例,交付一份真实生成、可以复现的版式,而不只是一条建议提示词。

这个场景面向准备视觉素养活动的教师:让学生描述看得见的细节,并区分观察与缺乏依据的推断。它不是动物学鉴定表,也不是动物出现记录。完成的页面为手写笔记留出空间,并追问插图无法证明什么。代码下载已有且获准使用的示例,在本地组装页面并保存完整分辨率 PNG,不会发起生图请求。

已有的FLUX.2 Pro狐狸插图,与使用同一图片在本地排版的A4观察学习单并列展示。
已有的FLUX.2 Pro狐狸插图,与使用同一图片在本地排版的A4观察学习单并列展示。

模型已有插图提供画面主体;学习单是用同一张图片制作的本地版式,不是另一份模型输出。

先看真实的 FLUX.2 Pro 狐狸案例

素材来自 Orux FLUX.2 Pro 模型页的 fox 示例。保存的生成输入为 resolution: "1K" 和 aspect_ratio: "1:1",原始提示词如下,保持原文:

Wildlife photograph of a red fox standing in fresh snow in a birch forest, soft snowflakes falling, warm rim light on its fur, shallow depth of field.

“photograph” 是生成请求中的用词,不代表输出记录了一只真实动物。已有结果是一张 AI 生成的 1,024 × 1,024 像素插图。本文复用保存的结果,没有新调用 FLUX.2 Pro。

FLUX.2 Pro已有案例:红狐站在雪中,背景是柔化的桦树,皮毛边缘有暖色光线。
FLUX.2 Pro已有案例:红狐站在雪中,背景是柔化的桦树,皮毛边缘有暖色光线。

FLUX.2 Pro 生成的原始公开狐狸案例。将这张 1,024 × 1,024 插图原样作为源素材复用,不把它当作野生动物实拍照片。

画面的构图会影响排版。狐狸头部位于动物身体的右上方,身体和尾巴向左下方延伸。雪地、柔化的树木背景和暖色边缘光,都能供学生观察。保留完整方图,可以留下尾巴、四肢与周围环境。为了铺满竖版页面而拉伸方图,会扭曲这些关系;直接紧裁成竖图,则会丢掉可以描述的环境信息。

如果要处理另一种版式任务——让图片铺满宽版和竖版网页头图,可以参考 Seedream 响应式裁切指南。本次学习单则保留完整方形源图。

课堂问题应该紧扣这些可见细节。“画面哪些部分让你联想到寒冷天气?”可以引导学生依据雪和所描绘的环境解释。“这张照片在哪里拍摄?”却暗示图片具有它并未提供的真实来源。不能只凭逼真的视觉效果,就推断地点、季节、相机设置或动物行为。

生图参数与纸张尺寸是两回事

2026 年 11 月 3 日核对的 Orux 公开表单,为这个 alias 仅提供 1K 分辨率与 1:1 比例。已有狐狸输出符合这个方形格式。下方生成的 2,480 × 3,508 像素学习单,是本地组装的页面,不是 FLUX.2 Pro 直接生成的 A4 图片。

Black Forest Labs 的原生尺寸文档介绍了更广泛的 FLUX.2 宽高控制。原生能力不能证明当前 Orux 表单也提供这些选项。本流程从实际可取得的方形结果出发,不依赖尚未验证的自定义尺寸参数。

页面采用 A4 标称 210 × 297 mm 的比例,W3C 页面尺寸参考也列出了这一规格。在每英寸 300 像素的页面网格上,四舍五入后得到 2,480 × 3,508 像素。插图占用 1,000 × 1,000 像素区域,标题和问题排在图外,因此可以在源代码中分别编辑图片与文字。

当文字必须准确时,这种拆分很有用。修正拼写、翻译内容或更换问题,只需修改本地版式,不必再次尝试生图。导出的 PNG 已经合并图层,所以应保留 Python 源码和原始素材作为可编辑母版,不要期待 PNG 本身含有独立文字图层。

完成的学习单具体包含什么

页面包含简短标题、完整方图、三个观察问题和五条笔记横线。可见图注标明图片为 AI 生成,并说明它不是野生动物记录。代码里的学习单标签为英文,预览也保留英文;本地化的文章图注会解释版式。若要制作另一种语言的学习单,应替换文字字符串,选择支持对应文字的字体,再次运行边界检查。

三个问题分别承担不同任务。“What can you see?”要求直接描述;“What suggests cold?”要求把结论与视觉线索联系起来;“What is uncertain?”提醒学生留意缺少的证据。参考答案应区分画面特征与真实世界断言:图中有类似积雪的地面,但不能因此得出实测温度或地理位置。

按标称打印比例,图片区宽约 84.67 mm。在这个宽度上,原图横向有 1,024 像素,有效源图密度为 307.2 像素/英寸。这与只在文件中写入“300 DPI”不同:元数据不会创造细节。如果把同一张源图铺到 180 mm 宽,有效源图密度会降至约 144.5 像素/英寸,无论页面元数据写什么。

307.2 这个数表示重采样前的源图像素预算。代码将 1,024 像素源图缩小到 1,000 像素区域,因此按标称页面比例,最终排版中的图片区本身为每英寸 300 像素。

实际导出的A4学习单:保留方形狐狸插图,另排观察问题、AI来源说明与笔记横线。
实际导出的A4学习单:保留方形狐狸插图,另排观察问题、AI来源说明与笔记横线。

实际本地导出的学习单,此处展示缩小后的网页预览。英文标签、三个问题和笔记横线位于保留完整内容的方形插图之外;图注明确说明图片为 AI 生成。

嵌入文章的页面只是缩小后的网页预览。运行代码,才能在本地生成完整 2,480 × 3,508 像素 PNG。本文没有做实体打印打样;打印对话框中的“适合页面”也可能改变实际比例。整班分发之前,应在自己的设备上检查纸张规格、打印机边距、对比度和书写空间。

费用比较:复用、一张新图与十张候选图

2026 年 11 月 3 日核对的 flux-2-pro 当前 Orux 公开默认单价为每图 2.67024 Credits。按当前配置 1 Credit = USD 0.005 换算,即每图 USD 0.0133512。本次实际复用的是保存的 1K 方形案例,没有假设其他分辨率的未核实价格。

流程选择新增生图请求计划中的 Orux 生图费用改变什么
复用本次已有且获准使用的案例,在本地排版0增量 0 Credits(USD 0)学习单措辞、边距与版式
按当前公示单价生成一张新候选图12.67024 Credits(USD 0.0133512)更换生成插图
按当前公示单价生成十张候选图1026.7024 Credits(USD 0.133512)增加待审图片,不保证得到十份可用学习单

左右滑动查看完整表格。

零费用这一行,只表示复用现有素材没有新增模型生图费用,不代表所有素材都可免费复用,也不代表软件、人工和打印没有成本。应使用获准复用的素材。另外两行是算术规划示例,不是本文已执行的请求、账户实时报价或成功率承诺。

需要把“换一张插图”与“调整一个页面”分开决策。扩大笔记区域属于排版问题;完全不同的姿势或场景则需要不同的源图。为了修正学习单标题而重新生成插图,只会引入费用与画面变化,没有解决文字排版本身的问题。以后接入付费调用前,应核对当前模型售价与 Orux API 文档。

用 Python 复现完整页面

使用 Python 3.9 或更高版本,并通过 python3 -m pip install "Pillow>=10.1" 安装 Pillow。将以下内容保存为 make_card.py,在可写目录中运行 python3 make_card.py。Pillow 文档说明了可缩放默认字体与图片保存方法。程序读取已有的公开 JPEG,在本地排版,不会访问生图端点,也不使用 API Key。

Python
import hashlib
import io
import json
import urllib.request
from pathlib import Path
from PIL import Image, ImageDraw, ImageFont

URL = 'https://orux-ai.oss-cn-hongkong.aliyuncs.com/model-examples/9129330888225451304/b90f1d3428e4759fb18de8a1781769dc81ddfc45725a21d6982692c107812698.jpg'
SHA = 'b90f1d3428e4759fb18de8a1781769dc81ddfc45725a21d6982692c107812698'
OUT = Path('fox-card.png')
PAGE = (2480, 3508)  # Rounded A4 pixel grid at 300 pixels per inch.
DPI = 300
BOX = (180, 550, 1000, 1000)  # x, y, width, height; preserve full square.


def label(draw, xy, value, size, color='#17283b'):
    font = ImageFont.load_default(size=size)
    bounds = draw.textbbox(xy, value, font=font)
    if bounds[0] < 0 or bounds[1] < 0 or bounds[2] > PAGE[0] - 120 or bounds[3] > PAGE[1] - 120:
        raise ValueError('text exceeds safe page area')
    draw.text(xy, value, font=font, fill=color)
    return bounds


def main():
    with urllib.request.urlopen(URL, timeout=30) as response:
        data = response.read()
    if hashlib.sha256(data).hexdigest() != SHA:
        raise ValueError('source changed; inspect before reusing')
    source = Image.open(io.BytesIO(data)).convert('RGB')
    if source.size != (1024, 1024):
        raise ValueError('unexpected source dimensions')
    x, y, w, h = BOX
    if w > source.width or h > source.height:
        raise ValueError('layout would upscale source')
    page = Image.new('RGB', PAGE, 'white')
    draw = ImageDraw.Draw(page)
    bounds = []
    def write(xy, value, size, color='#17283b'):
        bounds.append(label(draw, xy, value, size, color))
    write((180, 180), 'LOOK CLOSELY', 112)
    write((180, 340), 'Describe the image. Test your assumptions.', 56)
    page.paste(source.resize((w, h), Image.Resampling.LANCZOS), (x, y))
    write((1320, 580), 'VISIBLE CLUES', 60)
    for i, line in enumerate(['1. What can you see?', '2. What suggests cold?', '3. What is uncertain?']):
        write((1320, 740 + i * 210), line, 48)
    write((180, 1650), 'AI-generated illustration | FLUX.2 Pro', 44, '#5b6470')
    write((180, 1720), 'Not a wildlife record.', 44, '#5b6470')
    write((180, 1940), 'OBSERVATION NOTES', 62)
    for line_y in [2100, 2280, 2460, 2640, 2820]:
        draw.line((180, line_y, 2300, line_y), fill='#bac4cd', width=3)
    write((180, 3010), 'Name: __________________  Date: ______________', 46)
    write((180, 3220), 'Example image: orux.top/models/flux-2-pro', 40, '#5b6470')
    page.save(OUT, dpi=(DPI, DPI))
    reopened = Image.open(OUT)
    assert reopened.size == PAGE
    assert abs(reopened.info['dpi'][0] - DPI) < 0.1
    source_ppi = source.width / (w / DPI)
    result = {'sourceSha256': SHA, 'sourceSize': source.size,
              'pageSize': PAGE, 'storedDpi': reopened.info['dpi'],
              'imageBox': BOX, 'displayWidthMm': w / DPI * 25.4,
              'effectiveSourcePpi': source_ppi,
              'sourceAspectPreserved': w / h == source.width / source.height,
              'upscaled': False, 'textBoundsChecked': len(bounds),
              'outputSha256': hashlib.sha256(OUT.read_bytes()).hexdigest()}
    print(json.dumps(result, indent=2))

if __name__ == '__main__':
    main()

实际本地运行核对了 1,024 × 1,024 源图、2,480 × 3,508 导出尺寸、11 个文字边界、保持 1:1 的图片比例以及未发生放大。重新打开 PNG 后读取到约 299.9994 DPI,这是本次导出所保存元数据的舍入表示。图片区仍为横向 1,000 像素,对应前文的 84.67 mm 宽与每英寸 307.2 个源图像素。

源图哈希检查可以阻止同一 URL 下素材变化后,程序仍悄悄拿新图重建。出现不匹配时,应检查并批准替换素材,而不是删掉检查强行通过。边界检查只核对本页外侧安全区域,不会自动给译文换行、发现所有重叠或验证科学内容。字体和 Pillow 版本也可能改变呈现,所以编辑后仍要检查实际页面。

先审版式,再决定是否需要别的插图

先检查动物轮廓是否完整、问题是否可读,再看答题空间是否符合活动需要:简短描述适合横线笔记区,长篇作文就需要另一页。AI 图片说明也要按预定阅读尺寸检查,不能只在大屏桌面显示器上看。将原始提示词与源图随版式一起保存,让后续编辑者知道哪些内容来自模型。

如果需要让动物更大,放大之前先算清源图密度。如果问题需要更多空间,应先移动或缩短独立排版的文字,再考虑裁图。如果课程要讲授准确的解剖、栖息地或行为,应为这些断言选择经过审核的参考资料,而不是把生成插图当成证据。

完成的成品支持一项具体活动:观察图像,同时质疑它的证据边界。它不会把 FLUX.2 Pro 变成野外记录工具。合适的分工是:用模型已有插图提供视觉主体,用确定性的页面排版控制准确文字、尺寸和书写空间。

常见问题

A4 学习单是 FLUX.2 Pro 生成的吗?

不是。FLUX.2 Pro 生成了已有的方形狐狸插图,Python 则在本地组装 A4 大小页面、标签与书写区域。本次核对的 Orux 公开表单提供 1K 和 1:1,没有经过验证的 A4 生图设置。

写入 300 DPI 能让源图更清晰吗?

不能。DPI 元数据影响预期打印比例,不会增加真实源图细节。已有的 1,024 像素图片放进学习单标称 84.67 mm 宽的区域时,约能提供每英寸 307.2 个源图像素。

翻译问题时必须重新生图吗?

修改单独排版的问题,不需要新增生图。替换字符串,选择适合对应语言的字体,并检查新版版式即可。导出的 PNG 已合并图层,因此应保留可编辑代码与源图。

可以用这份学习单讲授真实狐狸的知识吗?

这份学习单支持视觉描述与不确定性讨论,不提供经过验证的动物学事实。图注已说明图片由 AI 生成。讲解解剖、栖息地或行为时,应使用经过审核的参考资料。

本文实际测试了哪些内容?

核对了本地页面导出、素材哈希、图片尺寸、文字边界、标称打印比例计算和价格乘法。没有新模型调用、图像质量基准、实体打印打样或课堂学习效果研究。

在 Orux AI 试用 Orux FLUX.2 Pro 模型页在模型页在线试用,并查看价格与 API 示例。打开模型

用一个 API 调用这些模型

一个 OpenAI 兼容 API,覆盖对话、图像、视频与音频模型,按积分计费。