【问题标题】:Invert Crop from (Cut hole into) Image从(切孔)图​​像反转裁剪
【发布时间】:2019-07-22 15:00:32
【问题描述】:

我在网上看到的每一个地方,都会看到人们发布有关如何成功裁剪图像的帖子。但是,我想“裁剪”/清除图像中的一个洞。我想保留原始图像,但裁剪出一个矩形

如上图所示,我已经“裁剪”出小猫的脸。我保留了原始图像,但只删除了一部分。我不知道该怎么做。

【问题讨论】:

  • 在原始图像上覆盖一个白色矩形。
  • 我不希望它是一个白色的矩形,我想删除那个部分的像素。
  • 显示您想要的图片,因为您的图片是在原始图片之上的一个白色矩形。
  • 所以你想让那个矩形透明吗?还是要裁剪副本?
  • 请你回答我的问题:你想让那个矩形透明吗?

标签: c# image bitmap crop


【解决方案1】:

假设您想用透明度替换原始像素颜色,您会遇到一个小问题:您在 GDI+ 中无法使用透明度进行绘制或填充

但是你可以使用Graphics.Clear(Color.Transparent)

为此,您限制Graphics 对象将绘制的区域。在这里,我们可以使用简单的裁剪矩形,但您可以使用 GraphicsPath..

清除更复杂的形状

使用位图的示例bmp

using (Graphics g = Graphics.FromImage(bmp))
{
    Rectangle crop = new Rectangle(222,222,55,55);
    g.SetClip(crop);
    g.Clear(Color.Transparent);
}
bmp.Save(somefilename, ImageFormat.Png);

【讨论】:

  • 谢谢先生,这正是我需要的
  • 是的,您可以添加半透明像素,但您不能将任何像素的给定 alpha 降至 0 或任何更低的值。所以你正在绘制透明度,但你不能绘制透明度本身。
【解决方案2】:

将您的 Graphics 对象的 CompositingMode 属性设置为 CompositingMode.SourceCopy 将允许您的绘图操作替换 alpha 值,而不是按比例对其进行不透明化:

        public static void TestDrawTransparent()
        {
            //This code will, successfully, draw something transparent overwriting an opaque area.
            //More precisely, it creates a 100*100 fully-opaque red square with a 50*50 semi-transparent center.
            using(Bitmap bmp = new Bitmap(100, 100, PixelFormat.Format32bppArgb))
            {
                using(Graphics g = Graphics.FromImage(bmp))
                using(Brush opaqueRedBrush = new SolidBrush(Color.FromArgb(255, 255, 0, 0)))
                using(Brush semiRedBrush = new SolidBrush(Color.FromArgb(128, 255, 0, 0)))
                {
                    g.Clear(Color.Transparent);
                    Rectangle bigRect = new Rectangle(0, 0, 100, 100);
                    Rectangle smallRect = new Rectangle(25, 25, 50, 50);
                    g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
                    g.FillRectangle(opaqueRedBrush, bigRect);
                    g.FillRectangle(semiRedBrush, smallRect);
                }
                bmp.Save(@"C:\FilePath\TestDrawTransparent.png", ImageFormat.Png);
            }
        }

在这段代码中,我首先画了一个完全不透明的红色方块,然后在它上面画了一个半透明的红色方块。结果是广场上出现了一个半透明的“洞”:

在黑色背景上:

零不透明度画笔也可以,在图像上留下一个清晰的洞(我检查过)。 考虑到这一点,您应该能够裁剪您想要的任何形状,只需使用零不透明度画笔填充它们即可。

【讨论】:

  • 这应该是公认的答案。 - 应该注意的是,虽然这对于 100% 橡皮擦来说已经足够了,但仍然不会绘制或填充透明度,因为它替换 alpha 通道和所有颜色通道。为此,需要一个(更多)涉及的过程..
  • @TaW 啊,你的意思是如果你想改变alpha通道?可能有一种方法可以通过将所述矩形复制到新的 24 位图像来对矩形执行此操作,然后使用接受 ImageAttributesDrawImage 的重载来传递一个颜色矩阵,该矩阵乘以你的 alpha 值画...需要测试。
  • SourceCopy 将覆盖所有通道并且不合并任何内容,因此它不会像橡皮擦那样逐渐改变 alpha 通道,例如不透明度为 105..
  • 矩阵:有趣的想法。 - 我更喜欢用 lockbits 来做,然后可以以任何方式将临时位图与 tgt 位图像素结合起来。非常灵活! - 我实现了一个实现所有 Photoshop 混合模式的类,然后是一些......
猜你喜欢
  • 2013-04-05
  • 2012-02-12
  • 2016-08-01
  • 2015-02-18
  • 1970-01-01
  • 2016-08-14
  • 2016-02-06
  • 2013-04-02
  • 1970-01-01
相关资源
最近更新 更多