Freigeben über


Anleitung zur Bildskalierung

Dieses kurze Lernprogramm führt Sie durch ein Beispiel, das Image Scaler in einer .NET MAUI-App verwendet. Stellen Sie zunächst sicher, dass Sie die Schritte auf der Seite "Erste Schritte " für .NET MAUI abgeschlossen haben.

Einleitung

In diesem Beispiel wird die Verwendung einiger Windows AI-APIs veranschaulicht, einschließlich LanguageModel für die Textgenerierung und ImageScaler für Superauflösung, um Bilder zu skalieren und zu schärfen. Klicken Sie auf eine der Schaltflächen "Skalieren", um das Bild zu skalieren (oder das ursprüngliche, nicht skalierte Bild erneut anzuzeigen), oder geben Sie eine Textaufforderung ein, und klicken Sie auf die Schaltfläche "Generieren", um eine Textantwort zu generieren.

Die Änderungen aus der Vorlage ".NET MAUI App" werden in vier Dateien aufgeteilt:

  1. MauiWindowsAISample.csproj: Fügt die erforderliche Windows App SDK-Paketreferenz für die Windows AI-APIs hinzu. Dieser Verweis muss nur bei der Erstellung für Windows bedingt sein (weitere Informationen finden Sie weiter unten in den Hinweisen). Diese Datei legt auch das erforderliche TargetFramework für Windows fest.
  2. Plattformen/Windows/MainPage.cs: Implementiert Partielle Methoden aus der freigegebenen MainPage-Klasse, um die Textgenerierungs- und Bildskalierungsfunktionalität anzuzeigen und zu verarbeiten.
  3. MainPage.xaml: Definiert Steuerelemente zum Anzeigen der Textgenerierung und Bildskalierung.
  4. MainPage.xaml.cs: Definiert partielle Methoden, die vom windowsspezifischen MainPage.cs implementiert werden.

In der zweiten oben aufgeführten Datei finden Sie die folgende Funktion, die einige grundlegende Funktionen für die ImageScaler-Methode veranschaulicht:

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());
            }
        }
    }
}

Erstellen und Ausführen des Beispiels

  1. Klonen Sie das WindowsAppSDK-Samples-Repository .
  2. Wechseln Sie zum Branch "release/experimental".
  3. Navigieren Sie zum Ordner "Samples/WindowsAIFoundry/cs-maui ".
  4. Öffnen Sie MauiWindowsAISample.sln in Visual Studio 2022.
  5. Stellen Sie sicher, dass auf der Debugsymbolleiste als Zielgerät „Windows-Computer“ festgelegt ist.
  6. Drücken Sie F5, oder wählen Sie im Menü "Debuggen starten" aus, um das Beispiel auszuführen (das Beispiel kann auch ohne Debugging ausgeführt werden, indem sie im Menü "Debuggen starten" oder STRG+F5 auswählen).

Siehe auch