Partilhar via


Passo a passo do escalador de imagem

Este breve tutorial irá guiá-lo através de um exemplo que usa o Image Scaler em um aplicativo .NET MAUI. Para começar, certifique-se de ter concluído as etapas na página Introdução. para .NET MAUI.

Introdução

Este exemplo demonstra o uso de algumas APIs de IA do Windows, incluindo LanguageModel para geração de texto e ImageScaler para superresolução de imagem para dimensionar e tornar imagens nítidas. Clique em um dos botões "Escalar" para dimensionar a imagem (ou remostrar a imagem original, sem escala), ou digite um prompt de texto e clique no botão "Gerar" para gerar uma resposta de texto.

As alterações do modelo ".NET MAUI App" são divididas em quatro arquivos:

  1. MauiWindowsCopilotRuntimeSample.csproj: Adiciona a referência de pacote necessária do Windows App SDK para as APIs do Windows AI. Essa referência precisa ser condicionada somente durante a criação para Windows (consulte Notas Adicionais abaixo para obter detalhes). Esse arquivo também define o TargetFramework necessário para Windows.
  2. Platforms/Windows/MainPage.cs: Implementa métodos parciais da classe MainPage compartilhada para mostrar e manipular a geração de texto e a funcionalidade de dimensionamento de imagem.
  3. MainPage.xaml: define controles para mostrar a geração de texto e o dimensionamento de imagens.
  4. MainPage.xaml.cs: Define métodos parciais que o MainPage.cs específico do Windows implementa.

O aplicativo de exemplo inicializado.

No segundo arquivo listado acima, você encontrará a seguinte função, que demonstra algumas funcionalidades básicas para o método 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());
            }
        }
    }
}

O aplicativo de exemplo depois de chamar as APIs ImageScaler e LanguageModel.

Criar e executar o exemplo

  1. Clone o repositório no seu Copilot+PC.
  2. Abra o arquivo de solução MauiWindowsCopilotRuntimeSample.sln no Visual Studio 2022.
  3. Verifique se a barra de ferramentas de depuração tem "Windows Machine" definido como o dispositivo de destino.
  4. Pressione F5 ou selecione "Iniciar depuração" no menu Depurar para executar o exemplo. Nota: O exemplo também pode ser executado sem depuração, selecionando "Iniciar sem Depuração" no menu Depurar ou Ctrl+F5.

Ver também