2017-03-06 1 views
1

J'ai une image chargée en XAML à l'aide d'un convertisseur. Plutôt que de charger à nouveau cette image, je veux prendre cette image et trouver la couleur dominante pour pouvoir l'utiliser pour d'autres graphismes sur la page. Jusqu'à présent, j'ai ceci:UWP BitmapImage to Stream

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]); 
    } 

Il est évident que je ne peux pas ouvrir le Himage BitmapImage en utilisant OpenReadAsync, que dois-je faire là-bas pour être en mesure d'y parvenir?

+0

Que faites-vous avec le convertisseur que vous mentionnez? Ne pourriez-vous pas extraire la couleur dominante en même temps? –

+0

Désolé, il aurait fallu clarifier c'est un convertisseur de conversion qui convertit d'un numéro d'identification à une URL pour la source d'image –

Répondre

0

BitmapDecoder nécessite RandomAccessStream pour créer une nouvelle instance. BitmapImage ne peut pas être directement extrait comme RandomAccessStream sauf si vous connaissez la source d'origine. Selon votre commentaire, vous associez l'image Uri au contrôle d'image, vous pouvez donc connaître la source d'origine et vous pouvez obtenir la propriété RandomAccessStream de la propriété UriSource par RandomAccessStreamReference classe, vous n'avez pas besoin de charger à nouveau l'image. Code comme suit:

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]); 
} 
+0

Merci @ sunteen-wu-msft Je semble à lutter avec cela, car chaque fois que cela fonctionne, myDominantColour renvoie # FF000000 quelle est l'image –