Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este breve tutorial orientará você por um exemplo que usa o Image Scaler em um aplicativo MAUI do .NET. Para começar, verifique se você concluiu as etapas na página Introdução. para o .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 super resolução de imagem para dimensionar e aprimorar imagens. Clique em um dos botões "Dimensionar" para dimensionar a imagem (ou mostrar novamente a imagem original não dimensionada) ou insira 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 do SDK de Aplicativo do Windows necessária para as APIs de IA do Windows. Essa referência só precisa ser condicionada ao criar para o Windows (consulte Notas Adicionais abaixo para obter detalhes). Esse arquivo também define o TargetFramework necessário para Windows.
- Plataformas/Windows/MainPage.cs: implementa métodos parciais da classe MainPage compartilhada para mostrar e lidar com 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 para 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. Observação: o exemplo também pode ser executado sem depuração selecionando "Iniciar sem Depuração" no menu Depurar ou Ctrl+F5.