From 1ec8d67357e0faf82cab4b56014393a72ff27251 Mon Sep 17 00:00:00 2001 From: DarthAffe Date: Sun, 17 Aug 2025 00:06:05 +0200 Subject: [PATCH] Updated readme --- README.md | 59 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 48c484d..e96dbe9 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ Based on https://github.com/leejet/stable-diffusion.cpp ## Usage ### Setup Install the [StableDiffusion.NET](https://www.nuget.org/packages/StableDiffusion.NET)-Nuget and at least one of the [Backend-Packages](https://www.nuget.org/packages?q=StableDiffusion.NET.Backend). +StableDiffusion.NET is using semantic versioning. Backend-packages are compatible as long as the version does only differ in the last digit. If GPU-support is available it will prefer this over CPU. If you want to add your own native-libraries or need more control over which backend to load, check the static `Backends` class. @@ -17,37 +18,43 @@ If you want to add your own native-libraries or need more control over which bac stable diffusion: ```csharp -using DiffusionModel model = ModelBuilder.StableDiffusion(@"") - .WithMultithreading() - .Build(); -``` +// Enable the Log- and Progress-events +StableDiffusionCpp.InitializeEvents(); -flux: -```csharp -using DiffusionModel model = ModelBuilder.Flux(@"", - @"", - @"", - @"") - .WithMultithreading() - .Build(); -``` +// Register the Log and Progress-events to capture stable-diffusion.cpp output +StableDiffusionCpp.Log += (_, args) => Console.WriteLine($"LOG [{args.Level}]: {args.Text}"); +StableDiffusionCpp.Progress += (_, args) => Console.WriteLine($"PROGRESS {args.Step} / {args.Steps} ({(args.Progress * 100):N2} %) {args.IterationsPerSecond:N2} it/s ({args.Time})"); -#### 2. create image +Image? treeWithTiger; +// Load a StableDiffusion model in a using block to unload it again after the two images are created +using (DiffusionModel sd = ModelBuilder.StableDiffusion(@"") + .WithMultithreading() + .WithFlashAttention() + .Build()) +{ + // Create a image from a prompt + Image? tree = sd.GenerateImage(ImageGenerationParameter.TextToImage("A beautiful tree standing on a small hill").WithSDXLDefaults()); + // (optional) Save the image (requires the HPPH System.Dawing or SkiaSharp extension) + File.WriteAllBytes("image1.png", tree.ToPng()); -with default parameters: -```csharp -IImage image = model.TextToImage(""); -``` + // Use the previously created image for an image-to-image creation + treeWithTiger = sd.GenerateImage(ImageGenerationParameter.ImageToImage("A cute tiger in front of a tree on a small hill", tree).WithSDXLDefaults()); + File.WriteAllBytes("image2.png", treeWithTiger.ToPng()); +} -with custom parameters: -```csharp -IImage image = model.TextToImage("", model.GetDefaultParameter().WithSeed(1234).WithSize(1344, 768)); -``` +// Load a flux kontext model +using DiffusionModel flux = ModelBuilder.Flux(@"", + @"", + @"", + @"") + .WithMultithreading() + .WithFlashAttention() + .Build(); -#### 3. (optional) save the image (requires System.Dawing or SkiaSharp extension) -```csharp -File.WriteAllBytes("output.png", image.ToPng()); +// Perform an edit on the previosly created image +Image? tigerOnMoon = flux.GenerateImage(ImageGenerationParameter.TextToImage("Remove the hill with the grass and place the tree with the tiger on the moon").WithFluxDefaults().WithRefImages(treeWithTiger)); +File.WriteAllBytes("image3.png", tigerOnMoon.ToPng()); ``` To process the resulting image further you can write your own extensions or install one of the [HPPH](https://github.com/DarthAffe/HPPH)-extension sets: