ビットマップの読み込みと処理

ユーザーが FilePicker コントロールを使ってイメージを選び、それを読み込んで処理できるようにするコードを以下に示します。

Windows 8 では、FilePicker コントロールを使うことで、ユーザーがイメージなどのファイルをすぐに選ぶことができるようになります。

  Windows Phone 8.1 用に記述されたアプリでは、PickSingleFileAsync ではなく、PickSingleFileAndContinue を使う必要があります。追加手順が必要となるこの API の使用方法については、「ファイル ピッカーの呼び出し後に Windows Phone アプリを続行する方法 (C#/VB/C++ と XAML を使った Windows Phone ストア アプリ)」をご覧ください。

この短い C# コード サンプルでは、ユーザーが FilePicker コントロールを使ってイメージ ファイルを選ぶと、そのイメージがアプリで表示されます。ここでは、唯一の前提条件として、アプリに既に XAML の <Image> コントロールが含まれ、myImage という名前が付けられている必要があります。コードは次のようになります。


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;

                }
            }

  このコードは await キーワードを使ってファイルを非同期で読み込むため、async private として宣言されたメソッド内に記述する必要があります。詳しくは、「クイック スタート: C# または Visual Basic での非同期 API の呼び出し」をご覧ください。

イメージの処理とビットマップ

ビットマップを読み込んで表示することも必要ですが、そのビットマップを処理することはさらに重要です。 次に示すコードは上の例に続くものであり、ファイル オブジェクトを使ってストリームにアクセスした後、イメージの raw ピクセル データにアクセスします。この raw データを使って新しい WritableBitmap イメージが作成され、色を処理した後でもう一度表示されます。

  using System.Runtime.InteropServices.WindowsRuntime; を追加することが重要であり、そうしないとコードがコンパイルされません。


               // 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;
                    }
                }


  同じ WriteableBitmap を複数回処理する場合は、その都度 WritableBitmap.Invalidate() を呼び出します。

関連トピック

iOS 開発者のためのトピック
iOS 開発者向けリソース
iOS 開発者のための Windows 8 のコントロール
iOS 開発者のための Windows 8 のクックブック
ファイル ピッカーとビットマップのトピック
ファイル ピッカーのガイドライン (Windows ストア アプリ)
パート 4: ファイル アクセスとファイル ピッカー
WriteableBitmap.PixelBuffer プロパティ

 

 

表示:
© 2015 Microsoft