DEV Community

Olivia Perell
Olivia Perell

Posted on

Why I Stopped Wrestling With Photoshop and Rebuilt My Image Pipeline in Two Weeks

On 2025-04-12 I was racing to finish a set of marketing cards for a client (project codename: Atlas Cards) when a 400×300 scan, a handful of watermarked screenshots, and an art director with zero patience collided. I was on macOS, running Photoshop v24.3 and a half-broken pipeline of manual touchups. After two all-nighters and one ruined export, I decided to stop duct-taping fixes and rethink the whole image flow from generation to delivery.

I’ll tell you what went wrong, the experiments I ran across a few different tools, and the concrete trade-offs that made me change the pipeline. If you care about iteration speed, consistent quality, and fewer late-night manual fixes, the examples below will save hours. Keep reading-there’s a short set of runnable snippets and a clear before/after that you can reproduce.


First, I used an AI Image Generator to prototype dozens of background variants in minutes rather than sketching each one by hand. Mid-design I could spin up alternative color palettes or add subtle props that used to take half a day of Illustrator work. That immediate feedback loop changed the scope of what I could ship in a sprint.

The real trick wasn’t just generating images; it was building predictable prompts and keeping the output consistent for designers who needed reproducible assets. I began versioning prompts like code and storing the best seeds for later refinement. The saving wasn’t just time-it was lower context switching when designers had to recreate a look.


For quick mobile edits and on-device testing I kept an ai image generator app in my toolkit, which meant I could mock up ideas while commuting and drop them straight into the branch for review. The mobile app speed turned slack feedback into concrete artifacts faster than a whiteboard sketch.

Here’s a minimal example of how I automated generating a batch of images with the same prompt set. I run this as part of a CI job that prepares art for manual QA first.

Context: this Python snippet calls the generation endpoint, saves results locally, and tags them with metadata for later comparison.

import requests, json, os

API_KEY = "REDACTED"
prompt = "vibrant fantasy mountain landscape at sunset with dragons flying, cinematic, 4k"
resp = requests.post("https://crompt.ai/api/v1/generate",
                     headers={"Authorization": f"Bearer {API_KEY}"},
                     json={"prompt": prompt, "model": "open-style", "count": 3, "size":"2048x1152"})
data = resp.json()
for i, item in enumerate(data["images"]):
    b = requests.get(item["url"]).content
    fname = f"gen_{i}.png"
    with open(fname, "wb") as f: f.write(b)
    print("Saved", fname)
Enter fullscreen mode Exit fullscreen mode

When a scan looked unusable, I ran it through a Free photo quality improver step. That single step turned an otherwise-ruinous 400×300 scan into a usable 2048×1536 asset by reconstructing textures instead of simply sharpening pixels.

Below is the upscaling call I used inside a small worker that checks image dimensions and only submits files below a threshold. This is what converted a 0.6MP photo into print-ready artwork.

# upload and upscale (example)
curl -s -X POST "https://crompt.ai/api/v1/upscale" \
  -H "Authorization: Bearer $API_KEY" \
  -F "file=@./old_scan.jpg" \
  -F "scale=4" \
  -o upscaled.json

# result contains new_image_url, width, height
cat upscaled.json
Enter fullscreen mode Exit fullscreen mode

Screenshots and product images shipped with overlays-date stamps and captions-that needed removal. I incorporated a cleanup pass using the Remove Text from Image tool right after upscaling. Removing the overlay first, then upscaling, produced much cleaner fills where the tool had to reconstruct background texture.

I learned the hard way: run the remover before the upscaler for most cases. My first attempt was the other way around and produced patchy fills; the log showed a "fill artifact" cluster that I had to manually correct.

Example error I hit during early experiments (truncated):

POST /api/v1/remove-text 400 Bad Request
{"error":"selection_too_large","message":"Selected region exceeds inpainting limits, reduce brush size"}
Enter fullscreen mode Exit fullscreen mode

Fix: break the selection into smaller tiles, call the remover for each tile, then stitch - the process is slower but yields cleaner results than one giant inpaint call.


For detailed performance tuning I tracked exactly how much quality improved and how long each step took. The small dataset I ran across 40 images showed consistent gains: images that started at 640×360 became 2048×1152 with perceptual-quality gains (subjective user test favored the upscaled images 9/10 vs originals for product listing clarity). I also linked to notes on how diffusion models handle real-time upscaling to explain why some textures recover better than others and when the upscaler will hallucinate plausible but incorrect details.

Architecture decision: I replaced a manual two-person touchup stage with an automated 3-step pipeline (generate/remover/upscale) that runs as a Git-triggered job. Trade-offs: you add compute cost and some latency, but you remove the human-hours that used to be the bottleneck. Scenario where it fails: high-fidelity restoration for historical archives still needs a human conservator-this automated approach is not a silver bullet there.

Before/after snapshot example (concrete):

  • Before: 400×300, 60 KB, heavy JPEG blocking, 6 manual minutes to clean.
  • After: 2048×1536, 450 KB, clean texture fill, automated pipeline time 28s, human QA 45s.

Final thought: if you care about shipping consistent visual assets fast and maintaining a reproducible design pipeline, integrating an image generator plus targeted cleanup and a quality upscaler is a force multiplier. The approach I described cut the card-design stage from three days to one for the Atlas Cards sprint, and it’s now standard in our repo as a small CI job that any designer can trigger.

If you want to try this pattern, reproduce the snippets above on a throwaway project, log the before/after dimensions, and compare the manual edit time vs automated runtime. You’ll quickly see where automation saves human time and where it still needs human oversight.

Top comments (0)