【问题标题】:Remove a round transparent section of an Image c#删除图像的圆形透明部分 c#
【发布时间】:2019-02-14 02:35:20
【问题描述】:

我正在位图上创建一个圆形,但想在其中有一个洞。搜索半小时后,我才找到将图像裁剪为圆形的方法。难的是,中间的洞应该和图像的其余部分一样透明。

This 是基础图像,the yellow circle 表示应该添加的透明区域。

感谢您的任何帮助。

【问题讨论】:

  • 位图不支持透明度。幸运的是,您在问题中链接的图像不是位图,而是 确实 支持透明度的 PNG 图像。我建议您大量编辑您的问题,用“png”代替“位图”的提及。我冒昧地将bitmap 标签替换为png,希望它能吸引到合适的专业知识:)
  • 嗯`new Bitmap(2048, 2048, System.Drawing.Imaging.PixelFormat.Format32bppArgb)`对我来说完全没问题而且是透明的!
  • @clark:不要将 BMP 文件格式与 GDI Bitmapobject 混淆!
  • @TaW 太晚了;我已经这样做了。
  • 好吧,那你还有什么建议呢?

标签: c# bitmap transparency system.drawing


【解决方案1】:

开始很简单:通过g.Clear(Color.Transparent) 创建一个透明位图,然后用一种颜色绘制/填充一个圆圈。

下一步有点棘手:接下来您要使用透明度绘制孔。

为此,您需要将图形对象切换到右侧CompositingMode;默认是SourceOver,但你想要SourceCopy。前者覆盖 alpha 值,创建混合颜色。后者会做我们想做的事:通过复制绘制的颜色包括alpha在旧的颜色上绘制洞..

这是一个例子:

Bitmap bmp = new Bitmap(500, 500);
using (Graphics g = Graphics.FromImage(bmp))
{
    g.Clear(Color.Transparent);
    //g.SmoothingMode = SmoothingMode.AntiAlias;
    g.CompositingMode = CompositingMode.SourceCopy;
    g.FillEllipse(Brushes.DarkGreen, 100, 100, 300, 300);
    g.FillEllipse(Brushes.Transparent, 200, 200, 100, 100);
}
pictureBox1.Image = bmp;

这是PictureBoxBackgroundImage 中的样子:

一些注意事项:

  • 您还可以使用半透明画笔创建一个“着色”孔;但是不要为此使用抗锯齿,因为它会引入彩色边缘。

  • 我们在这里使用了简单的圆圈,但使用 GraphicsPath,您可以创建和填充几乎任何形状和复杂度的形状..

  • 使用GraphicsPath 也可以替代填充透明度:首先添加大椭圆,然后然后添加较小的内椭圆路径会创建一个洞并填充它会得到完全相同的结果!但我发现上面的解决方案更有指导意义..

  • 最后说明:正如 clarkitect 所指出的,要保存,请务必使用支持透明度的格式。总是推荐Png..

【讨论】:

  • 非常感谢,从来没有想过这样的事情!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多