using System; using System.Drawing; using System.Drawing.Imaging; namespace Developpez.Dotnet.Drawing { /// /// Permet l'accès direct et rapide aux pixels d'une image. /// Pour obtenir une instance de cette classe, utilisez la méthode . /// /// /// Cette classe offre des fonctionnalités similaires à , avec les différences suivantes: /// /// PixelData implémente IDisposable ; l'appel à Dispose (explicitement ou via l'instruction using) libère les pixels verrouillés avec LockPixels. /// PixelData fournit un indexeur pour obtenir ou définir facilement la couleur d'un pixel /// PixelData ne supporte qu'un seul format de pixel : /// /// public sealed class PixelData : IDisposable { private readonly Bitmap _bitmap; private readonly BitmapData _data; private readonly int _pixelSize; internal PixelData(Bitmap bitmap, Rectangle rect, ImageLockMode flags) { if (bitmap == null) throw new ArgumentNullException("bitmap"); _bitmap = bitmap; _data = bitmap.LockBits(rect, flags, PixelFormat.Format32bppArgb); _pixelSize = _data.Stride / _data.Width; } /// /// Libère les pixels verrouillés par LockPixels /// public void Dispose() { _bitmap.UnlockBits(_data); } /// /// Obtient l'adresse des premières données en pixels dans la bitmap. Cela peut également être représenté comme la première ligne de numérisation dans la bitmap. /// public IntPtr Scan0 { get { return _data.Scan0; } } /// /// Obtient la largeur de numérisation de l'objet Bitmap. /// public int Stride { get { return _data.Stride; } } /// /// Obtient la largeur en pixels de l'objet Bitmap. Cela peut également être représenté comme le nombre de pixels dans une ligne de numérisation. /// public int Width { get { return _data.Width; } } /// /// Obtient la hauteur en pixels de l'objet Bitmap. Il y est également parfois fait référence en tant que nombre de lignes de numérisation. /// public int Height { get { return _data.Height; } } /// /// Obtient ou définit le format des informations en pixels dans l'objet Bitmap qui a retourné cet objet PixelData. /// public PixelFormat PixelFormat { get { return _data.PixelFormat; } } /// /// Obtient ou définit la couleur du pixel aux coordonnées spécifiées /// /// Position horizontale du pixel /// Position verticale du pixel /// La couleur du pixel public unsafe Color this[int x, int y] { get { byte* ptr = GetPixelPointer(x, y); return Color.FromArgb(ptr[3], ptr[2], ptr[1], ptr[0]); } set { byte* ptr = GetPixelPointer(x, y); ptr[0] = value.B; ptr[1] = value.G; ptr[2] = value.R; ptr[3] = value.A; } } private unsafe byte* GetPixelPointer(int x, int y) { x.CheckArgumentOutOfRange("x", 0, Width - 1); y.CheckArgumentOutOfRange("y", 0, Height - 1); int offset = y * _data.Stride + x * _pixelSize; return ((byte*)_data.Scan0) + offset; } } }