OpenAI 圖像生成的基礎

OpenAI 提供了多種模型用于圖像生成,其中 DALL-E 系列是最為知名的。DALL-E 3 模型能夠生成 1024×1024 的高質量圖像,并支持多種尺寸的圖像輸出。

圖像生成的關鍵組件

在 Spring AI 框架中,核心的圖像生成接口是 ImageClient。這個接口通過 ImagePrompt 來描述我們希望生成的圖像。

ImagePrompt 的構建

ImagePrompt 包含了我們需要繪制的圖片信息,如繪圖指令 ImageMessage 和繪圖選項 ImageOptions。例如,我們可以通過以下代碼構建一個簡單的繪圖請求:

ImagePrompt imagePrompt = new ImagePrompt("幫我畫一張小狗的圖片",
    OpenAiImageOptions.builder()
        .withModel(OpenAiImageApi.ImageModel.DALL_E_3.getValue())
        .withHeight(1024)
        .withWidth(1024)
        .withResponseFormat("url")
        .build());

DALL-E 模型支持的圖片尺寸

不同版本的 DALL-E 模型支持的圖片尺寸有所不同:

通過合理配置 ImageOptions,我們可以生成所需尺寸和格式的圖像。

DALL-E 3 接口

Java 實現 DALL-E 3 圖像生成

在了解了基本概念之后,我們將通過一個簡單的例子來實現 DALL-E 3 的圖像生成接口。

控制器的實現

在 Spring Boot 項目中,我們可以通過 REST 控制器來處理圖像生成請求。以下是一個簡單的控制器實現:

package com.example.image;

import org.springframework.ai.image.ImageClient;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.ai.openai.OpenAiImageOptions;
import org.springframework.ai.openai.api.OpenAiImageApi;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class ImageController {
    private final ImageClient imageClient;

    public ImageController(ImageClient imageClient) {
        this.imageClient = imageClient;
    }

    @GetMapping("/image")
    public String generateImage(String prompt) {
        ImagePrompt imagePrompt = new ImagePrompt(prompt, OpenAiImageOptions.builder()
            .withModel(OpenAiImageApi.ImageModel.DALL_E_3.getValue())
            .withHeight(1024)
            .withWidth(1024)
            .withResponseFormat("url")
            .build());
        ImageResponse imageResponse = imageClient.call(imagePrompt);
        List results = imageResponse.getResults();
        String url = results.get(0).getOutput().getUrl();
        return String.format("%s", url, prompt);
    }
}

控制器實現

使用 Python API 實現高級圖像生成

在某些情況下,Java 環境可能不適合直接運行復雜的深度學習模型。這時,我們可以通過調用 Python API 來實現。

Python 端 API 服務器的實現

假設我們已經在 Python 中使用 Flask 搭建了 Imagen 模型的 API 服務器,以下是一個簡單的示例:

from flask import Flask, request, jsonify
from imagen import ImagenModel  # 假設已經有Imagen的實現

app = Flask(__name__)
model = ImagenModel()

@app.route('/generate_image', methods=['POST'])
def generate_image():
    data = request.json
    text = data.get('text', '')
    if text:
        image = model.generate(text)
        image.save('generated_image.png')
        return jsonify({"status": "success", "image_path": "generated_image.png"})
    else:
        return jsonify({"status": "error", "message": "No text provided"})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Java 端調用示例

下面是如何在 Java 中通過 HTTP 請求調用上述 Python API 的示例:

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import org.json.JSONObject;

public class ImagenClient {

    private static final String API_URL = "http://localhost:5000/generate_image";

    public static void main(String[] args) {
        try {
            URL url = new URL(API_URL);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoOutput(true);

            JSONObject jsonInput = new JSONObject();
            jsonInput.put("text", "A beautiful sunset over a mountain range");

            try (OutputStream os = connection.getOutputStream()) {
                byte[] input = jsonInput.toString().getBytes("utf-8");
                os.write(input, 0, input.length);
            }

            int responseCode = connection.getResponseCode();
            System.out.println("POST Response Code :: " + responseCode);

            if (responseCode == HttpURLConnection.HTTP_OK) {
                BufferedReader in = new BufferedReader(new InputStreamReader(
                        connection.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

                System.out.println(response.toString());
            } else {
                System.out.println("POST request not worked");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

結論

通過本文,我們詳細探討了如何在 Java 中調用 Imagen 3 API,實現從簡單的圖像生成到通過 Python API 進行復雜的圖像生成服務。結合這些方法,我們可以在 Java 應用中實現高效的圖像生成功能。

FAQ

  1. 問:如何在 Java 項目中集成 Imagen 3 API?

  2. 問:是否可以在 Java 環境中直接運行 Imagen 模型?

  3. 問:如何處理圖像生成的不同尺寸需求?

  4. 問:如何確保圖像生成請求的安全性?

  5. 問:Java 調用 Python API 是如何實現的?

上一篇:

Imagen 3 常用提示詞與生成藝術:詳解與應用

下一篇:

Paddlehub API 文生圖:探索深度學習的圖像生成應用
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費