Freigeben über


Erste Schritte mit DER KI-Imageerstellung im Windows App SDK

Wichtig

Dieses Feature ist noch nicht verfügbar. Es wird erwartet, dass es in einer bevorstehenden experimentellen Kanalversion des Windows App SDK ausgeliefert wird.

Der experimentelle Kanal des Windows App SDK enthält APIs und Features in frühen Entwicklungsphasen. Alle APIs im experimentellen Kanal unterliegen umfangreichen Überarbeitungen und Breaking Changes und können jederzeit aus nachfolgenden Versionen entfernt werden. Sie werden nicht für die Verwendung in Produktionsumgebungen unterstützt, und Apps, die experimentelle Features verwenden, können nicht im Microsoft Store veröffentlicht werden.

Bilderstellungsfeatures werden vom Windows App SDK durch eine Reihe von KI-unterstützten APIs (Künstliche Intelligenz) unterstützt, die Bilder skalieren und schärfen (Bild-Superauflösung) sowie Objekte innerhalb eines Bilds (Image Segmentation) identifizieren können.

Api-Details finden Sie in der API-Referenz für KI-gesicherte Imageerstellungsfeatures im Windows App SDK.

Tipp

Geben Sie Feedback zu diesen APIs und deren Funktionalität, indem Sie ein neues Problem im GitHub-Repository des Windows App SDK erstellen. (Stellen Sie sicher, dass Sie die Imageerstellung in den Titel aufnehmen!)

Voraussetzungen

  • CoPilot+-PCs

    Hinweis

    AMD-basierte CoPilot+ PCs unterstützen keine Bild-Superauflösung.

Was kann ich mit dem Windows App SDK und der Bild-Superauflösung tun?

Verwenden Sie die neuen Features der AI Image Super Resolution im Windows App SDK, um Bilder zu schärfen und bilder zu schärfen, während sie skaliert werden.

Hinweis

Die Skalierung ist auf einen maximalen Faktor von 8x ge limted (höhere Skalierungsfaktoren können Artefakte und kompromittierte Bildgenauigkeit auslösen). Wenn die endgültige Breite oder Höhe größer als 8 x der ursprünglichen Werte ist, wird eine Ausnahme ausgelöst.

Erhöhen der Schärfe eines Bilds

Dieses Beispiel zeigt, wie Sie die Skalierung (targetWidth, targetHeight) eines vorhandenen Softwarebitmapbilds (softwareBitmap) ändern und seine Schärfe verbessern (wenn Sie die Schärfe verbessern möchten, ohne das Bild zu skalieren, geben Sie die ursprüngliche Bildbreite und -höhe an).

  1. Zunächst stellen wir sicher, dass das Image Super Resolution-Modell verfügbar ist, indem die IsAvailable-Methode aufgerufen und auf die Erfolgreiche Rückgabe der MakeAvailableAsync-Methode gewartet wird.
  2. Sobald das Bild-Superauflösungsmodell verfügbar ist, erstellen wir ein Objekt, um darauf zu verweisen.
  3. Anschließend rufen wir das endgültige Bild ab, indem wir das Originalbild und die zielorientierte Breite und Höhe des endgültigen Bilds mithilfe der ScaleSoftwareBitmap-Methode an das Modell übermitteln.
using Microsft.Windows.Imaging;
using Windows.Graphics.Imaging;

if (!ImageScaler.IsAvailable())
{
    var result = ImageScaler.MakeAvailableAsync();
    if (result.Status != PackageDeploymentStatus.CompletedSuccess)
    {
        throw result.ExtendedError;
    }
}

var imageScaler = await ImageScaler.CreateAsync();
var finalImage = imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight);
#include "winrt/Microsoft.Graphics.Imaging.h" 
#include "winrt/Windows.Graphics.Imaging.h" 
using namespace winrt::Windows::Graphics::Imaging; 
using namespace winrt::Microsoft::Graphics::Imaging; 

if (!ImageScaler::IsAvailable()) 
{ 
    auto result = ImageScaler::MakeAvailableAsync(); 
    if (result.Status() != AsyncStatus::Completed) 
    { 
        throw result.ErrorCode(); 
    } 
}

ImageScaler imageScaler = ImageScaler::CreateAsync().get(); 
ImageBuffer buffer = imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight); 

Was kann ich mit dem Windows App SDK und der Imagesegmentierung tun?

Bildsegmentierung kann verwendet werden, um bestimmte Objekte in einem Bild zu identifizieren. Das Modell verwendet sowohl ein Bild als auch ein "Hints"-Objekt und gibt eine Maske des identifizierten Objekts zurück.

Hinweise können über eine beliebige Kombination der folgenden Optionen bereitgestellt werden:

  • Koordinaten für Punkte, die zu dem gehören, was Sie identifizieren.
  • Koordinaten für Punkte, die nicht zu dem gehören, was Sie identifizieren.
  • Ein Koordinatenrechteck, das das identifizierte Rechteck einschließt.

Je mehr Hinweise Sie bereitstellen, desto präziser kann das Modell sein. Befolgen Sie jedoch diese Hinweise, um ungenaue Ergebnisse oder Fehler zu vermeiden.

  • Vermeiden Sie die Verwendung mehrerer Rechtecke in einem Hinweis, da sie eine ungenaue Maske erzeugen können.
  • Vermeiden Sie die Verwendung von Ausschlusspunkten ausschließlich ohne Einschließen von Punkten oder einem Rechteck.
  • Geben Sie nicht mehr als die unterstützten maximal 32 Koordinaten an (1 für einen Punkt, 2 für ein Rechteck), da dadurch ein Fehler zurückgegeben wird.

Die zurückgegebene Maske ist im Graustufen-8-Format. Die Pixel des identifizierten Objekts innerhalb der Maske sind 255 (die restlichen Werte sind 0 ohne Pixel, die dazwischen liegen).

Identifizieren eines Objekts innerhalb eines Bilds

Die folgenden Beispiele zeigen die verschiedenen Möglichkeiten zum Identifizieren eines Objekts innerhalb eines Bilds. Es wird davon ausgegangen, dass Sie bereits über ein Software-Bitmapobjekt (softwareBitmap) für die Eingabe verfügen.

  1. Zunächst stellen wir sicher, dass das Image Segmentation-Modell verfügbar ist, indem die IsAvailable-Methode aufgerufen und auf die erfolgreiche Rückgabe der MakeAvailableAsync-Methode gewartet wird.
  2. Sobald das Image Segmentation-Modell verfügbar ist, erstellen wir ein Objekt, um darauf zu verweisen.
  3. Als Nächstes erstellen wir eine ImageObjectExtractor-Klasse, indem wir das Bild abhängig vom Bildtyp an ImageObjectExtractor.CreateWithImageBufferAsync (oder CreateWithSoftwareBitmapAsync) übergeben.
  4. Anschließend erstellen wir ein ImageObjectExtractorHint -Objekt (wir zeigen weitere Möglichkeiten zum Erstellen eines Hinweisobjekts mit verschiedenen Eingaben weiter unten in diesem Thema).
  5. Schließlich übermitteln wir den Hinweis mithilfe der GetSoftwareBitmapObjectMask-Methode an das Modell, das das endgültige Ergebnis zurückgibt.
using Microsft.Windows.Imaging;
using Windows.Graphics.Imaging;

if (!ImageObjectExtractor.IsAvailable())
{
    var result = await ImageObjectExtractor.MakeAvailableAsync();
    if (result.Status != PackageDeploymentStatus.CompletedSuccess)
    {
        throw result.ExtendedError;
    }
}

ImageObjectExtractor imageObjectExtractor = 
  await ImageObjectExtractor.CreateWithSoftwareBitmapAsync(softwareBitmap);

ImageObjectExtractorHint hint(
    includeRects: null, 
    includePoints: 
        new List<PointInt32> { new PointInt32(306, 212), 
                               new PointInt32(216, 336)},
    excludePoints: null);
SoftwareBitmap finalImage = imageObjectExtractor.GetSoftwareBitmapObjectMask(hint);
#include "winrt/Microsoft.Graphics.Imaging.h" 
#include "winrt/Windows.Graphics.Imaging.h" 
using namespace winrt::Windows::Graphics::Imaging; 
using namespace winrt::Microsoft::Graphics::Imaging; 

if (!ImageObjectExtractor::IsAvailable()) 
{ 
    auto result = ImageObjectExtractor::MakeAvailableAsync(); 
    if (result.Status() != AsyncStatus::Completed) 
    { 
        throw result.ErrorCode(); 
    } 
}

ImageObjectExtractor imageObjectExtractor = 
  ImageObjectExtractor::CreateWithSoftwareBitmapAsync(softwareBitmap).get();

ImageObjectExtractorHint hint(
    {}, 
    { 
        PointInt32{306, 212}, 
        PointInt32{216, 336} 
    },
    {}
);

SoftwareBitmap finalImage = imageObjectExtractor.GetSoftwareBitmapObjectMask(hint);

Angeben von Hinweisen mit eingeschlossenen und ausgeschlossenen Punkten

In diesem Codeausschnitt wird veranschaulicht, wie sowohl eingeschlossene als auch ausgeschlossene Punkte als Hinweise verwendet werden.

ImageObjectExtractorHint hint(
    includeRects: null,
    includePoints: 
        new List<PointInt32> { new PointInt32(150, 90), 
                               new PointInt32(216, 336), 
                               new PointInt32(550, 330)},
    excludePoints: 
        new List<PointInt32> { new PointInt32(306, 212) });
ImageObjectExtractorHint hint(
    {}, 
    { 
        PointInt32{150, 90}, 
        PointInt32{216, 336}, 
        PointInt32{550, 330}
    },
    { 
        PointInt32{306, 212}
    }
);

Angeben von Hinweisen mit Rechteck

In diesem Codeausschnitt wird veranschaulicht, wie ein Rechteck (RectInt32 ist X, Y, Width, Height) als Hinweis verwendet wird.

ImageObjectExtractorHint hint(
    includeRects: 
        new List<RectInt32> {new RectInt32(370, 278, 285, 126)},
    includePoints: null,
    excludePoints: null ); 
ImageObjectExtractorHint hint(
    { 
        RectInt32{370, 278, 285, 126}
    }, 
    {},
    {}
);

Zusätzliche Ressourcen