解决  帮助绘图(图像图像,int x,int y)

tim8w

众所周知的成员
加入
9月8日,2020年
消息
86
编程经验
10+
我有一个矩形,它被定义为我想要绘制128x128图像的(0,40,475,244)。我正在致电绘图,如下所示:

C#:
Point pImage = new Point();
pImage.X = (rPanel.Right - rPanel.Left) / 2 - this.BackgroundImage.Size.Width / 2;
pImage.Y = (rPanel.Bottom - rPanel.Top) / 2 - this.BackgroundImage.Size.Height / 2;
g.DrawImage(this.BackgroundImage, pImage.X, pImage.Y);

得到的图像最终在错误的地方绘制。

1613196276693.png.


应该更喜欢这样:

1613196338589.png.


我知道它必须是显而易见的,但我看不到图像位置的计算有什么问题......
 
Solution
我设法重现了你的问题。

打开打开.png文件,看起来它是格式化的72 dpi,而windows默认为96 dpi。因此,您需要让Windows将图像放入相应的区域。就像是:
C#:
var ptImage = new Rectangle()
{
    X = rect.Width / 2 - _img.Width / 2 + rect.Left,
    Y = rect.Height / 2 - _img.Height / 2 + rect.Top,
};

g.DrawImage(_img, new Rectangle(ptImage, _img.Size));

In the image below, notice the bigger image drawn by DrawImage(Image, Point), and then painted over by the DrawImage(Image, Rectangle) which is right in the green rectangle where we expected the image to be drawn into.

screenshot_1.png.

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,731
地点
悉尼,澳大利亚
编程经验
10+
Please provide a FULL and CLEAR explanation of the problem. You say that you have a Rectangle. OK then. How exactly does that relate to the code? What is this in that code? We need ALL the relevant information.
 

tim8w

众所周知的成员
加入
9月8日,2020年
消息
86
编程经验
10+
Please provide a FULL and CLEAR explanation of the problem. You say that you have a Rectangle. OK then. How exactly does that relate to the code? What is this in that code? We need ALL the relevant information.
对不起,矩形描述了标题下方的面板。我正在尝试将图像居中在该矩形中。
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,160
地点
挪威
编程经验
10+
当有偏移量时,您必须计算宽度/高度的中心,然后偏移位置。
 

tim8w

众所周知的成员
加入
9月8日,2020年
消息
86
编程经验
10+
当有偏移量时,您必须计算宽度/高度的中心,然后偏移位置。
我意识到了这一点。这就是我在这里完成的:

C#:
Point pImage = new Point();
pImage.X = (rPanel.Right - rPanel.Left) / 2 - this.BackgroundImage.Size.Width / 2;
pImage.Y = (rPanel.Bottom - rPanel.Top) / 2 - this.BackgroundImage.Size.Height / 2;
g.DrawImage(this.BackgroundImage, pImage.X, pImage.Y);

但正如您在上面的图片中看到的那样,即使计算是正确的,它也不会正确地定位它。面板矩形是(0,40,475,244),图像为128x128。拉伸的结果开始点是(173,38)。当它绘制图像时,它看起来偏离中心。 x位置似乎是太​​远的约23,y位置似乎太高了大约16.是否有一些像素转换,我没有考虑到?托管表单autostalemode设置为"None".
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,160
地点
挪威
编程经验
10+
结果是(173,58),它应该是(173,98),添加Y偏移40.这没有解释x问题,也许您可​​以发布我们可以运行的东西来重现它。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
Are you sure that the image really is 128x128? What values are you getting in the debugger for this.BackgroundImage.Size.Width and this.BackgroundImage.Size.Height?
 

tim8w

众所周知的成员
加入
9月8日,2020年
消息
86
编程经验
10+
Are you sure that the image really is 128x128? What values are you getting in the debugger for this.BackgroundImage.Size.Width and this.BackgroundImage.Size.Height?
大小肯定是128x128。因此,当我在X的形式上减去面板的实际位置(21,22)时,即从计算的最终位置减去21时,它在X中完美地对齐。如果我需要为x做到这一点,那就不会我必须为你做同样的事情吗?
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
尝试运行以下内容:
C#:
Point pImage = new Point();
pImage.X = (rPanel.Right - rPanel.Left) / 2 - this.BackgroundImage.Size.Width / 2;
pImage.Y = (rPanel.Bottom - rPanel.Top) / 2 - this.BackgroundImage.Size.Height / 2;
g.DrawImage(this.BackgroundImage, pImage.X, pImage.Y);
g.DrawRectangle(new Pen(Color.Green, 3), new Rectangle(pImage, this.BackgroundImage.Size));

然后拍摄屏幕截图并将其发布到此线程。我想知道图像是否是128x128,但图像的实际内容实际上并不是边缘。
 

tim8w

众所周知的成员
加入
9月8日,2020年
消息
86
编程经验
10+
尝试运行以下内容:
C#:
Point pImage = new Point();
pImage.X = (rPanel.Right - rPanel.Left) / 2 - this.BackgroundImage.Size.Width / 2;
pImage.Y = (rPanel.Bottom - rPanel.Top) / 2 - this.BackgroundImage.Size.Height / 2;
g.DrawImage(this.BackgroundImage, pImage.X, pImage.Y);
g.DrawRectangle(new Pen(Color.Green, 3), new Rectangle(pImage, this.BackgroundImage.Size));

然后拍摄屏幕截图并将其发布到此线程。我想知道图像是否是128x128,但图像的实际内容实际上并不是边缘。
 

附件

  • 1613268422553.png.
    1613268422553.png.
    27.3 KB · Views: 7

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
向我展示,告诉您图像仅包含整个图像区域右下角的红色箭头。
 

tim8w

众所周知的成员
加入
9月8日,2020年
消息
86
编程经验
10+
好的。让我们开始这件事。我有一个带有以下大小的面板:(0,40,475,244)。顶部40像素由标题占用,所以当我将图像居中在面板的下部中的图像中心时,我不希望它们被认为是。我使用的测试图像是128x128。图像不占用整个128x128。它是顶部和底部的短片,左侧和右侧有点短。所以我想要居中的区域是(0,40,475,204)(原始面板减去40像素标题)

我尝试的计算是:

C#:
Point pImage = new Point();
pImage.X = (rPanel.Right - rPanel.Left) / 2 - this.BackgroundImage.Size.Width / 2;
pImage.Y = (rPanel.Bottom - rPanel.Top) / 2 - this.BackgroundImage.Size.Height / 2;
g.DrawImage(this.BackgroundImage, pImage.X, pImage.Y);

RPanel是(0,40,475,204)和This.Backgardimage.size =(128,128)


当我使用此计算时,图像未居中。它被转移到右边。

1613276677753.png.


我希望它以这样的东西为中心:

1613276757421.png
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
我使用的测试图像是128x128。图像不占用整个128x128。它是顶部和底部的短片,左侧和右侧有点短。
但这不是被那个绿色矩形淹没在与你的形象相同的地方的故事。它显示图像实际上被困在128x128区域的右下角。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
啊!因此,图像不仅包含箭头,而且只看起来像窗口浏览器的框。

现在,如果绿色矩形从图像远离图像,那真的很搞砸了。

Do you change any of the graphics context's translate or origin values? What happens when you add g.Transform.Reset() before drawing the image and the green rectangle?
 

tim8w

众所周知的成员
加入
9月8日,2020年
消息
86
编程经验
10+
啊!因此,图像不仅包含箭头,而且只看起来像窗口浏览器的框。

现在,如果绿色矩形从图像远离图像,那真的很搞砸了。

Do you change any of the graphics context's translate or origin values? What happens when you add g.Transform.Reset() before drawing the image and the green rectangle?
结果:

1613322045520.png.
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
你可以上传PNG文件吗?这里真的很奇怪。
 

tim8w

众所周知的成员
加入
9月8日,2020年
消息
86
编程经验
10+
这里是
你可以上传PNG文件吗?这里真的很奇怪。
在这里它是......实际上任何图像都会。我只是检查我的代码,看看我是否可以绘制居住的背景图像,瓷砖等。只有我能够正确绘制的唯一一个并且伸展。
 

附件

  • collasspanel128.png
    collasspanel128.png
    16.3 KB · Views: 7

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
坚持,稍等。这里有些奇怪。 rpanel.left如何才为0,但是面板左侧有黑色到蓝色渐变?那是一些其他控制中的rpanel吗?
 
最佳 底部