Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu kısa öğretici, .NET MAUI uygulamasında Görüntü Ölçeklendiricisi'nin kullanıldığı bir örnekte size yol gösterir. Başlamak için.NET MAUI için Başlarken sayfasındaki adımları tamamladığınızdan emin olun.
Giriş
Bu örnek, metin oluşturma için LanguageModel ve görüntüleri ölçeklendirmek ve keskinleştirmek için görüntü süper çözünürlüğü için ImageScaler dahil olmak üzere bazı Windows AI API'lerinin kullanımını gösterir. Görüntüyü ölçeklendirmek için "Ölçek" düğmelerinden birine tıklayın (veya özgün, ölçeklendirilmemiş resmi yeniden gösterin) veya bir metin istemi girip "Oluştur" düğmesine tıklayarak bir metin yanıtı oluşturun.
".NET MAUI Uygulaması" şablonundaki değişiklikler dört dosyaya ayrılır:
- MauiWindowsAISample.csproj: Windows AI API'leri için gerekli Windows Uygulama SDK'sı paket başvurularını ekler. Bu referans yalnızca Windows için oluşturulurken dikkate alınmalıdır (ayrıntılar için aşağıdaki Ek Notlar'a bakın). Bu dosya, Windows için gerekli TargetFramework'i de ayarlar.
- Platformlar/Windows/MainPage.cs: Metin oluşturma ve görüntü ölçeklendirme işlevini göstermek ve işlemek için paylaşılan MainPage sınıfından kısmi yöntemler uygular.
- MainPage.xaml: Metin oluşturma ve görüntü ölçeklendirmeyi göstermek için denetimleri tanımlar.
- MainPage.xaml.cs: Windows'a özgü MainPage.cs uyguladığı kısmi yöntemleri tanımlar.
Yukarıda listelenen ikinci dosyada, ImageScaler yöntemi için bazı temel işlevleri gösteren aşağıdaki işlevi bulacaksınız:
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());
}
}
}
}
Örneği oluşturma ve çalıştırma
- WindowsAppSDK-Samples depoyu kopyalayın.
- "Yayın/Deneysel" şubesine geçin.
- Samples/WindowsAIFoundry/cs-maui klasörüne gidin.
- Visual Studio 2022'de MauiWindowsAISample.sln açın.
- Hata ayıklama araç çubuğunun hedef cihaz olarak "Windows Makinesi" olarak ayarlandığından emin olun.
- Örneği çalıştırmak için F5 tuşuna basın veya Hata Ayıklama menüsünden "Hata Ayıklamayı Başlat"ı seçin (örnek, Hata Ayıklama menüsünden "Hata Ayıklama olmadan Başlat" veya Ctrl+F5 tuşlarına basılarak hata ayıklama olmadan da çalıştırılabilir).