Заменить цвета в индексированном изображении с помощью C # - PullRequest
1 голос
/ 21 марта 2011

Я использую Graphics.DrawImage, чтобы записать растровое изображение индекса в другое изображение. Черный цвет в индексированном изображении должен быть заменен прозрачным цветом при записи в «targetBitmap»

Как мне сделать это хорошим, быстрым способом?

var graphics = Graphics.FromImage(targetBitmap);

//I want the black color in "indexBitmap" to be transparent when it's written to "targetBitmap"
graphics.DrawImage(indexedBitmap,...)

Ответы [ 3 ]

4 голосов
/ 21 марта 2011

Создание цветовой карты и передача ее в качестве аргумента «ImageAttributes» в DrawImage сработало для меня

var colorMaps = new[]{
   new ColorMap {OldColor = Color.FromArgb(255, 0, 0, 0), NewColor =  Color.Transparent}
};

var attr = new ImageAttributes();
attr.SetRemapTable(colorMaps);
1 голос
/ 21 марта 2011

Как насчет использования SetColorKey?

0 голосов
/ 12 февраля 2014

SetColorKey позволяет выбирать прозрачный фон при рисовании изображения на графическом объекте.Но дело в том, что это не работает, когда вызывается функция SetRemapTable ().

Вы также можете сделать это, добавив дополнительную ColorMap в массив «colorMaps».Эта дополнительная ColorMap должна иметь - OldColor = 'Выберите прозрачный цвет' - NewColor = Color.Transparent, а затем вызвать SetRemapTable с расширенной подпрограммой.

Ниже вы видите пример кода в C #, чтобы легко нарисовать изображение вграфический объект.Я использую это, чтобы сделать игру с графикой.Этот пробел (подпункт в основном) позволяет рисовать изображение в графике (например, FormX.CreateGraphics ()).

Вы можете заменить определенные цвета другими цветами, а также выбрать прозрачный цвет.

Вы также можете нарисовать изображение с указанным углом (градусы).

public static void DrawImageToGraphics(Graphics gr, Bitmap img, Rectangle DestRect, Color[] OldColors, Color[] NewColors, Color TransparantColor, uint Angle)
{
    System.Drawing.Drawing2D.Matrix lmx = new System.Drawing.Drawing2D.Matrix();
    lmx.RotateAt(Angle, new PointF((DestRect.Left + DestRect.Right) / 2, (DestRect.Top + DestRect.Bottom) / 2));
    gr.Transform = lmx;

    System.Drawing.Imaging.ColorMap[] maps = new System.Drawing.Imaging.ColorMap[OldColors.Count() + 1];
    for (int i = 0; i < OldColors.Count(); i++)
    {
        maps[i].OldColor = OldColors[i];
        maps[i].NewColor = NewColors[i];
    }
    maps[OldColors.Count()].OldColor = TransparantColor;
    maps[OldColors.Count()].NewColor = Color.Transparent;
    System.Drawing.Imaging.ImageAttributes attr = new System.Drawing.Imaging.ImageAttributes();
    attr.SetRemapTable(maps);

    gr.DrawImage(img, DestRect, 0, 0, img.Width, img.Height, GraphicsUnit.Point, attr);
}
...