Blog
PLEN

AI image generation w 2026 — Gemini 3.1 Pro vs Flux vs SDXL — co używam i kiedy

Cztery modele, trzy różne ceny, jeden case study (cover image dla bloga). Pokazuję dla jakiego use case'a co działa, gdzie API zaboli, i kiedy warto wrócić do Sharp + Canvas.

·7 min read
AI image generation w 2026 — Gemini 3.1 Pro vs Flux vs SDXL — co używam i kiedy

Po roku eksperymentów z różnymi modelami image generation mam dość konkretny ranking dla różnych zastosowań. To nie jest leaderboard ani benchmark, to zapis tego co realnie używam i dlaczego, z konkretnymi cenami, gotchami i przypadkami gdy żaden AI nie wygrał z procedural generation.

Modele które mnie obchodzą w 2026

ModelProviderStrengthCena (1 obraz)
Gemini 3.1 Pro ImagesGooglePhoto realism, text rendering~$0.040
Flux 1.1 ProBlack Forest LabsNajlepsza compozycja, brand asset look~$0.055
Flux schnellBlack Forest Labs (CF Workers AI)Speed, free tier$0 (CF)
SDXL LightningStability AI (CF Workers AI)Tekstury, abstract patterns$0 (CF)
DALL-E 3OpenAIWciąż dobry dla illustration~$0.040
Imagen 3GooglePhoto realism premium~$0.030

Czego nie używam:

  • Midjourney, community-first, brak API, nie nadaje się do automatyzacji
  • Stable Diffusion local, tylko jeśli lokalnie (RTX 3070+) i potrzebujesz wolności
  • Leonardo.ai, UI z nieba, ale API drogie i niespójne

Case study — cover images dla bloga

Mam 32 posty. Chciałem każdy mieć unikalny cover. Trzy podejścia spróbowałem:

Podejście 1 — Flux 1.1 Pro przez Replicate

Prompt template:

abstract dark technical illustration for a tech blog post about
"{title}". Color palette: deep black background (#0a0a0a) with neon
green accent (#00FF7F). Style: cyberpunk minimalism, code fragments
floating, terminal silhouettes, abstract data visualizations, 16:9
aspect ratio. No text, no people, no recognizable logos.

Wyniki: świetne wizualnie ale niespójne stylistycznie. Każdy obraz wygląda profesjonalnie, ale 32 razem wyglądają jak galeria różnych artystów, nie jak jeden brand.

Koszt: 32 × $0.055 = $1.76. Jak ktoś tania jest.

Podejście 2 — Gemini 3.1 Pro Images

Ten sam prompt template, lepsze typography rendering (próbowałem dodać overlay z tytułem inline w obrazie). Wyniki gorsze niż Flux dla abstrakcji, świetne dla photo-realistic scenariuszy.

Best for: posty z "human element" (np. „mój workflow", „rozmowa z klientem"). Worse for: abstract tech.

Podejście 3 — Sharp + Canvas, procedural (zwycięski wybór)

Po dwóch dniach generacji wróciłem do procedural. Każdy slug ma deterministyczny seed, generuje:

import sharp from "sharp";
import { createHash } from "crypto";
 
function slugSeed(slug: string): number {
  return parseInt(createHash("md5").update(slug).digest("hex").slice(0, 8), 16);
}
 
async function generateCover(slug: string, title: string) {
  const seed = slugSeed(slug);
  const hue = (seed % 360); // unique per slug
  const svg = `
    <svg width="1200" height="630">
      <defs>
        <radialGradient id="g" cx="20%" cy="10%">
          <stop offset="0%" stop-color="hsl(${hue}, 80%, 40%)" stop-opacity="0.4"/>
          <stop offset="60%" stop-color="#0a0a0a" stop-opacity="0"/>
        </radialGradient>
      </defs>
      <rect width="1200" height="630" fill="#0a0a0a"/>
      <rect width="1200" height="630" fill="url(#g)"/>
      <!-- accent grid pattern -->
      <pattern id="grid" width="60" height="60" patternUnits="userSpaceOnUse">
        <path d="M 60 0 L 0 0 0 60" fill="none" stroke="rgba(255,255,255,0.04)"/>
      </pattern>
      <rect width="1200" height="630" fill="url(#grid)"/>
    </svg>
  `;
  await sharp(Buffer.from(svg))
    .composite([{
      input: Buffer.from(`<svg><text x="80" y="350" font-size="68" font-family="Inter Black" fill="white">${title}</text></svg>`),
      top: 0, left: 0,
    }])
    .webp({ quality: 85 })
    .toFile(`public/blog/covers/${slug}.webp`);
}

Koszt: $0. Czas: 0.4s per obraz. Spójność: 100%. Maintenance: regeneruje się przy każdym buildzie jak chcę.

Dlaczego procedural wygrał:

  • Brand-spójne (każdy obraz ma to samo DNA, kolory, font, layout)
  • Reprodukowalne (commit do gita, regenerujesz lokalnie)
  • Zero API cost
  • Tytuł renderowany jako tekst, nie próba LLM-a "narysuj tekst"

Gdzie procedural przegrywa:

  • Photo-realistic content (Gemini wygrywa o lata)
  • Skomplikowane illustration (Flux)
  • Storytelling visuals (np. mockup product page), tylko AI

Porównanie API DX (developer experience)

Ranking kogo dobrze się integruje:

1. Replicate, REST API, polling job ID, output URL. Działają wszystkie modele (Flux, SDXL, Gemini, custom community models).

curl -X POST https://api.replicate.com/v1/predictions \
  -H "Authorization: Token $TOKEN" \
  -d '{"version": "...", "input": {"prompt": "..."}}'

2. Gemini API (Google AI Studio), JSON-in, base64-out. Dobrze udokumentowane, dla solo-devów łatwiejsze niż GCP setup.

3. Cloudflare Workers AI, najtańsze (free tier do 10k req/dzień), ale nie zwraca image bytes w MCP (bug znany od 03/2026). Direct REST API działa.

4. OpenAI Images API (DALL-E 3), działa OK, ale max 1024x1024 i drogo dla batch (rate limity dla DALL-E znacznie niższe niż dla GPT).

Quality benchmark (bez bias)

Daję ten sam prompt 4 modelom, oceniam by 5 osób:

Prompt: "Modern minimalist landing page hero illustration for a
booking website. Dark theme. Mountain silhouette in background.
Subtle accent color: forest green. Photo-realistic but stylized.
1200x630."

Wyniki (1-10):

ModelCompozycjaColor fidelity"Brand feel"Średnia
Flux 1.1 Pro9888.3
Gemini 3.1 Pro8978.0
DALL-E 37777.0
Flux schnell7766.7
SDXL6655.7

Flux wygrywa, ale Gemini bardzo blisko + tańszy o 30%.

Kiedy każdego używać — moja decision tree

  • Hero image dla landingu klienta (mountain, premium)Gemini 3.1 Pro ($0.04, photo-realistic)
  • Brand illustrations / 5 różnych obrazów do prezentacjiFlux 1.1 Pro ($0.055 ale top-tier consistency)
  • Wewnętrzne mockupy, draft, brainstormFlux schnell (CF, free)
  • Abstract patterns / texture backgroundsSDXL Lightning (CF, free)
  • Cover images dla 32 blog postów (potrzeba spójności)procedural Sharp ($0)
  • One-off social asset (Instagram post, banner)Gemini lub Flux w zależności od stylu

Ostrzeżenia i rzeczy które mnie zaskoczyły

1. Brand colors nie zawsze wychodzą. Próbowałem #00FF7F jako accent, Flux/Gemini interpretują "neon green" jako podobny ale nie identyczny. Jeśli MUSISZ exact color → procedural overlay.

2. Tekst na obrazie to żart. Wszystkie modele wciąż mają z tym problem (mimo że Gemini 3 jest najlepszy). Jeśli potrzebujesz tytułu, wygeneruj tło i nakładaj tekst przez Sharp/Canvas.

3. Model versioning w Replicate. Pinuj specific model version hash w API call. Jak przyjdzie nowa wersja, twoje obrazy będą inne. Pamiętaj że hash z dokumentacji może być stary.

4. Rate limity są bardziej restriction niż się wydaje. DALL-E 3 = 5 req/min dla Tier 1. Dla 32 obrazów to 6.5 minut blokady. Gemini i Replicate wyższe limity (50-200/min).

5. Watermarking w Imagen 3 / Gemini. Google wprowadził SynthID w generated images (invisible watermark). Nie wpływa na wygląd ale niektórzy klienci preferują "pure" generation, Flux nie ma tego.

Co robię dla klientów

Dla landingów małych firm (agroturystyka, pasieka, salon):

  • Hero image: ze stocku (Unsplash, Pexels), często wystarcza i wygląda autentycznie
  • Decorative illustrations: Flux 1.1 Pro raz, używamy dla całego brandbooka
  • Avatary/team photos: stock + AI fix-up (Photoshop AI generative fill)

Dla agentów AI / własnych projektów:

  • Cover images: procedural (jak ten blog)
  • Demo videos: ScreenStudio + manual overlay
  • Logo/brand: zewnętrzny grafik raz, nie AI (różnica jest)

Dla social posts:

  • Post graphics: Banner Maker (Sharp + template) lub Gemini per post
  • OG images: dynamic Next.js og endpoint (z Tailwind-like styling)

AI image gen w 2026 to dorosły toolkit. Wybór modelu zależy mocno od use case'a, nie od "który najlepszy". Dla mnie podział to: Flux dla brand assets, Gemini dla photo-realism, CF free tier dla draft, Sharp dla wszystkiego co potrzebuje spójności i $0 budżetu.

Najmądrzejsza zasada: ile razy ten obraz ma się odświeżyć? Raz → AI. 32 razy z brand consistency → procedural.