UWP BitmapImage 到流

UWP BitmapImage to Stream

我在 XAML 中使用转换器加载了一张图片。我不想再次加载此图像,而是想获取该图像并找到能够用于页面上其他图形的主色。到目前为止我有这个:

var himage = (BitmapImage)image_home.Source;

using (var stream = await himage.OpenReadAsync())  //**can't open himage this way**
    {
      //Create a decoder for the image
         var decoder = await BitmapDecoder.CreateAsync(stream);

      //Create a transform to get a 1x1 image
         var myTransform = new BitmapTransform { ScaledHeight = 1, ScaledWidth = 1 };

      //Get the pixel provider
         var pixels = await decoder.GetPixelDataAsync(
         BitmapPixelFormat.Rgba8,
         BitmapAlphaMode.Ignore,
         myTransform,
         ExifOrientationMode.IgnoreExifOrientation,
         ColorManagementMode.DoNotColorManage);

      //Get the bytes of the 1x1 scaled image
         var bytes = pixels.DetachPixelData();

      //read the color 
         var myDominantColor = Color.FromArgb(255, bytes[0], bytes[1], bytes[2]);
   }

显然我无法使用 OpenReadAsync 打开 BitmapImage himage,我需要在那里做什么才能实现这一点?

BitmapDecoder requires RandomAccessStream object to create a new instance. BitmapImage may not be directly extract as RandomAccessStream unless you know the original source. According to your comment, you are binding image Uri to the image control, so you could know the original source and you can get the RandomAccessStream from the BitmapImage's UriSource property by RandomAccessStreamReference class,您不需要再次加载图像。代码如下:

 var himage = (BitmapImage)image_home.Source;
 RandomAccessStreamReference random = RandomAccessStreamReference.CreateFromUri(himage.UriSour‌​ce);

 using (IRandomAccessStream stream = await random.OpenReadAsync())   
 {
     //Create a decoder for the image
     var decoder = await BitmapDecoder.CreateAsync(stream);
    ...
     //read the color 
     var myDominantColor = Color.FromArgb(255, bytes[0], bytes[1], bytes[2]);
 }