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

C# 如何使用其他图像删除图像的一部分,c#,image,graphics,bitmap,C#,Image,Graphics,Bitmap,我有两个图像,其中一个我将使用图形(一个简单的圆/椭圆)创建 现在,我想用另一幅图像删除圆的一部分。它还应该支持删除alpha值 我希望这个链接能起作用,如果不行,请把它写进评论里&我会修正它的 谢谢你的建议 编辑: 图2实际上没有任何边框,它只是显示帧大小…以下操作即可: using System; using System.Windows; using System.Windows.Media; using System.Windows.Media.Imaging; namespace

我有两个图像,其中一个我将使用
图形
(一个简单的圆/椭圆)创建

现在,我想用另一幅图像删除圆的一部分。它还应该支持删除alpha值

我希望这个链接能起作用,如果不行,请把它写进评论里&我会修正它的

谢谢你的建议

编辑:

图2实际上没有任何边框,它只是显示帧大小…

以下操作即可:

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;
        }
    }
}
使用系统;
使用System.Windows;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
命名空间WpfApplication4
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
加载+=主窗口\u加载;
}
已加载私有void主窗口(对象发送器、路由目标)
{
var image1=新的位图图像(新的Uri(“1.png”,UriKind.Relative));
var image2=新的位图图像(新的Uri(“2.png”,UriKind.Relative));
var bitmap1=BitmapFactory.convertTopBGRA32格式(image1);
var bitmap2=BitmapFactory.convertTopBGRA32格式(image2);
变量宽度=256;
变量高度=256;
var bitmap3=BitmapFactory.New(宽度、高度);
var transparent=Color.FromArgb(0,0,0,0);
对于(变量y=0;y

我曾经让事情变得更简单,请注意使用32位PNG以及什么是透明颜色,因为在WPF中,它实际上是一种透明的白色

如果这是您正在使用的,那么您应该能够轻松地将其转换为表单


编辑:你可以使用不透明度遮罩,但由于pic.2的外部不暗,所以它不会工作。

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

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));
           }
       }
    }
}
公共静态位图删除部分(位图源、位图删除)
{
颜色c1、c2、c3;
c3=颜色。来自argb(0,0,0,0);
for(int x=0;x
@Aybe,谢谢你给这张照片添加了表情,我的名声还不够好:你敢使用表单或WPF吗?不,我正在使用winforms,但你的代码帮助我解决了问题。非常感谢:D