Aracılığıyla paylaş


Görüntü ölçeklendiricisi kılavuzu

Bu kısa öğretici, .NET MAUI uygulamasında Görüntü Ölçeklendiricisi'nin kullanıldığı bir örnekte size yol gösterir. Başlamak için.NET MAUI için Başlarken sayfasındaki adımları tamamladığınızdan emin olun.

Giriş

Bu örnek, metin oluşturma için LanguageModel ve görüntüleri ölçeklendirmek ve keskinleştirmek için görüntü süper çözünürlüğü için ImageScaler dahil olmak üzere bazı Windows AI API'lerinin kullanımını gösterir. Görüntüyü ölçeklendirmek için "Ölçek" düğmelerinden birine tıklayın (veya özgün, ölçeklendirilmemiş resmi yeniden gösterin) veya bir metin istemi girip "Oluştur" düğmesine tıklayarak bir metin yanıtı oluşturun.

".NET MAUI Uygulaması" şablonundaki değişiklikler dört dosyaya ayrılır:

  1. MauiWindowsAISample.csproj: Windows AI API'leri için gerekli Windows Uygulama SDK'sı paket başvurularını ekler. Bu referans yalnızca Windows için oluşturulurken dikkate alınmalıdır (ayrıntılar için aşağıdaki Ek Notlar'a bakın). Bu dosya, Windows için gerekli TargetFramework'i de ayarlar.
  2. Platformlar/Windows/MainPage.cs: Metin oluşturma ve görüntü ölçeklendirme işlevini göstermek ve işlemek için paylaşılan MainPage sınıfından kısmi yöntemler uygular.
  3. MainPage.xaml: Metin oluşturma ve görüntü ölçeklendirmeyi göstermek için denetimleri tanımlar.
  4. MainPage.xaml.cs: Windows'a özgü MainPage.cs uyguladığı kısmi yöntemleri tanımlar.

Yukarıda listelenen ikinci dosyada, ImageScaler yöntemi için bazı temel işlevleri gösteren aşağıdaki işlevi bulacaksınız:

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

Örneği oluşturma ve çalıştırma

  1. WindowsAppSDK-Samples depoyu kopyalayın.
  2. "Yayın/Deneysel" şubesine geçin.
  3. Samples/WindowsAIFoundry/cs-maui klasörüne gidin.
  4. Visual Studio 2022'de MauiWindowsAISample.sln açın.
  5. Hata ayıklama araç çubuğunun hedef cihaz olarak "Windows Makinesi" olarak ayarlandığından emin olun.
  6. Örneği çalıştırmak için F5 tuşuna basın veya Hata Ayıklama menüsünden "Hata Ayıklamayı Başlat"ı seçin (örnek, Hata Ayıklama menüsünden "Hata Ayıklama olmadan Başlat" veya Ctrl+F5 tuşlarına basılarak hata ayıklama olmadan da çalıştırılabilir).

Ayrıca bakınız