Every AI image generation system gives you control over what the character looks like. Pose, expression, outfit — these are the basics. But there’s a dimension most systems ignore entirely: how the photo is taken.
A candid street snap of your character walking through Shibuya feels completely different from a high-end editorial shot in a glass studio — even if she’s wearing the same outfit. The difference isn’t the subject. It’s the camera.
We built a shooting style preset system that separates “what the character does” from “how the camera captures it.” Here’s how it works and why it matters.
Table of contents
Open Table of contents
The Problem: All AI Photos Look the Same
Default AI image generation produces what we call “studio default” — perfectly lit, centered composition, the subject looking directly at camera. It’s technically good, but it all looks the same.
Compare these real photography styles:
| Style | Camera | Composition | Feel |
|---|---|---|---|
| Candid street | 85mm f/1.4, bokeh | Off-center, subject unaware | Natural, voyeuristic |
| Amateur selfie | Phone wide-angle, grainy | Arm extended, imperfect | Authentic, relatable |
| Dutch angle | 20° tilt | Diagonal tension | Dramatic, unsettling |
| Fashion editorial | Medium format, beauty dish | Symmetrical, deliberate | Polished, aspirational |
| Film vintage | Kodak Portra 400 | Warm faded tones | Nostalgic, emotional |
These aren’t just “vibes” — they’re specific technical parameters that AI image models respond to. The key is injecting them at the right point in the prompt pipeline.
Architecture: Prompt Injection Layers
Our existing image generation pipeline builds prompts in layers:
[Base Prefix] + [Expression/Pose] + [Scene] + [Clothing] + [Base Suffix]
Shooting styles add a new injection layer without touching the existing ones:
[Base Prefix] + [Expression/Pose] + [SHOOTING STYLE] + [Scene OR Style Scene] + [Clothing] + [Base Suffix]
↑ prompt_inject ↑ scene_inject override
Negative prompt: [expression negative] + [STYLE NEGATIVE]
↑ negative_inject
Each shooting style preset contains three injection strings:
street_snap:
label: "Street Snap"
category: "candid"
prompt_inject: >
candid street photography, subject unaware of camera,
natural movement, shallow depth of field,
85mm f/1.4 lens, bokeh background, off-center framing
scene_inject: >
busy city street, natural sunlight,
pedestrians in blurred background
negative_inject: >
looking at camera, posing, studio lighting,
centered composition
The prompt_inject controls camera and composition. The scene_inject overrides the environment. The negative_inject suppresses the “studio default” look.
The Five Categories
Candid — “She doesn’t know you’re watching”
The hardest style to achieve with AI because models default to posed, camera-aware subjects.
Key prompt ingredients:
subject unaware of camera— fights the model’s defaultoff-center framing— prevents the centered composition bias- Specific focal lengths (
85mm,28mm) — each creates a different spatial relationship candid snapshot feel— a meta-descriptor that works surprisingly well
Variants: Street snap (telephoto compression), caught off-guard (wide angle, motion blur), working (documentary style)
We use candid styles heavily in our multi-character candid photo system.
Angle — “The camera is the storyteller”
Camera angle changes the power dynamic between viewer and subject.
Key prompt ingredients:
dutch angle, 20 degree camera tilt— the model responds well to specific degree valueslow angle looking up— emphasizes legs and heightoverhead bird eye view— creates vulnerability
Pro tip: Combine with scene descriptions. A low-angle shot with “dramatic sky background” produces much better results than low angle alone.
Selfie — “Through her phone camera”
This breaks the fourth wall — the character is taking the photo herself.
Key prompt ingredients:
front camera wide angle distortion— the fish-eye look of phone selfiesarm extended holding phone— spatial cue the model understandsslightly grainy, indoor lighting— anti-quality keywords that create authenticitystrength_override: 0.50— we increase img2img strength because selfies need more departure from the base image
Negative prompt is critical: professional photography, studio lighting, DSLR, bokeh — you need to actively suppress quality markers.
Editorial — “Magazine cover material”
The opposite of candid — maximum polish and deliberate composition.
Key prompt ingredients:
ultra-clean modern editorial aesthetic— sets the overall quality barsymmetrical composition— fights the model’s tendency toward casual framingno grain, flawless digital precision— explicitly requested perfectionsharp focus on eyelashes and skin texture— directs the model’s detail budget
The high-end digital variant uses scene injection to create a futuristic studio environment: futuristic glass-walled pavilion, white reflective flooring, multi-directional soft light.
Atmospheric — “The mood is the subject”
Weather, time of day, and film stock become the defining elements.
Key prompt ingredients:
- Film stock names:
Kodak Portra 400,Fuji Superia— models have learned these color profiles - Environmental cues:
wet streets reflecting lights,golden hour backlight with lens flare available light only— a photography term that tells the model to use natural/existing light
Prompt Engineering Insights
If you’re new to prompt construction for image generation, our prompt engineering for immersive roleplay guide covers the fundamentals.
Lens focal lengths actually work
AI models have learned the visual characteristics of different focal lengths from training data:
| Focal Length | Effect | Best For |
|---|---|---|
| 28mm | Wide angle distortion, environmental context | Selfies, street context |
| 35mm | Natural perspective, documentary feel | Documentary, working shots |
| 50mm | ”Normal” human eye perspective | Film vintage, natural |
| 85mm | Portrait compression, subject isolation | Candid, editorial portraits |
| 135mm | Strong compression, extreme bokeh | Voyeuristic, telephoto stalker |
Negative prompts are half the battle
For candid styles, the negative prompt does more work than the positive prompt. The model’s default behavior is “posed studio photo” — you’re fighting upstream. Every candid-style preset includes looking at camera, posing, studio lighting in its negative prompt.
strength_override for style intensity
Our selfie presets use strength_override: 0.50 (vs the default ~0.30). This allows more deviation from the base image, which is necessary because:
- Selfie framing is fundamentally different from the base image composition
- Phone camera quality characteristics need room to emerge
- The “imperfect” aesthetic requires the model to break from the clean base
Implementation: Config-Driven Presets
The entire system is defined in config.yaml:
image_generation:
shooting_styles:
street_snap:
label: "Street Snap"
category: "candid"
prompt_inject: "candid street photography, ..."
scene_inject: "busy city street, ..."
negative_inject: "looking at camera, posing, ..."
amateur_selfie:
label: "Amateur Selfie"
category: "selfie"
prompt_inject: "amateur smartphone selfie, ..."
negative_inject: "professional photography, ..."
strength_override: 0.50
# ... 16 presets across 5 categories
Adding a new style is zero-code — just add a YAML block. The web UI dynamically loads presets from the config and groups them by category.
This works alongside base image switching, which controls what the character looks like while shooting styles control how the photo is taken.
Backend injection happens before the generation script is called. The shooting style’s prompt_inject is appended to the expression prompt, scene_inject overrides the scene, and negative_inject is appended to the negative prompt. No changes to the generation script itself.
Results: Same Character, Five Cameras
Using the same character (Suzune, our mascot) with the same outfit:
| Style | Result |
|---|---|
| Standard | Clean, centered, eye contact, studio feel |
| Street Snap | Off-center, looking away, city bokeh background |
| Amateur Selfie | Wide-angle distortion, grainy, arm visible |
| Dutch Angle | Tilted frame, dramatic tension |
| Film Vintage | Warm Kodak tones, slight grain, nostalgic |
The character is identical. Only the “camera” changed.
Key Takeaways
- Separate subject from camera — pose/expression and shooting style are independent axes of control
- Lens focal lengths work — AI models have learned real camera characteristics from training data
- Negative prompts fight defaults — for non-standard styles, suppressing the default is as important as describing the target
- Config-driven = extensible — new styles are YAML, not code
- strength_override enables radical styles — some styles (selfie, dutch angle) need more deviation from the base image
The gap between “AI-generated image” and “photograph” is shrinking — not because models are getting better at default studio shots, but because we can now tell them how to hold the camera.