public void SetPixels(List<IntPoint> coordinates, Color color)
{
unsafe
{
int pixelSize = Bitmap.GetPixelFormatSize(pixelFormat) / 8;
byte* basePtr = (byte*)imageData.ToPointer();
byte red = color.R;
byte green = color.G;
byte blue = color.B;
byte alpha = color.A;
switch (pixelFormat)
{
case PixelFormat.Format8bppIndexed:
{
byte grayValue = (byte)(0.2125 * red + 0.7154 * green + 0.0721 * blue);
foreach (IntPoint point in coordinates)
{
if ((point.X >= 0) && (point.Y >= 0) && (point.X < width) && (point.Y < height))
{
byte* ptr = basePtr + point.Y * stride + point.X;
*ptr = grayValue;
}
}
}
break;
case PixelFormat.Format24bppRgb:
case PixelFormat.Format32bppRgb:
{
foreach (IntPoint point in coordinates)
{
if ((point.X >= 0) && (point.Y >= 0) && (point.X < width) && (point.Y < height))
{
byte* ptr = basePtr + point.Y * stride + point.X * pixelSize;
ptr[RGB.R] = red;
ptr[RGB.G] = green;
ptr[RGB.B] = blue;
}
}
}
break;
case PixelFormat.Format32bppArgb:
{
foreach (IntPoint point in coordinates)
{
if ((point.X >= 0) && (point.Y >= 0) && (point.X < width) && (point.Y < height))
{
byte* ptr = basePtr + point.Y * stride + point.X * pixelSize;
ptr[RGB.R] = red;
ptr[RGB.G] = green;
ptr[RGB.B] = blue;
ptr[RGB.A] = alpha;
}
}
}
break;
case PixelFormat.Format16bppGrayScale:
{
ushort grayValue = (ushort)((ushort)(0.2125 * red + 0.7154 * green + 0.0721 * blue) << 8);
foreach (IntPoint point in coordinates)
{
if ((point.X >= 0) && (point.Y >= 0) && (point.X < width) && (point.Y < height))
{
ushort* ptr = (ushort*)(basePtr + point.Y * stride) + point.X;
*ptr = grayValue;
}
}
}
break;
case PixelFormat.Format48bppRgb:
{
ushort red16 = (ushort)(red << 8);
ushort green16 = (ushort)(green << 8);
ushort blue16 = (ushort)(blue << 8);
foreach (IntPoint point in coordinates)
{
if ((point.X >= 0) && (point.Y >= 0) && (point.X < width) && (point.Y < height))
{
ushort* ptr = (ushort*)(basePtr + point.Y * stride + point.X * pixelSize);
ptr[RGB.R] = red16;
ptr[RGB.G] = green16;
ptr[RGB.B] = blue16;
}
}
}
break;
case PixelFormat.Format64bppArgb:
{
ushort red16 = (ushort)(red << 8);
ushort green16 = (ushort)(green << 8);
ushort blue16 = (ushort)(blue << 8);
ushort alpha16 = (ushort)(alpha << 8);
foreach (IntPoint point in coordinates)
{
if ((point.X >= 0) && (point.Y >= 0) && (point.X < width) && (point.Y < height))
{
ushort* ptr = (ushort*)(basePtr + point.Y * stride + point.X * pixelSize);
ptr[RGB.R] = red16;
ptr[RGB.G] = green16;
ptr[RGB.B] = blue16;
ptr[RGB.A] = alpha16;
}
}
}
break;
default:
throw new UnsupportedImageFormatException("The pixel format is not supported: " + pixelFormat);
}
}
}