未裁剪的重叠图像

时间:2019-08-10 14:45:16

标签: c# visual-studio winforms overlay picturebox

我想要透明的重叠非剪切图像。我有一个PictureBox与另一个重叠,如this SO线程所示。

有意义的解决方案将顶部图像的父级设置为底部图像。然后将顶部图像设置为具有透明背景。该技术效果很好,只需将顶部图像的父级设置为底部图像的父级,即可将顶部图像裁剪到底部图像的区域。

顶部图像父属性未设置为底部图像

2 separate images with parent set to the main control

现在,如果将顶部图像父属性设置为底部图像,则会发生以下情况。

Clipping effect of top image parent property set to the bottom image

我不希望剪切顶部的图像。

我会自愿参加整个Visual Studio 2019(VS2019)项目,但不确定如何发布它。

代码如下:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace ImageOverlap
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        private void FrmMain_Load(object sender, EventArgs e)
        {
            this.ImgTop.Parent = this.ImgBottom;
            this.ImgTop.BackColor = Color.Transparent;
            //this.ImgTop.BringToFront();
            this.ChangeX.Value = 430;
            this.ChangeY.Value = 15;
        }

        private void ChangeX_ValueChanged(object sender, EventArgs e)
        {
            this.ImgTop.Left = (int)this.ChangeX.Value;
        }

        private void ChangeY_ValueChanged(object sender, EventArgs e)
        {
            this.ImgTop.Top = (int)this.ChangeY.Value;
        }
    }
}

我放置了2个NumericUpDown控件,以更好地调整手指指针的位置。

可以删除对方法BringToFront()的调用,什么也没有删除,就像上面几个答案中提到的那样,用于测试。

更新

  • 我不想拉伸底部图像。我想查看表单背景。
  • 我还意识到指针是底部(父)图像的out of bounds。这样,指针将clipped断开。

我要显示整个顶部图像,仅显示顶部图像的一部分,该部分与底部图像重叠以使其透明。

使用必须成为世界上最好的应用程序Paint.Net,这就是我想要的,并且也是一种很好的可重用代码格式。

Properly non-clipped top image overlapping a bottom image

我对解决方案的想法是现在制作手形指针的程序副本,并将其覆盖在表格上,仅剪切左部分,该部分与底部图像重叠。我认为这个想法可能行得通,如果行得通,就会作为答案发布。

2 个答案:

答案 0 :(得分:0)

您希望整个图像都显示在底部图像上,如果是,则意味着您的问题是顶部图像位置的计算。

    this.ImgTop.Parent = this.ImgBottom;
    this.ImgTop.BackColor = Color.Transparent;
    this.ImgTop.BringToFront();

    this.ImgTop.Top = 0;
    this.ImgTop.Left = ImgBottom.Width - ImgTop.Width;

我看到您对Reza的重播,对于误解表示抱歉。您将顶部图像的父级设置为底部图像。此后,控件将无法在父区域之外执行任何其他操作。如果要执行此操作,则可以将图像动态拆分为单独的图像控件,一个主题位于底部图像内,另一个主题位于外部图像内,并控制两个主题的位置,或者可以借助多边形来实现自己的控件。

答案 1 :(得分:0)

此答案可能可以优化并提高可重用性,但是它可以工作。

我创建了顶部控件的副本。然后,我使用了此更新的代码,其中包括可重用的方法。

using System;
using System.Drawing;
using System.Windows.Forms;

namespace ImageOverlap
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        private void FrmMain_Load(object sender, EventArgs e)
        {
            this.ImgTop.Parent = this.ImgBottom;
            this.ImgTop.BackColor = Color.Transparent;
            this.ImgTop.BringToFront();
            this.ChangeX.Value = 430;
            this.ChangeY.Value = 15;
        }

        private void ChangeX_ValueChanged(object sender, EventArgs e)
        {
            this.SetOverlayImageLocation((int)this.ChangeX.Value, this.ImgTop.Top);
        }

        private void ChangeY_ValueChanged(object sender, EventArgs e)
        {
            this.SetOverlayImageLocation(this.ImgTop.Left, (int)this.ChangeY.Value);
        }

        private void SetOverlayImageLocation(int newX, int newY)
        {
            this.ImgTop.Left = newX;
            this.ImgTop.Top = newY;
            Point ptImageAtParent = new Point(this.ImgTop.Left + this.ImgBottom.Left, this.ImgTop.Top + this.ImgBottom.Top);
            this.ImgTopCopy.Location = ptImageAtParent;
            this.ImgTopCopy.SendToBack();
        }
    }
}

我认为.Net可能有一个很好的方法/属性来相对于父级获取要点。我是用蛮力方法做到的。然后,我将副本放置在背面。副本的位置是相对于父级设置的。诀窍在于,副本将父属性设置为主控件。

这是我得到的运行时视觉,不涉及Paint.Net;看起来一样,这是目标。

令人高兴的是,NumericUpDown控件可以完美地移动合成图像,并向用户显示为一张图像。

Visually properly overlapped non-clipped image, which in reality are 2 separate images.