Windows 8 : Récupérer la couleur d’un pixel sur une image

Il est aisé d’obtenir la couleur d’un pixel à une position précise en C# à partir de l’objet Bitmap et sa méthode GetPixel, cependant impossible de faire ça sous Windows 8 car l’objet Bitmap n’existe pas.

Il faut alors se contenter d’un WriteableBitmap auquel on associe l’image sur laquelle on veut travailler. Une fois l’image chargée, on récupère la liste de toutes les composantes de l’image pixel par pixel et à partir de là, il suffit de calculer la position exacte du pixel recherché en fonction des dimensions de l’image. Une fois la position du pixel trouvé, il ne reste qu’à recréer la couleur du pixel à partir des quatre composantes de celui-ci.

Voici le code retournant la couleur d’un pixel pour une image et une position donnée :

public class PixelImage
    {
        public static async Task<Color> GetPixelImage(string imagePath, Point positionPointer, double screenHeight)
        {
            WriteableBitmap writeableBitmap = await LoadWriteableBitmapFromPackageFilePath(imagePath);

            var pixelStream = writeableBitmap.PixelBuffer.AsStream();
            byte[] dstArray = writeableBitmap.PixelBuffer.ToArray();

            var ratio = writeableBitmap.PixelHeight / screenHeight;

            var PointNew = new Point(positionPointer.X * ratio, positionPointer.Y * ratio);

            var positionPixel = ((int)Math.Round(PointNew.Y)) * writeableBitmap.PixelWidth + (int)PointNew.X;
            try
            {
                byte blue = dstArray[(int)positionPixel * 4 + 0];
                byte green = dstArray[(int)positionPixel * 4 + 1];
                byte red = dstArray[(int)positionPixel * 4 + 2];
                byte a = dstArray[(int)positionPixel * 4 + 3];

                var color = Color.FromArgb(a, red, green, blue);

                return color;
            }
            catch (Exception)
            {
                return Colors.Transparent;
            }
        }

        private static async Task<WriteableBitmap> LoadWriteableBitmapFromPackageFilePath(string packageFilePath1)
        {
            var bitmap = new WriteableBitmap(1, 1);
            var storageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri(packageFilePath1));

            using (var streamWithContentType = await storageFile.OpenReadAsync())
            {
                await bitmap.SetSourceAsync(streamWithContentType);
            }

            return bitmap;
        }
}

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *