DALL-E 3 ile .NET'te Görüntü Üretimi ve Düzenleme
OpenAI DALL-E 3, doğal dil açıklamalarından yüksek kaliteli görüntüler üreten generatif bir AI modelidir. .NET uygulamalarınızda ürün görseli üretimi, içerik illüstrasyonu ve yaratıcı araçlar geliştirmek için kullanabilirsiniz.
Kurulum ve İstemci Yapılandırması
dotnet add package OpenAI
using OpenAI.Images;
public class ImageGenerationService
{
private readonly ImageClient _client;
public ImageGenerationService(IConfiguration config)
{
var openAiClient = new OpenAI.OpenAIClient(config["OpenAI:ApiKey"]!);
_client = openAiClient.GetImageClient("dall-e-3");
}
}
Temel Görüntü Üretimi
public async Task<GeneratedImage> GenerateImageAsync(
string prompt,
GeneratedImageSize? size = null)
{
var result = await _client.GenerateImageAsync(prompt,
new ImageGenerationOptions
{
Size = size ?? GeneratedImageSize.W1024xH1024,
Quality = GeneratedImageQuality.High,
Style = GeneratedImageStyle.Vivid,
ResponseFormat = GeneratedImageFormat.Uri
});
return result.Value;
}
// Kullanım
var image = await imageService.GenerateImageAsync(
"Modern bir yazılım ofisinde çalışan geliştiriciler, " +
"gündoğumunun ışığıyla aydınlanan geniş pencereler, minimalist tasarım");
Console.WriteLine($"URL: {image.ImageUri}");
Console.WriteLine($"Revize prompt: {image.RevisedPrompt}");
Görüntüyü Base64 Olarak Almak ve Kaydetmek
public async Task<string> GenerateAndSaveAsync(string prompt, string outputPath)
{
var result = await _client.GenerateImageAsync(prompt,
new ImageGenerationOptions
{
Size = GeneratedImageSize.W1792xH1024,
Quality = GeneratedImageQuality.High,
ResponseFormat = GeneratedImageFormat.Bytes
});
var bytes = result.Value.ImageBytes.ToArray();
await File.WriteAllBytesAsync(outputPath, bytes);
return outputPath;
}
Toplu Görüntü Üretimi
DALL-E 3, aynı anda yalnızca 1 görüntü üretir; birden fazla görüntü için paralel istek gönderin:
public async Task<IReadOnlyList<GeneratedImage>> GenerateBatchAsync(
IEnumerable<string> prompts,
int maxConcurrency = 3)
{
var semaphore = new SemaphoreSlim(maxConcurrency);
var tasks = prompts.Select(async prompt =>
{
await semaphore.WaitAsync();
try
{
return await GenerateImageAsync(prompt);
}
finally
{
semaphore.Release();
}
});
return await Task.WhenAll(tasks);
}
Prompt Mühendisliği Şablonları
public class ImagePromptBuilder
{
private string _subject = "";
private string _style = "";
private string _lighting = "";
private string _composition = "";
private string _quality = "professional quality, highly detailed";
public ImagePromptBuilder WithSubject(string subject) { _subject = subject; return this; }
public ImagePromptBuilder WithStyle(string style) { _style = style; return this; }
public ImagePromptBuilder WithLighting(string lighting) { _lighting = lighting; return this; }
public ImagePromptBuilder WithComposition(string composition) { _composition = composition; return this; }
public string Build()
{
var parts = new[] { _subject, _style, _lighting, _composition, _quality }
.Where(p => !string.IsNullOrWhiteSpace(p));
return string.Join(", ", parts);
}
}
// Kullanım
var prompt = new ImagePromptBuilder()
.WithSubject("ASP.NET Core mikroservis mimarisi diyagramı")
.WithStyle("teknik illüstrasyon, flat design, mavi-beyaz renk paleti")
.WithLighting("düz arka plan, yüksek kontrast")
.WithComposition("merkezi kompozisyon, bilgi grafikleri")
.Build();
İçerik Moderasyonu ve Hata Yönetimi
public async Task<ImageGenerationResult> SafeGenerateAsync(string prompt)
{
try
{
var image = await GenerateImageAsync(prompt);
return new ImageGenerationResult(image.ImageUri?.ToString(), Success: true);
}
catch (OpenAI.OpenAIException ex) when (ex.Message.Contains("content_policy"))
{
return new ImageGenerationResult(null, Success: false,
Error: "Prompt içerik politikasına aykırı.");
}
catch (OpenAI.OpenAIException ex) when (ex.Message.Contains("rate_limit"))
{
await Task.Delay(TimeSpan.FromSeconds(20));
var image = await GenerateImageAsync(prompt);
return new ImageGenerationResult(image.ImageUri?.ToString(), Success: true);
}
}
public record ImageGenerationResult(string? Url, bool Success, string? Error = null);
Azure Blob Storage ile Entegrasyon
public class ImageStorageService
{
private readonly ImageGenerationService _dalle;
private readonly BlobContainerClient _container;
public async Task<string> GenerateAndUploadAsync(string prompt, string blobName)
{
var result = await _dalle.GenerateImageAsync(prompt,
new ImageGenerationOptions { ResponseFormat = GeneratedImageFormat.Bytes });
await using var stream = result.ImageBytes.ToStream();
var blob = _container.GetBlobClient($"generated/{blobName}.png");
await blob.UploadAsync(stream, overwrite: true);
return blob.Uri.ToString();
}
}
MVC Controller Entegrasyonu
[ApiController]
[Route("api/[controller]")]
public class ImageController : ControllerBase
{
private readonly ImageGenerationService _service;
[HttpPost("generate")]
public async Task<IActionResult> Generate([FromBody] ImagePromptRequest request)
{
if (string.IsNullOrWhiteSpace(request.Prompt))
return BadRequest("Prompt gereklidir.");
if (request.Prompt.Length > 4000)
return BadRequest("Prompt çok uzun (max 4000 karakter).");
var result = await _service.SafeGenerateAsync(request.Prompt);
if (!result.Success)
return UnprocessableEntity(new { error = result.Error });
return Ok(new { url = result.Url });
}
}
public record ImagePromptRequest(string Prompt);
Maliyet ve Hız Göz Önünde Bulundurma
- DALL-E 3 HD 1024×1024: Yaklaşık .040/görüntü
- DALL-E 3 Standard 1024×1024: Yaklaşık .020/görüntü
- Gecikme: 10-30 saniye arası (HD daha uzun)
- Rate Limit: Varsayılan Tier 1'de dakikada 5 görüntü
Sonuç
DALL-E 3, .NET uygulamalarınıza güçlü görüntü üretme yetenekleri katar. Pazarlama materyali üretimi, kişiselleştirilmiş içerik, eğitim materyalleri ve yaratıcı araçlar için ideal bir çözümdür. İçerik politikası sınırlamalarını ve maliyet kontrolünü göz önünde bulundurarak, kullanım durumunuza uygun boyut ve kalite seçeneklerini belirleyin.