我想要透明的重叠非剪切图像。我有一个PictureBox
与另一个重叠,如this SO线程所示。
有意义的解决方案将顶部图像的父级设置为底部图像。然后将顶部图像设置为具有透明背景。该技术效果很好,只需将顶部图像的父级设置为底部图像的父级,即可将顶部图像裁剪到底部图像的区域。
顶部图像父属性未设置为底部图像
现在,如果将顶部图像父属性设置为底部图像,则会发生以下情况。
我不希望剪切顶部的图像。
我会自愿参加整个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,这就是我想要的,并且也是一种很好的可重用代码格式。
我对解决方案的想法是现在制作手形指针的程序副本,并将其覆盖在表格上,仅剪切左部分,该部分与底部图像重叠。我认为这个想法可能行得通,如果行得通,就会作为答案发布。
答案 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
控件可以完美地移动合成图像,并向用户显示为一张图像。