Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questa breve esercitazione illustra un esempio che usa Image Scaler in un'app MAUI .NET. Per iniziare, assicurarsi di aver completato i passaggi nella pagina Introduzione. Per .NET MAUI.
Introduzione
Questo esempio illustra l'uso di alcune API windows per intelligenza artificiale, tra cui LanguageModel per la generazione di testo e ImageScaler per la risoluzione con super risoluzione delle immagini per ridimensionare e affinare le immagini. Fare clic su uno dei pulsanti "Scala" per ridimensionare l'immagine (o visualizzare nuovamente l'immagine originale, non ridimensionata) oppure immettere un prompt di testo e fare clic sul pulsante "Genera" per generare una risposta di testo.
Le modifiche apportate al modello ".NET MAUI App" vengono suddivise in quattro file:
- MauiWindowsAISample.csproj: aggiunge le informazioni di riferimento sul pacchetto di Windows App SDK necessarie per le API windows per intelligenza artificiale. Questo riferimento deve essere condizionale solo durante la compilazione per Windows (vedere Note aggiuntive di seguito per informazioni dettagliate). Questo file imposta anche il TargetFramework necessario per Windows.
- Piattaforme/Windows/MainPage.cs: implementa metodi parziali dalla classe MainPage condivisa per mostrare e gestire la funzionalità di generazione del testo e ridimensionamento delle immagini.
- MainPage.xaml: definisce i controlli per visualizzare la generazione di testo e il ridimensionamento delle immagini.
- MainPage.xaml.cs: definisce metodi parziali implementati dal MainPage.cs specifico di Windows.
Nel secondo file elencato sopra è disponibile la funzione seguente, che illustra alcune funzionalità di base per il metodo ImageScaler:
private async void DoScaleImage(double scale)
{
// Load the original image
var resourceManager = new Microsoft.Windows.ApplicationModel.Resources.ResourceManager();
var resource = resourceManager.MainResourceMap.GetValue("ms-resource:///Files/enhance.png");
if (resource.Kind == Microsoft.Windows.ApplicationModel.Resources.ResourceCandidateKind.FilePath)
{
// Load as a SoftwareBitmap
var file = await Windows.Storage.StorageFile.GetFileFromPathAsync(resource.ValueAsString);
var fileStream = await file.OpenStreamForReadAsync();
var decoder = await BitmapDecoder.CreateAsync(fileStream.AsRandomAccessStream());
var softwareBitmap = await decoder.GetSoftwareBitmapAsync();
int origWidth = softwareBitmap.PixelWidth;
int origHeight = softwareBitmap.PixelHeight;
SoftwareBitmap finalImage;
if (scale == 0.0)
{
// just show the original image
finalImage = softwareBitmap;
}
else
{
// Scale the image to be the exact pixel size of the element displaying it
if (ImageScaler.GetReadyState() == AIFeatureReadyState.NotReady)
{
var op = await ImageScaler.EnsureReadyAsync();
if (op.Status != AIFeatureReadyResultState.Success)
{
throw new Exception(op.ExtendedError.Message);
}
}
ImageScaler imageScaler = await ImageScaler.CreateAsync();
double imageScale = scale;
if (imageScale > imageScaler.MaxSupportedScaleFactor)
{
imageScale = imageScaler.MaxSupportedScaleFactor;
}
System.Diagnostics.Debug.WriteLine($"Scaling to {imageScale}x...");
int newHeight = (int)(origHeight * imageScale);
int newWidth = (int)(origWidth * imageScale);
finalImage = imageScaler.ScaleSoftwareBitmap(softwareBitmap, newWidth, newHeight);
}
// Display the scaled image. The if/else here shows two different approaches to do this.
var mauiContext = scaledImage.Handler?.MauiContext;
if (mauiContext != null)
{
// set the SoftwareBitmap as the source of the Image control
var imageToShow = finalImage;
if (imageToShow.BitmapPixelFormat != BitmapPixelFormat.Bgra8 ||
imageToShow.BitmapAlphaMode == BitmapAlphaMode.Straight)
{
// SoftwareBitmapSource only supports Bgra8 and doesn't support Straight alpha mode, so convert
imageToShow = SoftwareBitmap.Convert(imageToShow, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
}
var softwareBitmapSource = new SoftwareBitmapSource();
_ = softwareBitmapSource.SetBitmapAsync(imageToShow);
var nativeScaledImageView = (Microsoft.UI.Xaml.Controls.Image)scaledImage.ToPlatform(mauiContext);
nativeScaledImageView.Source = softwareBitmapSource;
}
else
{
// An alternative approach is to encode the image so a stream can be handed
// to the Maui ImageSource.
// Note: There's no "using(...)" here, since this stream needs to be kept alive for the image to be displayed
var scaledStream = new InMemoryRandomAccessStream();
{
BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, scaledStream);
encoder.SetSoftwareBitmap(finalImage);
await encoder.FlushAsync();
scaledImage.Source = ImageSource.FromStream(() => scaledStream.AsStream());
}
}
}
}
Compilare ed eseguire l'esempio
- Clonare il repository WindowsAppSDK-Samples .
- Passare al ramo "release/experimental".
- Passare alla cartella Samples/WindowsAIFoundry/cs-maui .
- Aprire MauiWindowsAISample.sln in Visual Studio 2022.
- Verificare che la barra degli strumenti di debug abbia impostato "Computer Windows" come dispositivo di destinazione.
- Premere F5 o selezionare "Avvia debug" dal menu Debug per eseguire l'esempio.L'esempio può essere eseguito anche senza eseguire il debug selezionando "Avvia senza eseguire debug" dal menu Debug o CTRL+F5.