You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过纹理遮罩结合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的对象(如BitmapGraphicsBrush)都要用using语句包裹,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Happy Day

火山引擎 最新活动