Я хочу заменить все пиксели в прямоугольном регионе Битового массива с 'прозрачным белым' - т.е. a=0, b=255, r=255, g=255.
FillRectangle does не делает это - учитывая прозрачную кисть, существующие пиксели неизменны.
Я должен использовать SetPixel индивидуально для каждого пикселя в прямоугольнике?
Вам нужно будет установить свойство 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.
Этот небольшой прием должен помочь:
Graphics g = Graphics.FromImage(myBitmap);
g.SetClip(new RectangleF(10, 10, 20, 20));
g.Clear(Color.Transparent);
g.RestoreClip();
g.Dispose();
Я считаю, что вам нужно использовать 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.
Если вы используете методы составной окраски, то для смешивания цвета будет использоваться альфа-канал, поэтому ничего не произойдет.
Если вы хотите установить растровое изображение, либо создайте его из данных с нужным фоном, либо установите фон с помощью LockBits для массового управления данными.
Вы также можете использовать метод bitblt с соответствующими флагами, но я не знаю, как преобразовать это в управляемый код.
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), переберите каждый пиксель, считайте байты, запишите свой новый цвет и т. Д.