Инвертировать цвет 1bbp под прямоугольником - PullRequest
1 голос
/ 17 апреля 2010

Я работаю с GDI +, изображение, с которым я работаю, является изображением 1bbp. То, что я хотел бы сделать, это нарисовать прямоугольник на изображении, и все под этим прямоугольником будет инвертировано (белые пиксели станут черными, а черные пиксели станут белыми).

Весь пример кода, который я видел, предназначен для изображений с 8-битной цветовой шкалой RGB, и я не думаю, что методы, которые они используют, будут работать для меня.

Вот код, который у меня есть. Это родительский элемент управления, одна из Epl2.IDrawableCommand будет командой, которая выполняет инвертирование.

public class DisplayBox : UserControl
{
    (...)
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        (...)
            using (Bitmap drawnLabel = new Bitmap((int)((float)Label.LabelHeight * _ImageScaleFactor), (int)((float)Label.LableLength *(int) _ImageScaleFactor), System.Drawing.Imaging.PixelFormat.Format1bppIndexed))
            {
                using (Graphics drawBuffer = Graphics.FromImage(drawnLabel))
                {
                    (...)
                    foreach (Epl2.IDrawableCommand cmd in Label.Collection)
                    {
                        cmd.Paint(drawBuffer);
                    }
                    (...)
                }
            }
        }
    }
}
public class InvertArea : IDrawableCommand
{
    (...)
    public Rectangle InvertRectangle {get; set;}
    public void Paint(Graphics g)
    {
        throw new NotImplementedExecption();
    }
}

Что я должен вставить в Paint(Graphic g) для этой команды?

1 Ответ

5 голосов
/ 17 апреля 2010

Хитрость заключается в том, чтобы снова нарисовать то же изображение и использовать ColorMatrix, который инвертирует изображение . Например:

    protected override void OnPaint(PaintEventArgs e) {
        e.Graphics.DrawImage(mImage, Point.Empty);
        ImageAttributes ia = new ImageAttributes();
        ColorMatrix cm = new ColorMatrix();
        cm.Matrix00 = cm.Matrix11 = cm.Matrix22 = -0.99f;
        cm.Matrix40 = cm.Matrix41 = cm.Matrix42 = 0.99f;
        ia.SetColorMatrix(cm);
        var dest = new Rectangle(50, 50, 100, 100);
        e.Graphics.DrawImage(mImage, dest, dest.Left, dest.Top, 
            dest.Width, dest.Height, GraphicsUnit.Pixel, ia);
    }

Где mImage было моим образцом 1bpp изображения, и я инвертировал прямоугольник 100x100 при 50,50

...