Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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:
- 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.
- 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.
- MainPage.xaml: define controles para mostrar a geração de texto e o dimensionamento de imagens.
- MainPage.xaml.cs: Define métodos parciais que o MainPage.cs específico do Windows implementa.
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());
}
}
}
}
Criar e executar o exemplo
- Clone o repositório no seu Copilot+PC.
- Abra o arquivo de solução MauiWindowsCopilotRuntimeSample.sln no Visual Studio 2022.
- Verifique se a barra de ferramentas de depuração tem "Windows Machine" definido como o dispositivo de destino.
- 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.