Generuj obrazy

Gemini API obsługuje generowanie obrazów za pomocą modelu Gemini 2.0 Flash Experimental i za pomocą Imagen 3. Z tego przewodnika dowiesz się, jak zacząć korzystać z obu modeli.

Generowanie obrazów za pomocą Gemini

Gemini 2.0 Flash Experimental obsługuje wyświetlanie tekstu i obrazów wstawianych. Dzięki temu możesz używać Gemini do konwersacyjnego edytowania obrazów lub generowania wyników z przeplatanym tekstem (np. do generowania wpisu na blogu z tekstem i obrazami w jednym obrocie). Wszystkie wygenerowane obrazy zawierają znak wodny SynthID, a obrazy w Google AI Studio – także widoczny znak wodny.

.

Ten przykład pokazuje, jak za pomocą Gemini 2.0 wygenerować dane wyjściowe zawierające tekst i obraz:

from google import genai
from google.genai import types
from PIL import Image
from io import BytesIO
import base64

client = genai.Client()

contents = ('Hi, can you create a 3d rendered image of a pig '
            'with wings and a top hat flying over a happy '
            'futuristic scifi city with lots of greenery?')

response = client.models.generate_content(
    model="gemini-2.0-flash-exp-image-generation",
    contents=contents,
    config=types.GenerateContentConfig(
      response_modalities=['Text', 'Image']
    )
)

for part in response.candidates[0].content.parts:
  if part.text is not None:
    print(part.text)
  elif part.inline_data is not None:
    image = Image.open(BytesIO((part.inline_data.data)))
    image.save('gemini-native-image.png')
    image.show()
const { GoogleGenerativeAI } = require("@google/generative-ai");
const fs = require("fs");

const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);

async function generateImage() {
  const contents = "Hi, can you create a 3d rendered image of a pig " +
                  "with wings and a top hat flying over a happy " +
                  "futuristic scifi city with lots of greenery?";

  // Set responseModalities to include "Image" so the model can generate  an image
  const model = genAI.getGenerativeModel({
    model: "gemini-2.0-flash-exp-image-generation",
    generationConfig: {
        responseModalities: ['Text', 'Image']
    },
  });

  try {
    const response = await model.generateContent(contents);
    for (const part of  response.response.candidates[0].content.parts) {
      // Based on the part type, either show the text or save the image
      if (part.text) {
        console.log(part.text);
      } else if (part.inlineData) {
        const imageData = part.inlineData.data;
        const buffer = Buffer.from(imageData, 'base64');
        fs.writeFileSync('gemini-native-image.png', buffer);
        console.log('Image saved as gemini-native-image.png');
      }
    }
  } catch (error) {
    console.error("Error generating content:", error);
  }
}

generateImage();
curl -s -X POST \
  "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp-image-generation:generateContent?key=$GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [{
      "parts": [
        {"text": "Hi, can you create a 3d rendered image of a pig with wings and a top hat flying over a happy futuristic scifi city with lots of greenery?"}
      ]
    }],
    "generationConfig":{"responseModalities":["Text","Image"]}
  }' \
  | grep -o '"data": "[^"]*"' \
  | cut -d'"' -f4 \
  | base64 --decode > gemini-native-image.png

Przykładowy kod powinien zwracać obraz, a czasem też tekst.

Obraz latającego świni wygenerowany przez AI

W zależności od promptu i kontekstu Gemini będzie generować treści w różnych trybach (tekst na obraz, tekst na obraz i tekst itp.). Oto przykłady:

  • Tekst na obrazie
    • Przykładowy prompt: „Wygeneruj obraz wieży Eiffla z fajerwerkami w tle”.
  • Tekst na obraz(obrazy) i tekst (przeplatany)
    • Przykładowy prompt: „Wygeneruj ilustrowany przepis na paellę”.
  • Obrazy i tekst na obrazy i tekst (przeplatane)
    • Przykład promptu: (z obrazem umeblowanego pokoju) „Jakie inne kolory sof pasowałyby do mojego pokoju? Czy możesz zaktualizować obraz?”
  • Edytowanie obrazu (tekst i obraz na obraz)
    • Przykładowy prompt: „Edytuj to zdjęcie, aby wyglądało jak rysunek”
    • Przykładowy prompt: [obraz kota] + [obraz poduszki] + „Wyhaftuj ściegiem krzyżykowym mojego kota na tej poduszce”.
  • Edytowanie obrazu w wielu krokach (czat)
    • Przykładowe prompty: [prześlij zdjęcie niebieskiego samochodu]. „Zamień ten samochód na kabriolet”. „Zamień teraz kolor na żółty”.

Edytowanie obrazów za pomocą Gemini

Aby edytować obraz, dodaj obraz jako dane wejściowe. W tym przykładzie pokazano przesyłanie obrazów zakodowanych w formacie Base64. W przypadku większej liczby obrazów i większych zasobów danych zapoznaj się z sekcją Podawanie obrazów.

from google import genai
from google.genai import types
from PIL import Image
from io import BytesIO

import PIL.Image

image = PIL.Image.open('/path/to/image.png')

client = genai.Client()

text_input = ('Hi, This is a picture of me.'
            'Can you add a llama next to me?',)

response = client.models.generate_content(
    model="gemini-2.0-flash-exp-image-generation",
    contents=[text_input, image],
    config=types.GenerateContentConfig(
      response_modalities=['Text', 'Image']
    )
)

for part in response.candidates[0].content.parts:
  if part.text is not None:
    print(part.text)
  elif part.inline_data is not None:
    image = Image.open(BytesIO(part.inline_data.data))
    image.show()
const { GoogleGenerativeAI } = require("@google/generative-ai");
const fs = require("fs");

const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);

async function generateImage() {
    // Load the image from the local file system
    const imagePath = '/path/to/image.png';
    const imageData = fs.readFileSync(imagePath);
    const base64Image = imageData.toString('base64');

    // Prepare the content parts
    const contents = [
        { text: "Hi, This is a picture of me. Can you add a llama next to me?" },
        {
          inlineData: {
            mimeType: 'image/png',
            data: base64Image
          }
        }
      ];

  // Set responseModalities to include "Image" so the model can generate an image
  const model = genAI.getGenerativeModel({
    model: "gemini-2.0-flash-exp-image-generation",
    generationConfig: {
        responseModalities: ['Text', 'Image']
    },
  });

  try {
    const response = await model.generateContent(contents);
    for (const part of  response.response.candidates[0].content.parts) {
      // Based on the part type, either show the text or save the image
      if (part.text) {
        console.log(part.text);
      } else if (part.inlineData) {
        const imageData = part.inlineData.data;
        const buffer = Buffer.from(imageData, 'base64');
        fs.writeFileSync('gemini-native-image.png', buffer);
        console.log('Image saved as gemini-native-image.png');
      }
    }
  } catch (error) {
    console.error("Error generating content:", error);
  }
}

generateImage();
IMG_PATH=/path/to/your/image1.jpeg

if [[ "$(base64 --version 2>&1)" = *"FreeBSD"* ]]; then
  B64FLAGS="--input"
else
  B64FLAGS="-w0"
fi

IMG_BASE64=$(base64 "$B64FLAGS" "$IMG_PATH" 2>&1)

curl -X POST \
  "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp-image-generation:generateContent?key=$GEMINI_API_KEY" \
    -H 'Content-Type: application/json' \
    -d "{
      \"contents\": [{
        \"parts\":[
            {\"text\": \"'Hi, This is a picture of me. Can you add a llama next to me\"},
            {
              \"inline_data\": {
                \"mime_type\":\"image/jpeg\",
                \"data\": \"$IMG_BASE64\"
              }
            }
        ]
      }],
      \"generationConfig\": {\"responseModalities\": [\"Text\", \"Image\"]}
    }"  \
  | grep -o '"data": "[^"]*"' \
  | cut -d'"' -f4 \
  | base64 --decode > gemini-edited-image.png

Ograniczenia

  • Aby zapewnić najlepszą skuteczność, używaj tych języków: EN, es-MX, ja-JP, zh-CN, hi-IN.
  • Generowanie obrazów nie obsługuje danych wejściowych audio ani wideo.
  • Generowanie obrazów może nie zostać uruchomione, jeśli:
    • Model może generować tylko tekst. Spróbuj wyraźnie poprosić o wygenerowanie obrazu (np. „wygeneruj obraz”, „prześlij obrazy”, „zaktualizuj obraz”).
    • Model może przestać generować dane w trakcie procesu. Spróbuj ponownie lub użyj innego prompta.
  • Podczas generowania tekstu na potrzeby obrazu Gemini działa najlepiej, jeśli najpierw wygenerujesz tekst, a potem poprosisz o obraz z tekstem.

Wybierz model

Którego modelu użyć do generowania obrazów? To zależy od przypadku użycia.

Gemini 2.0 najlepiej nadaje się do tworzenia obrazów kontekstowo trafnych, łączenia tekstu i obrazów, uwzględniania wiedzy o świecie oraz wnioskowania na podstawie obrazów. Możesz go używać do tworzenia dokładnych, kontekstowo trafnych wizualizacji w długich sekwencjach tekstowych. Możesz też edytować obrazy w ramach konwersacji, używając języka naturalnego i utrzymywając kontekst podczas rozmowy.

Jeśli jakość obrazu jest dla Ciebie najważniejsza, wybierz model Imagen 3. Imagen 3 świetnie radzi sobie z realizmem fotograficznym, szczegółami artystycznymi i konkretnymi stylami artystycznymi, takimi jak impresjonizm czy anime. Imagen 3 to też dobre narzędzie do specjalistycznych zadań związanych z edycją obrazów, takich jak aktualizowanie tła produktów, skalowanie obrazów i dodawanie elementów marki oraz stylu do wizualizacji. Za pomocą Imagen 3 możesz tworzyć logo oraz inne projekty produktów z logo.

Generowanie obrazów za pomocą Imagen 3

Interfejs Gemini API zapewnia dostęp do Imagen 3, najwyższej jakości modelu Google do zamiany tekstu na obraz, który oferuje wiele nowych i ulepszonych funkcji. Urządzenie Imagen 3 umożliwia:

  • generować obrazy o większej szczegółowości, bogatszym oświetleniu i mniejszej liczbie rozpraszających artefaktów niż w przypadku poprzednich modeli.
  • Rozumienie promptów w języku naturalnym
  • generować obrazy w wielu formatach i stylach;
  • renderować tekst efektywniej niż poprzednie modele;

Przykład dotyczący Imagen

Z tej sekcji dowiesz się, jak utworzyć instancję modelu Imagen i wygenerować obrazy.

Po zainstalowaniu pakietu Google Gen AI SDK możesz użyć tego kodu do generowania obrazów:

PythonREST
from google import genai
from google.genai import types
from PIL import Image
from io import BytesIO

client = genai.Client(api_key='GEMINI_API_KEY')

response = client.models.generate_images(
    model='imagen-3.0-generate-002',
    prompt='Fuzzy bunnies in my kitchen',
    config=types.GenerateImagesConfig(
        number_of_images= 4,
    )
)
for generated_image in response.generated_images:
  image = Image.open(BytesIO(generated_image.image.image_bytes))
  image.show()
curl -X POST \
    "https://generativelanguage.googleapis.com/v1beta/models/imagen-3.0-generate-002:predict?key=GEMINI_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
        "instances": [
          {
            "prompt": "Fuzzy bunnies in my kitchen"
          }
        ],
        "parameters": {
          "sampleCount": 4
        }
      }'

Przykładowy kod powinien wygenerować 4 obrazy podobne do tego:

Obraz 2 puszystych królików w kuchni wygenerowany przez AI

Możesz też wypróbować notebooka Początki z ImagenemKsiążce kucharskiej Gemini.

Parametry modelu Imagen

W przypadku parametru generate_images() dostępne są te parametry:

  • prompt: prompt tekstowy dla obrazu.
  • number_of_images: liczba obrazów do wygenerowania, od 1 do 4 (włącznie). Wartość domyślna to 4.
  • aspect_ratio: zmienia format wygenerowanego obrazu. Obsługiwane wartości to "1:1", "3:4", "4:3", "9:16" i "16:9". Wartość domyślna to "1:1".
  • safety_filter_level: dodaje poziom filtra do filtrowania bezpieczeństwa. Te wartości są prawidłowe:
    • "BLOCK_LOW_AND_ABOVE": blokowanie, gdy wynik prawdopodobieństwa lub wynik wagi ma wartość LOW, MEDIUM lub HIGH.
    • "BLOCK_MEDIUM_AND_ABOVE": blokowanie, gdy wynik prawdopodobieństwa lub wynik wagi wynosi MEDIUM lub HIGH.
    • "BLOCK_ONLY_HIGH": blokowanie, gdy wynik prawdopodobieństwa lub wynik wagi jest HIGH.
  • person_generation: zezwalaj modelowi na generowanie obrazów przedstawiających ludzi. Obsługiwane wartości:
    • "DONT_ALLOW": blokowanie generowania obrazów przedstawiających ludzi.
    • "ALLOW_ADULT": generowanie obrazów przedstawiających dorosłych, ale nie dzieci. To jest ustawienie domyślne.

Niewidoczny cyfrowy znak wodny SynthID jest zawsze dodawany do wygenerowanych obrazów.

Język promptu tekstowego

Obsługiwane są te języki:

  • Angielski (en)

Co dalej?