我想用“透明白色”替换位图的矩形区域中的所有像素-即,a = 0,b = 255,r = 255,g = 255。
FillRectangle无法实现此功能-使用透明画笔时,现有像素不会改变。
我需要逐个使用SetPixel来处理矩形内的每个像素吗?
您需要设置 Graphics.CompositingMode
属性。例如:
protected override void OnPaint(PaintEventArgs e) {
using (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));
}
}
}
实际使用的颜色并不重要,您将获得一个 alpha 值为 0 的黑色矩形。
我相信你需要使用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。即使在清除之前绘制一个纯白色矩形也无济于事。当颜色中的Alpha值为零时,其他颜色分量也为零。
使用接近透明的Alpha(如1)是可以的,像素最终变为“几乎透明白色”:1,255,255,255。
重要提示:
创建图像时,请确保按照以下步骤进行操作。
mainImage = new Bitmap(totalWidth, maxHeight, PixelFormat.Format32bppARgb);
而不是
mainImage = new Bitmap(totalWidth, maxHeight, PixelFormat.Format32bppRgb);
这将节省您一些麻烦。不要假设32位表示Alpha通道 ;-)
这个小技巧应该可以解决问题:
Graphics g = Graphics.FromImage(myBitmap);
g.SetClip(new RectangleF(10, 10, 20, 20));
g.Clear(Color.Transparent);
g.RestoreClip();
g.Dispose();
g.Clear(Color.FromArgb(0, 255, 255, 255));
虽然Hans Passant的答案可能更好 - C.Evenhuis编辑: 最后,其他评论中提到的 LockBits() 方法可能是您寻找的。一旦您了解了宽度和步幅值如何相互作用,就可以在可能的最低级别上操作图像。 这是一个通用示例:https://web.archive.org/web/20141229164101/http://bobpowell.net/lockingbits.aspx 只需确保图像支持透明度(参见 PixelFormat),然后使用适当的模式锁定图像(即 PixelFormat.Format32bppArgb),循环遍历每个像素,读取字节,编写新颜色等。