Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом кратком руководстве описан пример, использующий масштабировщик изображений в приложении .NET MAUI. Чтобы начать, убедитесь, что вы выполнили действия на странице "Начало работы". для .NET MAUI.
Введение
В этом примере показано использование некоторых API-интерфейсов ИИ Windows, включая LanguageModel для создания текста и ImageScaler для суперрегулирования изображений для масштабирования и резки изображений. Нажмите одну из кнопок "Масштабировать", чтобы масштабировать изображение (или изменить исходное, немасштабированное изображение) или ввести текстовый запрос и нажмите кнопку "Создать", чтобы создать текстовый ответ.
Изменения из шаблона приложения .NET MAUI разделяются на четыре файла:
- MauiWindowsAISample.csproj: добавляет необходимую ссылку на пакет Windows App SDK для AI API Windows. Этот референс должен быть использован только при сборке для Windows (см. дополнительные заметки ниже для подробностей). Этот файл также задает необходимый целевой фреймворк для Windows.
- Платформы/Windows/MainPage.cs: Реализует частичные методы из общего класса MainPage для демонстрации и обработки функций генерации текста и масштабирования изображений.
- MainPage.xaml: определяет элементы управления для отображения масштабирования текста и изображения.
- MainPage.xaml.cs. Определяет частичные методы, которые реализует MainPage.cs для Windows.
Во втором файле, приведенном выше, вы найдете следующую функцию, которая демонстрирует некоторые основные функции для метода 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());
}
}
}
}
Сборка и запуск примера
- Клонируйте репозиторий WindowsAppSDK-Samples .
- Перейдите в ветвь release/experimental.
- Перейдите в папку Samples/WindowsAIFoundry/cs-maui .
- Откройте MauiWindowsAISample.sln в Visual Studio 2022.
- Убедитесь, что панель инструментов отладки имеет "Компьютер Windows" в качестве целевого устройства.
- Нажмите клавишу F5 или выберите "Начать отладку" в меню отладки, чтобы запустить пример (пример также можно запустить без отладки, нажав кнопку "Начать без отладки" в меню отладки или CTRL+F5).