加载和处理位图

Applies to Windows and Windows Phone

下面的代码让用户能够通过使用 FilePicker 控件选择一个图像,然后加载并处理它。

Windows 8 向你提供 FilePicker 控件,让你的用户能够快速选择文件:例如,图像。

注意  为 Windows Phone 8.1 编写的应用应使用 PickSingleFileAndContinue 而不是 PickSingleFileAsync。使用此 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

图像处理和位图

能够加载和显示位图是不错,但能够处理位图就更好了。 以下代码接在上面示例之后,使用文件对象以获取对数据流的访问,然后访问该图像的原始像素数据。使用此原始数据创建了新的 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 Cookbook
文件选取器和位图主题
文件选取器指南(Windows 应用商店应用)
第 4 部分:文件访问和选取器
WriteableBitmap.PixelBuffer 属性

 

 

显示:
© 2014 Microsoft