Orux AI / Model notes
FLUX.2 Pro: Make an A4 Observation Worksheet in Python
Turn the existing FLUX.2 Pro fox example into a measured A4 worksheet. Reproduce the page in Python, preserve the full image and separate print scale from detail.

On this page
Build the page around the image you actually have
A square FLUX.2 Pro illustration can become an A4 observation worksheet without stretching the animal or asking the model to generate the worksheet text. Keep the full image in a measured square, typeset the questions separately and identify the picture as AI generated. The example here uses Orux's existing fox-in-snow case and delivers a real, reproducible page layout rather than a proposed prompt alone.
This is for an educator preparing a visual-literacy activity: learners describe visible details and distinguish observation from unsupported inference. It is not a zoological identification sheet or evidence of an animal sighting. The completed page leaves room for handwritten notes and asks what the illustration cannot establish. The code downloads the existing authorized example, assembles the page locally and saves a full-resolution PNG; it makes no generation request.

The existing model illustration supplies the subject; the worksheet is a local layout made from that same image, not another model output.
Start with the actual FLUX.2 Pro fox case
The source is the fox example on the Orux FLUX.2 Pro model page. Its saved generation input uses resolution: "1K" and aspect_ratio: "1:1", with this exact prompt:
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.
The word “photograph” is part of the generation request, not a claim that the result records a real animal. The existing output is an AI-generated 1,024 × 1,024-pixel illustration. We reused that saved result; no new FLUX.2 Pro call was made for this article.

Original public fox case, generated by FLUX.2 Pro. The 1,024 × 1,024 illustration is reused unchanged as source art, not presented as a wildlife photograph.
The visible composition matters to the layout. The fox's head sits toward the upper right of the animal, while its body and tail extend toward the lower left. Snow, a softly rendered tree background and warm edge lighting provide several observable details. Keeping the entire square preserves the tail, legs and surrounding context. Filling a tall page by stretching the square would distort these relationships; using a tight vertical crop would discard context that learners can describe.
For a different layout task that deliberately fills wide and tall web headers, see the Seedream responsive-crop guide. This worksheet instead keeps the entire source square.
A classroom question should stay close to those visible details. “Which parts of the picture suggest cold weather?” invites an explanation based on snow and the pictured setting. “Where was this photograph taken?” would imply provenance that the generated image does not supply. Do not infer a location, season, camera setting or animal behavior from visual realism alone.
Separate image-generation settings from page dimensions
The public Orux form checked on November 3, 2026 exposes only 1K resolution and 1:1 aspect ratio for this alias. The saved fox output matches that square format. The 2,480 × 3,508-pixel worksheet produced below is a locally assembled page, not an A4 image generated by FLUX.2 Pro.
Black Forest Labs' native dimension documentation describes broader FLUX.2 width and height controls. Those native capabilities do not establish additional controls in the current Orux form. For this workflow, use the actual square result you can access instead of depending on an unverified custom-size parameter.
The page follows the nominal A4 proportions of 210 × 297 mm, also listed in the W3C page-size reference. At a 300-pixel-per-inch page grid, rounding gives 2,480 × 3,508 pixels. The illustration occupies a 1,000 × 1,000-pixel box, with title and questions outside it. This keeps the image and editorial text independently editable in the source code.
The distinction is useful whenever text must remain exact. A spelling correction, translation or new question needs only a local layout edit, not another image-generation attempt. The exported PNG is flattened, so preserve the Python source and original asset as the editable master rather than expecting the PNG to contain separate text layers.
What the completed worksheet actually delivers
The page has a short title, an unchanged square image, three observation prompts and five ruled lines for notes. A visible caption identifies the picture as AI generated and says it is not a wildlife record. The code's English worksheet labels remain English in the previews; localized article captions explain the layout. To produce another worksheet language, replace the text strings and use a font that supports that script, then run the bounds checks again.
The three prompts serve different purposes. “What can you see?” asks for direct description. “What suggests cold?” asks learners to connect a conclusion to visual clues. “What is uncertain?” invites them to notice missing evidence. An answer key should distinguish a visible feature from a real-world assertion: the image contains snow-like ground; it does not establish a measured temperature or geographic location.
The image box is about 84.67 mm wide at the nominal print scale. Its source has 1,024 pixels across that width, giving an effective source density of 307.2 pixels per inch. This is different from merely writing “300 DPI” into a file. Metadata cannot invent image detail. Expanding the same source to 180 mm across would reduce its source density to about 144.5 pixels per inch, regardless of the page's metadata.
The 307.2 figure describes the source pixel budget before resampling. The code reduces the 1,024-pixel source to a 1,000-pixel box, so the rendered image area itself has 300 pixels per inch at the nominal page scale.

Actual locally exported worksheet, shown as a reduced web preview. English labels, three prompts and ruled notes sit outside the preserved square illustration; the caption explicitly identifies AI-generated art.
The embedded page is a reduced web preview. Generate the local PNG with the code for the full 2,480 × 3,508 export. No physical printer proof was performed, and a print dialog's “fit to page” setting can change the actual scale. Check paper size, printer margins, contrast and writing space on your own device before distributing a class set.
Cost comparison: reuse, one new image or ten candidates
Current Orux pricing for flux-2-pro, checked November 3, 2026, is 2.67024 Credits per image under the public default price row. With the configured conversion of 1 Credit = USD 0.005, that is USD 0.0133512 per image. The actual reusable asset is the saved 1K square case, and no unverified price for a different resolution is assumed.
| Workflow choice | New image requests | Planned Orux generation cost | What it changes |
|---|---|---|---|
| Reuse this existing authorized case and typeset locally | 0 | 0 incremental Credits (USD 0) | Worksheet wording, margins and layout |
| Generate one new candidate at the current listed rate | 1 | 2.67024 Credits (USD 0.0133512) | A different generated illustration |
| Generate ten candidates at the current listed rate | 10 | 26.7024 Credits (USD 0.133512) | More candidate images to review, not ten guaranteed usable worksheets |
Swipe horizontally to view the full table.
The zero row means no new model-generation charge for the reused asset. It does not mean all assets are free to reuse, or that software, staff time and printing have no cost. Use source material you are authorized to reuse. The other rows are arithmetic planning examples, not requests executed here, an account quote or a success-rate claim.
Separate the decision to obtain a different illustration from the decision to adjust a page. A wider note area is a typesetting problem. A completely different pose or scene requires different source art. Regenerating artwork to fix a worksheet heading introduces expense and visual variation without solving the underlying text-layout task. Check the current model price and the Orux API documentation before a later paid integration.
Reproduce the full page with Python
Use Python 3.9 or later and install Pillow with python3 -m pip install "Pillow>=10.1". Save this as make_card.py, then run python3 make_card.py in a writable directory. Pillow documents scalable default fonts and image saving. The program retrieves the existing public JPEG and makes a local layout; it never contacts a generation endpoint or uses an API key.
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()The actual local run verified a 1,024 × 1,024 source, a 2,480 × 3,508 export, 11 checked text bounds, a preserved 1:1 image ratio and no upscaling. Reopening the PNG reported approximately 299.9994 DPI, which is the rounded stored metadata representation used by this export. The image box remained 1,000 pixels across, giving the 84.67 mm width and 307.2 source pixels per inch described above.
The source hash check prevents silently rebuilding against a changed asset at the same URL. A mismatch requires inspecting and approving the replacement, not deleting the check to force success. The bounds guard checks this page's outer safe area; it does not automatically wrap translated text, detect every overlap or validate scientific content. Different fonts and Pillow versions can alter rendering, so examine the generated page after editing.
Review the layout before asking for different artwork
Start with the full animal silhouette and readable questions. Then check whether the spaces for answers match the activity: short descriptions fit the ruled notes area, while a long essay needs another page. Review the AI-image caption at the intended reading size, not only on a large desktop monitor. Keep the original prompt and source image with the layout so that later editors know what came from the model.
If the animal needs to be larger, calculate the resulting source density before enlarging it. If the questions need more room, move or shorten the separately typeset text before cropping the image. If the lesson requires verified anatomy, habitat or behavior, select vetted reference material for those claims rather than treating this generated illustration as evidence.
The finished artifact supports one concrete activity: observing an image while questioning its evidentiary limits. It does not turn FLUX.2 Pro into a field-recording tool. The useful division of work is simple: use the model's existing illustration for the visual subject, and use deterministic page layout for exact text, dimensions and writing space.
FAQ
Did FLUX.2 Pro generate the A4 worksheet?
No. FLUX.2 Pro generated the existing square fox illustration; Python assembled the A4-sized page, labels and writing area locally. The public Orux form checked here offers 1K and 1:1, not a verified A4 generation setting.
Does adding 300 DPI make the source more detailed?
No. DPI metadata affects intended print scale but does not add genuine source detail. The existing 1,024-pixel image provides about 307.2 source pixels per inch when placed in the worksheet's nominal 84.67 mm-wide box.
Must I generate another image to translate the questions?
No new image generation is needed to edit the separately typeset questions. Change the strings, select a suitable font for the language and inspect the new layout. The exported PNG is flattened, so keep the editable code and source image.
Can this worksheet teach facts about real foxes?
The worksheet supports visual description and discussion of uncertainty, not verified zoological claims. Its caption identifies the image as AI generated. Use vetted reference material when teaching anatomy, habitat or behavior.
What was actually tested for this article?
The local page export, asset hash, image dimensions, text bounds, nominal print-scale arithmetic and price multiplication were checked. No new model call, image-quality benchmark, physical print proof or classroom learning study was performed.
Build with these models through one API
One OpenAI-compatible API for chat, image, video and audio models, billed in Credits.
Related articles
Browse all articles →
Qwen Image 3.0 Pro Prompts: Poster Typography and Layout
Break down a real Qwen Image 3.0 Pro poster from Orux: title hierarchy, red-and-blue color choices, the original prompt and settings, and practical delivery checks.

gpt-6-luna API: Build JSON Inputs with an Allowlist
Build a smaller JSON input for gpt-6-luna API workflows by allowing only approved categories and status counts. The Python example excludes raw support messages; aggregate data still needs a disclosure review.

Qwen Image 3.0 API: Pricing, Pro vs Standard, Python
Qwen Image 3.0 API costs 6 Credits ($0.03) per image on Orux AI; Pro starts at 10.42 Credits. Compare both tiers, a real poster prompt and Python code.

