Loupe

#WindowsPhone: comment obtenir facilement la couleur dominante d’une image

Dans un précédent article de mon blog, j’expliquais comment obtenir la couleur dominante d’une image dans une application Windows Store. Les APIs disponibles sur Windows Phone étant différentes, je vais aujourd’hui vous expliquer comment faire la même chose sur votre téléphone préféré :) ! Attention aussi, par dominante je comprends “couleur moyenne de l’image”.

L’astuce que j’utilise consiste en plusieurs étapes :

  • utiliser une BitmapImage pour laisser le framework décoder l’image.
  • Attendre que l’image soit décodée.
  • Utiliser cette BitampImage dans une WriteableImage.
  • Sauvegarder cette WriteableImage sous la forme d’un JPEG d’un pixel sur un pixel dans un MemoryStream.
  • Utiliser ce MemoryStream comme source de ma WriteableImage .
  • Lire et interpréter les pixels de ma WriteableImage..


C’est donc un peu plus complexe en WindowsPhone mais l’astuce reste la même dans le principe. Vous remarquerez que j’utilise l’option “BitmapCreateOptions.BackgroundCreation” pour éviter que le décodage du jpeg ne se fasse sur le thread UI et fasse “freezer” l’application :

var bmp = new BitmapImage
{
    UriSource = new Uri("/Assets/logoInfiniteSquare.jpg", UriKind.Relative),
    CreateOptions = BitmapCreateOptions.BackgroundCreation
};
bmp.ImageOpened += (a, b) =>
{
    var wB = new WriteableBitmap(bmp);
    using (var memStream = new MemoryStream())
    {
        //On sauvegarde un jpeg d'1x1px
        wB.SaveJpeg(memStream, 1, 1, 0, 90);
        memStream.Seek(0, SeekOrigin.Begin);

        //le writeableBitmap utilise ce jpeg
        wB.SetSource(memStream);

        wB.Invalidate();

        //lecture des bytes
        var bytes = new byte[3];
        Buffer.BlockCopy(wB.Pixels, 0, bytes, 0, 3);

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

};

 

Photo de profil

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus