如何通过纹理遮罩结合TextureBrush为图像填充纹理(System.Drawing实现)
使用TextureBrush结合纹理遮罩实现服装纹理填充的方法
嘿,我来帮你搞定这个需求!你想用TextureBrush给服装图的指定区域填充纹理,但不知道怎么结合遮罩控制范围对吧?其实核心是用遮罩限制纹理的绘制区域,而不是直接全图调用FillRectangle。下面是具体的实现思路和代码:
素材与预期效果
- 服装原图:

- 遮罩图:

- 纹理图:

- 预期效果:

核心实现思路
遮罩图的白色区域就是我们要填充纹理的目标区域,黑色区域需要保留原服装的样式。我们可以把遮罩转换成裁剪区域(Region),让Graphics对象只在这个区域内绘制纹理,这样就能精准控制纹理的填充范围了。
完整代码示例
using System.Drawing; using System.Drawing.Imaging; class TextureMaskFillExample { static void Main() { // 加载所有素材文件,注意确保文件路径正确 using (Bitmap textile = new Bitmap("textile.png")) using (Bitmap outfit = new Bitmap("outfit.png")) using (Bitmap mask = new Bitmap("mask.png")) using (Graphics g = Graphics.FromImage(outfit)) { // 1. 将遮罩图转换为单色格式,便于创建裁剪区域 using (Bitmap monochromeMask = mask.Clone( new Rectangle(0, 0, mask.Width, mask.Height), PixelFormat.Format1bppIndexed)) { // 从单色遮罩创建裁剪区域,白色区域会被保留为可绘制区域 Region clipRegion = new Region(monochromeMask); // 2. 设置Graphics的裁剪范围,后续绘制仅在该区域内生效 g.SetClip(clipRegion, CombineMode.Replace); // 3. 创建TextureBrush,默认使用平铺模式适配纹理 using (TextureBrush textileBrush = new TextureBrush(textile)) { // 填充整个画布,但受裁剪区域限制,只会填充遮罩指定的部分 g.FillRectangle(textileBrush, new Rectangle(0, 0, outfit.Width, outfit.Height)); } } // 4. 保存处理后的结果图片 outfit.Save("result.png", ImageFormat.Png); } } }
额外注意事项
- 尺寸匹配:确保服装图、遮罩图的尺寸完全一致,如果纹理图尺寸不同,可以通过设置
textileBrush.Transform来缩放纹理,或者先缩放纹理图到目标尺寸。 - 边缘优化:如果想要更平滑的填充边缘,可以改用Alpha混合的方式:将遮罩图作为纹理图的Alpha通道,再将带透明通道的纹理绘制到服装图上,这种方法能避免硬边缘。
- 资源释放:所有实现
IDisposable的对象(如Bitmap、Graphics、Brush)都要用using语句包裹,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Happy Day




