Как нарисовать область битового массива с 'прозрачным белым'?

Я хочу заменить все пиксели в прямоугольном регионе Битового массива с 'прозрачным белым' - т.е. a=0, b=255, r=255, g=255.

FillRectangle does не делает это - учитывая прозрачную кисть, существующие пиксели неизменны.

Я должен использовать SetPixel индивидуально для каждого пикселя в прямоугольнике?

9
задан mackenir 21 May 2010 в 14:45
поделиться

5 ответов

Вам нужно будет установить свойство Graphics.CompositingMode . Например:

protected override void OnPaint(PaintEventArgs e) {
    var img = Properties.Resources.Chrysanthemum;
    e.Graphics.DrawImage(img, 0, 0);
    e.Graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
    using (var br = new SolidBrush(Color.FromArgb(0, 255, 255, 255))) {
        e.Graphics.FillRectangle(br, new Rectangle(50, 50, 100, 100));
    }
}

Фактический цвет, который вы используете, не имеет значения, вы получите черный прямоугольник с альфа-каналом, равным 0.

13
ответ дан 4 December 2019 в 10:03
поделиться

Этот небольшой прием должен помочь:

Graphics g = Graphics.FromImage(myBitmap);
g.SetClip(new RectangleF(10, 10, 20, 20));
g.Clear(Color.Transparent);
g.RestoreClip();
g.Dispose();
0
ответ дан 4 December 2019 в 10:03
поделиться

Я считаю, что вам нужно использовать SetPixel (или эквивалентный метод установки значений цвета напрямую), чтобы пиксели были «прозрачно-белыми».

Вы можете использовать метод Graphics.Clear для установки цвета или пикселей, но вы не можете использовать его, чтобы установить их как прозрачные, так и цветные. Я пробовал это, чтобы установить пиксели в части растрового изображения:

using (Graphics g = Graphics.FromImage(theBitmap)) {
  g.Clip = new Region(new Rectangle(10, 10, 80, 80));
  g.Clear(Color.FromArgb(0, Color.White));
}

Пиксели в области заканчиваются как «прозрачный черный»: 0,0,0,0. Даже рисование сплошного белого прямоугольника перед очисткой не помогает. Когда альфа в цвете равна нулю, другие компоненты цвета также равны нулю.

Использование почти прозрачной альфы, такой как 1, работает нормально, пиксели получаются «почти прозрачными белыми»: 1,255,255,255.

4
ответ дан 4 December 2019 в 10:03
поделиться

Если вы используете методы составной окраски, то для смешивания цвета будет использоваться альфа-канал, поэтому ничего не произойдет.

Если вы хотите установить растровое изображение, либо создайте его из данных с нужным фоном, либо установите фон с помощью LockBits для массового управления данными.

Вы также можете использовать метод bitblt с соответствующими флагами, но я не знаю, как преобразовать это в управляемый код.

3
ответ дан 4 December 2019 в 10:03
поделиться

FillRectangle этого не делает - если кисть прозрачна, существующие пиксели не изменяются.

Имеет смысл, поскольку вы рисуете с непрозрачностью 0%. :)

Быстрое решение для Control - это цветной ключ. Вы можете установить ключевой цвет элемента управления на определенный цвет (например, пурпурный); тогда все пиксели этого цвета станут прозрачными. (Если, конечно, элемент управления поддерживает это.)

То или bitmap.MakeTransparent (color) для общих целей. Проблема, опять же, в том, что указанный цвет будет прозрачным, поэтому вам придется выбрать цвет, которого нет на изображении. (Здесь есть еще один пример: http://msdn.microsoft.com/en-us/library/ms172507%28v=VS.80%29.aspx )

Изменить: В конце концов, подход LockBits (), упомянутый в других комментариях, может быть тем, что вы ищете. Как только вы поймете, как взаимодействуют значения ширины и шага, вы сможете легко управлять изображением на самом низком уровне. Вот общий пример: http://www.bobpowell.net/lockingbits.htm Просто убедитесь, что изображение поддерживает прозрачность (см. PixelFormat), затем заблокируйте изображение в соответствующем режиме (например, PixelFormat.Format32bppArgb), переберите каждый пиксель, считайте байты, запишите свой новый цвет и т. Д.

0
ответ дан 4 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: