原本是想用ComfyUI來做,但有點複雜,所以就先玩玩Azure AI提供的API。

我使用的模型是dall-e-3,原本想用威力更強的gpt-image-1,但這個需要申請且不容易通過,所以就用舊模型。

而使用的方式也很簡單,官方甚至只給curl的範例XD

首先對針API回傳的JSON格式建立對應的類別:

public class ImageResult
{
    public ImageResultData[] data { get; set; } = Array.Empty<ImageResultData>();
}

public class ImageResultData
{
    public string? revised_prompt { get; set; } = string.Empty;
    public string? url { get; set; } = string.Empty;
}

再來就是透過HttpClient來呼叫API:

var requestMessage = new HttpRequestMessage(HttpMethod.Post, "your endpoint");
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "your API key");
requestMessage.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var requestModel = new
{
    model = "Text-Image-Peter",
    prompt = "your prompt",
    n = 1,
    style = "vivid",
    quality = "standard",
    size = "1024x1024"
};
requestMessage.Content = new StringContent(System.Text.Json.JsonSerializer.Serialize(requestModel), Encoding.UTF8, "application/json");
var response = await _httpClient.SendAsync(requestMessage);
var stream = await response.Content.ReadAsStreamAsync();
StreamReader streamReader = new StreamReader(stream);
string jsonStr = streamReader.ReadToEnd();

拿到response後就可以下載圖片了:

ImageResult imageResult = System.Text.Json.JsonSerializer.Deserialize<ImageResult>(jsonStr);
if (imageResult != null && (imageResult.data != null && imageResult.data.Count() != 0))
{
    Console.WriteLine($"Revised Prompt: {imageResult.data[0].revised_prompt}");
    Console.WriteLine($"Image URL: {imageResult.data[0].url}");

    string fileName = $"{DateTime.Now:yyyyMMddHHmmss}.png";
    HttpClient httpClient = new HttpClient();
    using var downloadStream = await httpClient.GetStreamAsync(imageResult.data[0].url);
    using var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write);
    await downloadStream.CopyToAsync(fileStream);
    await fileStream.FlushAsync();
    fileStream.Close();
}
else
{
    Console.WriteLine("Failed to deserialize the response.");
}

參考資料