Разложение BMP изображения на цвета

Мне нужно разложить BMP изображение на три цвета RGB.Как можно получить доступ к массиву пикселей,чтобы поменять у них цвета?Желательно без WPF и WinForms.


Ответы (1 шт):

Автор решения: aepot

Использую библиотеку GDI+ System.Drawng.Common, ту самую, которая в Winforms доступна по умолчанию.

Окей, если не получается взять и доработать почти готовый код, то я доработаю

// синий
public static Bitmap GetBlue(Bitmap bmp)
{
    Rectangle rect = new Rectangle(Point.Empty, bmp.Size);
    BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    int stride = Math.Abs(bmpData.Stride);
    int length = stride * bmp.Height;
    byte[] buffer = new byte[length];
    Marshal.Copy(bmpData.Scan0, buffer, 0, bmpData.Stride * bmp.Height);
    bmp.UnlockBits(bmpData);
    for (int row = 0; row < bmp.Height; row++)
    {
        int rowOffset = stride * row;
        for (int col = 0; col < bmp.Width; col++)
        {
            int offset = rowOffset + col * 3;
            buffer[offset + 1] = 0;
            buffer[offset + 2] = 0;
        }
    }
    Bitmap result = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format24bppRgb);
    BitmapData resultData = result.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    Marshal.Copy(buffer, 0, resultData.Scan0, length);
    result.UnlockBits(resultData);
    return result;
}
// зеленый
public static Bitmap GetGreen(Bitmap bmp)
{
    Rectangle rect = new Rectangle(Point.Empty, bmp.Size);
    BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    int stride = Math.Abs(bmpData.Stride);
    int length = stride * bmp.Height;
    byte[] buffer = new byte[length];
    Marshal.Copy(bmpData.Scan0, buffer, 0, bmpData.Stride * bmp.Height);
    bmp.UnlockBits(bmpData);
    for (int row = 0; row < bmp.Height; row++)
    {
        int rowOffset = stride * row;
        for (int col = 0; col < bmp.Width; col++)
        {
            int offset = rowOffset + col * 3;
            buffer[offset] = 0;
            buffer[offset + 2] = 0;
        }
    }
    Bitmap result = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format24bppRgb);
    BitmapData resultData = result.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    Marshal.Copy(buffer, 0, resultData.Scan0, length);
    result.UnlockBits(resultData);
    return result;
}
// красный
public static Bitmap GetRed(Bitmap bmp)
{
    Rectangle rect = new Rectangle(Point.Empty, bmp.Size);
    BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    int stride = Math.Abs(bmpData.Stride);
    int length = stride * bmp.Height;
    byte[] buffer = new byte[length];
    Marshal.Copy(bmpData.Scan0, buffer, 0, bmpData.Stride * bmp.Height);
    bmp.UnlockBits(bmpData);
    for (int row = 0; row < bmp.Height; row++)
    {
        int rowOffset = stride * row;
        for (int col = 0; col < bmp.Width; col++)
        {
            int offset = rowOffset + col * 3;
            buffer[offset] = 0;
            buffer[offset + 1] = 0;
        }
    }
    Bitmap result = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format24bppRgb);
    BitmapData resultData = result.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    Marshal.Copy(buffer, 0, resultData.Scan0, length);
    result.UnlockBits(resultData);
    return result;
}
Bitmap bmp = new Bitmap("image.jpg");
Bitmap red = GetRed(bmp);
red.Save("red.jpg", ImageFormat.Jpeg);
Bitmap green = GetGreen(bmp);
green.Save("green.jpg", ImageFormat.Jpeg);
Bitmap blue = GetBlue(bmp);
blue.Save("blue.jpg", ImageFormat.Jpeg);
→ Ссылка