Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento krátký kurz vás provede ukázkou, která používá službu Image Scaler v aplikaci .NET MAUI. Abyste mohli začít, ujistěte se, že jste dokončili kroky na stránce Začínáme. Pro .NET MAUI.
Úvod
Tato ukázka demonstruje použití některých rozhraní API AI systému Windows, včetně LanguageModel pro generování textu a ImageScaler pro rozlišení obrázku, aby bylo možné škálovat a zostřit obrázky. Kliknutím na jedno z tlačítek Měřítko můžete obrázek škálovat (nebo znovu zobrazit původní, neškálovaný obrázek) nebo zadejte textovou výzvu a kliknutím na tlačítko Generovat vygenerujte textovou odpověď.
Změny ze šablony aplikace .NET MAUI jsou rozdělené mezi čtyři soubory:
- MauiWindowsAISample.csproj: Přidá požadovaný odkaz na balíček sady Windows App SDK pro rozhraní API pro Windows AI. Tento odkaz musí být podmíněný pouze při sestavování pro Windows (podrobnosti najdete v části Další poznámky níže). Tento soubor také nastaví potřebný TargetFramework pro Windows.
- Platformy/ Windows/MainPage.cs: Implementuje částečné metody ze sdílené třídy MainPage k zobrazení a zpracování funkce generování textu a škálování obrázků.
- MainPage.xaml: Definuje ovládací prvky pro zobrazení generování textu a škálování obrázků.
- MainPage.xaml.cs: Definuje částečné metody, které implementují MainPage.cs specifické pro Windows.
Ve druhém souboru uvedeném výše najdete následující funkci, která ukazuje některé základní funkce pro metodu 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());
}
}
}
}
Sestavení a spuštění ukázky
- Naklonujte úložiště WindowsAppSDK-Samples .
- Přepněte do větve s názvem release/experimental.
- Přejděte do složky Samples/WindowsAIFoundry/cs-maui .
- Otevřete MauiWindowsAISample.sln v sadě Visual Studio 2022.
- Ujistěte se, že panel nástrojů ladění má jako cílové zařízení nastavený počítač s Windows.
- Stisknutím klávesy F5 nebo výběrem možnosti Spustit ladění v nabídce Ladění spusťte ukázku (ukázku můžete spustit i bez ladění výběrem možnosti Spustit bez ladění v nabídce Ladění nebo Ctrl+F5).