Caricamento ed elaborazione di bitmap

Applies to Windows and Windows Phone

Ecco il codice che consentirà all'utente di selezionare un'immagine tramite un controllo FilePicker e quindi di caricarla e di elaborarla.

In Windows 8 sono disponibili controlli FilePicker per consentire agli utenti di selezionare rapidamente i file, ad esempio le immagini.

Nota  Le app scritte per Windows Phone 8.1 devono usare PickSingleFileAndContinue anziché PickSingleFileAsync. L'uso di questa API richiede alcuni passaggi supplementari. Vedi Come far continuare un'app Windows Phone dopo aver chiamato una selezione file (app Windows Phone Store con C#/VB/C++ e XAML).

In questo breve esempio di codice C# l'utente può usare il controllo FilePicker per selezionare un file di immagine e visualizzarlo nell'app. L'unico presupposto è che l'app deve già includere un controllo XAML <Image> al quale hai assegnato il nome myImage. Ecco il codice:


async private void LoadImage()
        {
            // Load an image

             Windows.Storage.Pickers.FileOpenPicker openPicker = new Windows.Storage.Pickers.FileOpenPicker();

                 openPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
                 openPicker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;
                 
                 // Filter to include a sample subset of file types.
                 openPicker.FileTypeFilter.Clear();
                 openPicker.FileTypeFilter.Add(".bmp");
                 openPicker.FileTypeFilter.Add(".png");
                 openPicker.FileTypeFilter.Add(".jpeg");
                 openPicker.FileTypeFilter.Add(".jpg");

                // Open the file picker.
                Windows.Storage.StorageFile file = await openPicker.PickSingleFileAsync();

                // file is null if user cancels the file picker.
                if (file != null)
                {
                    // Open a stream for the selected file.
                    Windows.Storage.Streams.IRandomAccessStream fileStream =
                        await file.OpenAsync(Windows.Storage.FileAccessMode.Read);

                    // Set the image source to the selected bitmap.
                    Windows.UI.Xaml.Media.Imaging.BitmapImage bitmapImage =
                        new Windows.UI.Xaml.Media.Imaging.BitmapImage();

                    bitmapImage.SetSource(fileStream);
                    myImage.Source = bitmapImage;
                    this.DataContext = file;

                }
            }

Nota  Dal momento che in questo codice si usa la parola chiave await per caricare il file in modo asincrono, deve essere incluso in un metodo dichiarato come async private. Per altre informazioni, vedi Guida introduttiva: Chiamata di API asincrone in C# o Visual Basic.

Elaborazione di immagini e bitmap

Il caricamento e la visualizzazione di una bitmap sono certamente utili, ma l'elaborazione della bitmap è ancora meglio. Nel codice che segue e che è la continuazione dell'esempio precedente, viene usato l'oggetto file per ottenere l'accesso a un flusso e quindi accedere ai dati pixel non elaborati dell'immagine. Con questi dati non elaborati viene creata una nuova immagine WritableBitmap i cui colori vengono modificati prima di visualizzarla nuovamente.

Nota  Non dimenticare di aggiungere using System.Runtime.InteropServices.WindowsRuntime;, altrimenti il codice non verrà compilato.


               // Add: using Windows.UI.Xaml.Media.Imaging;
                // Add: using System.Runtime.InteropServices.WindowsRuntime;

                int height = bitmapImage.PixelHeight;
                int width = bitmapImage.PixelWidth;

                using (var stream = await file.OpenReadAsync())
                {
                    WriteableBitmap bitmap = new WriteableBitmap(width, height);
                    await bitmap.SetSourceAsync(stream);

                    using (var buffer = bitmap.PixelBuffer.AsStream())
                    {
                        Byte[] pixels = new Byte[4 * width * height];
                        buffer.Read(pixels, 0, pixels.Length);

                        for (int x = 0; x < width; x++)
                        {

                            for (int y = 0; y < height; y++)
                            {
                                int index = ((y * width) + x) * 4;

                                Byte b = pixels[index + 0];
                                Byte g = pixels[index + 1];
                                Byte r = pixels[index + 2];
                                Byte a = pixels[index + 3];

                                // Some simple color manipulation
                                byte newB = (Byte)((r + g) / 2);
                                byte newG = (Byte)((r + b) / 2);
                                byte newR = (Byte)((b + g) / 2);

                                pixels[index + 0] = newB;
                                pixels[index + 1] = newG;
                                pixels[index + 2] = newR;
                                pixels[index + 3] = a;
                            }
                        }

                        buffer.Position = 0;
                        buffer.Write(pixels, 0, pixels.Length);
                        myImage.Source = bitmap;
                    }
                }


Nota  Se prevedi di elaborare la stessa WriteableBitmap più volte, esegui una chiamata a WritableBitmap.Invalidate() ogni volta.

Argomenti correlati

Argomenti per sviluppatori iOS
Risorse per sviluppatori iOS
Controlli di Windows 8 per sviluppatori iOS
Guida dettagliata di Windows 8 per sviluppatori iOS
Argomenti relativi a selezione file e bitmap
Linee guida per la selezione file (app di Windows Store)
Parte 4: Accesso ai file e selezioni file
Proprietà WriteableBitmap.PixelBuffer

 

 

Mostra:
© 2014 Microsoft