My last post on image editing with NB2 touched on transferring boring black on white text onto surfaces with lifelike application in exciting colors and mediums, but I thought I’d take a second to dive a little deeper into just how I did it exactly for those of you following along at home.
The whole crazy adventure started with a recon droid named Gus (don’t sue me Lucasfilm, I call him a “bot” or “drone” in my books), and a word I designed for Doors to the Stars’ lingua franca, Trade Pidgin.
Wulan’s name, specifically.

While I’ve had success with natural language prompts, I seem to get more reliable results for complex operations with JSON (don’t forget to set Thinking Mode to High regardless—Minimal can’t handle the complexity of these prompts). Note that unlike Flux.2 Max, Google hasn’t published an official JSON schema for NB2, so just use semantically logical element names and the model will (usually) figure it out.
Click here to expand for the JSON prompt if you want to try it out yourself.
{
"task": "Create a new image identical to @img2, with the addition of the glyphs shown in @img1 painted onto the surface at the position, scale, and orientation shown.",
"references": {
"_comment": "Two images, one delta. @img2 is the clean base. @img1 is @img2 with the glyphs composited in Photoshop — Vanishing Point filter for perspective, Warp transform for the baseline arc. The spherical distortion is pre-baked into @img1, so the model matches it rather than deriving it from text.",
"base": {
"source": "@img2",
"role": "Base image. Reproduce exactly — do not reframe, do not zoom out, do not alter anything."
},
"glyph_reference": {
"source": "@img1",
"role": "Shows the glyphs to add, at the correct position, scale, and orientation. These are invented fictional characters — do not pattern-match to any known writing system. Reproduce exactly as depicted."
}
},
"edit": {
"_comment": "The edit block is now only about how the glyphs are rendered — not where, not what size, not which way they're warped. All of that is answered by @img1. What the reference can't convey is material quality, color precision, and lighting behavior — so those stay.",
"rendering": {
"_comment": "NB2 defaults to clean printed text. Every clause here pushes against that. The surface conformance note ensures paint reads as applied to real geometry rather than floating above it.",
"value": "Handwritten fluorescent pink paint pen — casual, slightly wobbly, varying stroke weights. Physical paint with texture and thickness conforming to the hull surface features: the seam, the raised bead of epoxy sealant, and the flat plane of the central panel ring. Not a decal, not a blend layer, not a CGI effect."
},
"color": {
"_comment": "NB2 reads 'pink' as magenta or rose. The exclusions and 'hot' are load-bearing.",
"value": "Hot fluorescent pink. Not red, not magenta."
},
"lighting": {
"_comment": "Without this, NB2 lights the glyphs independently of the scene — they float or glow slightly. This anchors the paint strokes to the existing light source and adds the micro-shadow that paint thickness creates on a surface.",
"value": "Strokes lit consistently with the surrounding hull at that location. Not self-illuminated. Subtle shadow from paint thickness on downward and right-facing edges of each stroke."
},
"completeness": {
"_comment": "NB2 sometimes truncates the sequence when glyphs are complex or space feels tight. Flagging partial rendering as a failure condition rather than an acceptable result reduces this.",
"value": "Render the complete uninterrupted sequence. Partial rendering is a failure condition."
}
},
"rendering": {
"_comment": "NB2 drifts toward CGI aesthetics and introduces a purple/violet cast that compounds across edit chains. This block counteracts both. The Hasselblad spec grounds the model in photographic physics.",
"quality": "8K UHD photorealistic",
"style": "Photographic, not CGI or digital art",
"naturalism": "Do not apply effects as overlays. All details ultra high definition photorealistic."
},
"color": {
"_comment": "Helps suppress NB2's pernicious purple/violet cast it adds to everything. 'Flat photographic color' signals raw photograph, not color-graded film still.",
"white_balance": "Neutral white light",
"grading": "Flat photographic color. No color grading applied."
},
"camera": {
"_comment": "f/11 for deep depth of field — this is a detail shot, everything sharp. 80mm keeps perspective natural.",
"spec": "Shot on Hasselblad X2D 100C, 80mm f/11 — deep depth of field, all areas sharp."
}
}

The geometric pwrsepctive warp isn’t terrible, but it could be better. Sadly, further experimentation didn’t land me better results. I found this odd since I’ve had smashing success adding straight-on views of elements to parts of a spherical object before and it definitely understands 3D geometry, but alien graffiti apparently stymies it somewhat.
So I resorted to old school Warp Transform in Photoshop and fiddled around until I was more satisfied. Then I tweaked the prompt slightly and ran it with this reference image:

Shove that sucker in the oven for sixty seconds and voilà! *\o/*

I was curious if NB2 can’t perspective warp alien text so awesome because it has never seen it before, or just text in general, so I ran some tests:




But then I tried a physical component and got this…

Which gave me pause, because I’ve successfully slapped objects onto a curved surface before with geometric perspective warp—but it was always on a full sphere, not a detail crop of one quarter. I wondered if maybe the crop of the just the upper left quadrant of the sphere was the culprit…




Anyway, far more experimentation is required, but the great news is when it comes to nailing position and size, 60% of the time my annotated reference image trick works every time.


So I got that going for me.
Oh, and NB2 will make mistakes and do some crazy shit sometimes, because the developers at Google feed it acid, so if you get a wild generation don’t throw up your hands in frustration. Just rerun the prompt and reference images. Sometimes it takes a couple-three attempts.
And a sacrifice. Like an exotic chicken or unblemished turtledove.
Discover more from The Annex
Subscribe to get the latest posts sent to your email.
Ah, I failed on the proper sacrifice. I’ve been giving Claude vegetables instead of fancy birds.
Well, there’s your problem!
It’s so clear once someone points it out. Not even AI is motivated by carrots and lettuce.
Sometimes you gotta use the stick.
Not just threaten the stick, actually use the stick.
Words to live by.