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