Photo to painting AI: turn a photo into a painting
Turn a photo into a painting with AI: send it as a reference image, name the style in the prompt, and keep its shape with aspect_ratio auto.

To turn a photo into a painting with AI, send the photo to an image model as a reference and name the painting style in the prompt, for example "make this scene look like a watercolor painting". The model redraws the scene in that style instead of filtering your pixels, so small details can change. On Sume this is one POST /v1/images request: the photo's public HTTPS URL goes in input_references, and the style goes in prompt.
The fields and limits below come from Sume's Image API docs and the model catalog that GET /v1/images/models serves, read on 2026-09-27. The watercolor prompt is the docs' own image-to-image example.
How do I turn a photo into a painting with the Sume API?
Host the photo at a public HTTPS URL, pick a model that edits from reference images, and describe the painting you want. The request below asks ChatGPT Image 2.5 for two oil-painting versions of one photo.
- Reference URLs must be public HTTPS. Localhost, private-network, and non-HTTPS URLs are rejected before submission.
- On edit calls, the docs recommend
aspect_ratio: "auto"so the painting matches the photo's shape. Leaving the field out is not the same as sendingauto. - A finished call returns
200with Sume-hosted, signed URLs indata[].url, so save the paintings you keep. A request still running after 30 seconds returns202with a job to poll instead.
curl -X POST "https://api.sume.com/v1/images" \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-image-2.5",
"prompt": "Turn this photo into an oil painting with visible brushstrokes. Keep the people and the layout.",
"input_references": [
{ "type": "image_url", "image_url": { "url": "https://example.com/photo.jpg" } }
],
"aspect_ratio": "auto",
"n": 2
}'Which painting styles can I ask for?
You name it in words. Today the request has no style preset and no style-strength field, so the prompt carries both the look and how far to push it.
- Name the medium: watercolor, oil, gouache, charcoal, or pencil.
- Describe the look: loose or tight brushwork, a limited palette, visible paper or canvas texture.
- Say what must stay, such as the faces, the pose, or the layout, and say what may be simplified, such as a busy background.
- Ask for a few versions with
nand keep the one you like. Each call returns a fresh set.
Can I copy the style of one painting onto my photo?
Yes. Send both images as references and say in the prompt which one is the photo and which one sets the style. In the current request schema, a reference carries no role, only type: "image_url" and its URL, so name each image by what it shows rather than by its position: "Repaint the harbor photo in the style of the painting with thick blue brushstrokes. Keep the boats and the skyline from the photo."
The two ChatGPT Image 2.5 ids take up to 16 reference images; ChatGPT Image 2 and the two Nano Banana models take up to 10 today. A copied style is still a new rendering, so compare the result with both sources before you use it.
Which fields does a photo-to-painting request need?
Five fields cover it. openai/gpt-image-2.5, openai/gpt-image-2.5-sunburst, openai/gpt-image-2, google/nano-banana-2, and google/nano-banana-pro all edit from references and list auto for aspect_ratio. Image generation API models compares the whole catalog, and reference images covers the reference mechanics.
| Field | What to send | Limit |
|---|---|---|
model | An edit-capable id, such as openai/gpt-image-2.5 | Models whose input_references range is {"min": 0, "max": 0} are text-to-image only and reject references |
prompt | The painting style, and what must stay | Required |
input_references | The photo, plus a painting if you want to copy its style | Up to 16 on ChatGPT Image 2.5, 10 on the other models above |
aspect_ratio | "auto", to keep the photo's shape | Only models that list auto accept it |
n | How many versions to return | Up to 4 on the models above |
What does it cost, and what can go wrong?
Image generation billing is all-or-nothing: a completed generation is billed in full, and a failed or canceled one is not billed. The response's usage.cost is the USD amount billed to your wallet, and per-model prices are listed in GET /v1/images/models.
- A parameter the model does not list, such as
qualityon Nano Banana, is rejected with400 unsupported_parameterrather than silently dropped. - A reference sent to a text-to-image-only model is rejected.
- The painting is a new image. Faces, text, and small objects can change, so check the result against the photo.
Sources
Related posts
More in Models
- Seamless loop AI video: make a clip end where it starts
To loop an AI video, send one image as both its first and last frame, then compare the two ends before you loop it. Which models take an end frame.
- Seedance 2.5 API: 30-second clips, resolutions, references
Seedance 2.5 on Sume is seedance-2.5: 4–30 second clips at 480p, 720p, or 1080p. The documented limits, inputs, and billing for each Seedance id.
- Sora 2 API shutdown: moving video generation calls
OpenAI shut down its Videos API and Sora 2 models on 2026-09-24. How the old fields map to Sume's POST /v1/videos, and why the model id must change.
- What is an AI video seed? How to repeat a result without one
A seed fixes a generator's random starting point. Sume's video models take none and refuse the field. How to keep a clip or a look without one.
Written by Sume