Kom igång med AI-avbildning i Windows App SDK
Viktig
Den här funktionen är ännu inte tillgänglig. Den förväntas levereras i en kommande experimentell kanal version av Windows App SDK.
Windows App SDK experimentell kanal innehåller API:er och funktioner i tidiga utvecklingsstadier. Alla API i den experimentella kanalen är föremål för omfattande revisioner och betydande ändringar och kan när som helst tas bort från efterföljande versioner. De stöds inte för användning i produktionsmiljöer och appar som använder experimentella funktioner kan inte publiceras till Microsoft Store.
Bildfunktioner stöds av Windows App SDK via en uppsättning AI-baserade API:er (artificiell intelligens) som både kan skala och skärpa bilder (Bildsuperupplösning) samt identifiera objekt i en bild (Bildsegmentering).
Api-information finns i API-referens för AI-stödda avbildningsfunktioner i Windows App SDK.
Tips
Ge feedback om dessa API:er och deras funktioner genom att skapa en ny Problem i GitHub-lagringsplatsen för Windows App SDK. (Se till att du inkluderar Imaging i rubriken!)
Förutsättningar
-
CoPilot+-datorer
Not
AMD-baserade CoPilot+-datorer stöder inte Image Super Resolution.
Vad kan jag göra med Windows App SDK och Image Super Resolution?
Använd de nya funktionerna för AI Image Super Resolution i Windows App SDK för att förbättra skärpan i bilder och skala dem samtidigt.
Not
Skalning är begränsad till en maximal faktor på 8x (högre skalningsfaktorer kan introducera artefakter och kompromettera bildnoggrannhet). Om antingen den slutliga bredden eller höjden är mer än åtta gånger deras ursprungliga värden genereras ett undantag.
Öka skärpan i en bild
Det här exemplet visar hur du ändrar skalan (targetWidth
, targetHeight
) för en befintlig bitmappsbild (softwareBitmap
) och förbättrar dess skärpa (om du vill förbättra skärpan utan att skala bilden anger du den ursprungliga bildbredden och höjden).
- Först kontrollerar vi att modellen Image Super Resolution är tillgänglig genom att anropa metoden IsAvailable och vänta på att metoden MakeAvailableAsync ska returnera framgångsrikt.
- När modellen Image Super Resolution är tillgänglig skapar vi ett objekt som refererar till den.
- Vi hämtar sedan den slutliga avbildningen genom att skicka den ursprungliga bilden och målbredden och höjden på den slutliga bilden till modellen med hjälp av metoden ScaleSoftwareBitmap.
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);
Vad kan jag göra med Windows App SDK och bildsegmentering?
Bildsegmentering kan användas för att identifiera specifika objekt i en bild. Modellen tar både en bild och ett "ledtrådar"-objekt och returnerar en mask över det identifierade objektet.
Tips kan ges genom valfri kombination av följande:
- Koordinater för punkter som tillhör det du identifierar.
- Koordinater för punkter som inte tillhör det du identifierar.
- En koordinatrektangel som omger det du identifierar.
Ju fler tips du ger, desto mer exakt kan modellen vara. Följ dock dessa riktlinjer för tips för att undvika felaktiga resultat eller fel.
- Undvik att använda flera rektanglar i ett tips eftersom de kan skapa en felaktig mask.
- Undvik att uteslutande använda exkluderingspunkter utan att inkludera punkter eller en rektangel.
- Ange inte mer än maximalt 32 koordinater (1 för en punkt, 2 för en rektangel) eftersom detta returnerar ett fel.
Den returnerade masken är i gråskala-8-format. Bildpunkterna för det identifierade objektet i masken är 255 (resten är 0 utan bildpunkter som innehåller några värden däremellan).
Identifiera ett objekt i en bild
I följande exempel visas de olika sätt som du kan identifiera ett objekt i en bild på. Vi antar att du redan har ett programvarubitmappsobjekt (softwareBitmap
) för indata.
- Först ser vi till att bildsegmenteringsmodellen är tillgänglig genom att anropa metoden IsAvailable och vänta tills metoden MakeAvailableAsync har returnerat framgångsrikt.
- När bildsegmenteringsmodellen är tillgänglig skapar vi ett objekt som refererar till den.
- Sedan skapar vi en ImageObjectExtractor-klass genom att skicka avbildningen till ImageObjectExtractor.CreateWithImageBufferAsync (eller CreateWithSoftwareBitmapAsync beroende på din bildtyp).
- Sedan skapar vi ett ImageObjectExtractorHint-objekt (vi visar andra sätt att skapa ett tipsobjekt med olika indata senare i det här avsnittet).
- Slutligen skickar vi tipset till modellen med metoden GetSoftwareBitmapObjectMask, som returnerar slutresultatet.
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);
Ange tips med inkluderade och exkluderade punkter
I det här kodfragmentet visar vi hur du använder både inkluderade och exkluderade punkter som tips.
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}
}
);
Ange tips med rektangel
I det här kodfragmentet visar vi hur du använder en rektangel (RectInt32 är X, Y, Width, Height
) som ett tips.
ImageObjectExtractorHint hint(
includeRects:
new List<RectInt32> {new RectInt32(370, 278, 285, 126)},
includePoints: null,
excludePoints: null );
ImageObjectExtractorHint hint(
{
RectInt32{370, 278, 285, 126}
},
{},
{}
);