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

Commentaires