如何使用其他图像删除图像的一部分

时间:2015-03-24 16:31:29

标签: c# image graphics bitmap

我有两张图片,其中一张是我用Graphics创建的(一个简单的圆圈/椭圆)。

现在我想用另一张图片删除圆圈的一部分。它也应该支持删除alpha值。

enter image description here

  

我希望链接有效,如果没有,请将其写入评论&我会解决它。

感谢您的任何建议

修改

图像2实际上没有任何边框,只是为了显示帧尺寸......

2 个答案:

答案 0 :(得分:1)

以下是:

using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace WpfApplication4
{
    /// <summary>
    ///     Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded;
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            var image1 = new BitmapImage(new Uri("1.png", UriKind.Relative));
            var image2 = new BitmapImage(new Uri("2.png", UriKind.Relative));
            var bitmap1 = BitmapFactory.ConvertToPbgra32Format(image1);
            var bitmap2 = BitmapFactory.ConvertToPbgra32Format(image2);

            var width = 256;
            var height = 256;
            var bitmap3 = BitmapFactory.New(width, height);

            var transparent = Color.FromArgb(0, 0, 0, 0);
            for (var y = 0; y < height; y++)
            {
                for (var x = 0; x < width; x++)
                {
                    var color1 = bitmap1.GetPixel(x, y);
                    var color2 = bitmap2.GetPixel(x, y);
                    Color color3;
                    if (color1.Equals(transparent))
                    {
                        color3 = transparent;
                    }
                    else
                    {
                        if (color2.Equals(transparent))
                        {
                            color3 = color1;
                        }
                        else
                        {
                            color3 = transparent;
                        }
                    }
                    bitmap3.SetPixel(x, y, color3);
                }
            }
            Image1.Source = bitmap3;
        }
    }
}

enter image description here

enter image description here

enter image description here

我已经使用https://www.nuget.org/packages/WriteableBitmapEx/来简化操作,小心使用32位PNG以及透明色是什么,因为在WPF中它实际上是透明的白色。

如果你正在使用这个https://msdn.microsoft.com/en-us/library/system.drawing.bitmap%28v=vs.110%29.aspx,你应该可以轻松地将其翻译成表格。

编辑:你可以使用不透明蒙版,但由于pic.2不是它的外部黑暗,它不会有用。

答案 1 :(得分:1)

最后,我自己编写了代码。就是这样:

public static Bitmap RemovePart(Bitmap source, Bitmap toRemove)
{
    Color c1, c2, c3;
    c3 = Color.FromArgb(0, 0, 0, 0);
    for (int x = 0; x < source.Width; x++)
    {
       for (int y = 0; y < source.Height; y++)
       {
           c1 = source.GetPixel(x, y);
           c2 = toRemove.GetPixel(x, y);
           if (c2 != c3)
           {
               source.SetPixel(x, y, Color.FromArgb(c2.A, c1));
           }
       }
    }
}