有人可以告诉我如何在除像素以外的任何单位中从GetBounds获取矩形吗?下面的代码 - 直接取消了这个函数的MSDN文档 - 返回一个非常明显的像素而不是点(1/72英寸)的矩形。 (除非图标大小为32/72“x32 / 72”而不是像我想的那样32x32像素)。我最感兴趣的是使用一个以英寸为单位的矩形,但我只想看到GetBounds pageUnit参数导致返回的矩形发生变化。
Bitmap bitmap1 = Bitmap.FromHicon(SystemIcons.Hand.Handle);
Graphics formGraphics = this.CreateGraphics();
GraphicsUnit units = GraphicsUnit.Point;
RectangleF bmpRectangleF = bitmap1.GetBounds(ref units);
Rectangle bmpRectangle = Rectangle.Round(bmpRectangleF);
formGraphics.DrawRectangle(Pens.Blue, bmpRectangle);
formGraphics.Dispose();
答案 0 :(得分:4)
信息有点稀疏,我能够找到这个MSDN Forum posting,这表明由于已经创建了位图,因此单位已经设置且不可更改。由于GraphicsUnit
是通过引用传递的,因此您会在通话后查看它,您会发现它从Pixel
设置回Inch
。如果您确实想要更改绘制矩形的大小,请将formGraphics
上的Graphics.PageUnit Property
设置为要在此处绘制矩形的GraphicsUnit
。
从上方链接:
在此示例中,Image.GetBounds方法的参数不会更改结果,因为已经确定了Bitmap的边界。参数仅确定处理范围的单位长度,逐英寸或逐点。但参数不会影响结果。
强调我的
答案 1 :(得分:1)
有点迟到回答这一点,但我想我会这样做,因为我在谷歌发现它时,试图回答“我可以在我的图片框中放多少毫米?”的问题,这会让我节省很多时间不必弄清楚如何做到这一点! GetBounds是没用的(如果你想要它的像素......)但是可以使用Graphics.TransformPoints方法找到绘图单元和显示像素之间的关系:
private void Form1_Load(object sender, EventArgs e)
{
Bitmap b;
Graphics g;
Size s = pictureBox1.Size;
b = new Bitmap(s.Width, s.Height);
g = Graphics.FromImage(b);
PointF[] points = new PointF[2];
g.PageUnit = GraphicsUnit.Millimeter;
g.PageScale = 1.0f;
g.ScaleTransform(1.0f, 1.0f);
points[0] = new PointF(0, 0);
points[1] = new PointF(1, 1);
g.TransformPoints(CoordinateSpace.Device, CoordinateSpace.Page, points);
MessageBox.Show(String.Format("1 page unit in {0} is {1} pixels",g.PageUnit.ToString(),points[1].X));
points[0] = new PointF(0, 0);
points[1] = new PointF(1, 1);
g.TransformPoints(CoordinateSpace.Page, CoordinateSpace.World, points);
MessageBox.Show(String.Format("1 page unit in {0} is {1} pixels",g.PageUnit.ToString(),points[1].X));
g.ResetTransform();
pictureBox1.Image = b;
SolidBrush brush = new SolidBrush(Color.FromArgb(120, Color.Azure));
Rectangle rectangle = new Rectangle(10, 10, 50, 50);
// Fill in the rectangle with a semi-transparent color.
g.FillRectangle(brush, rectangle);
pictureBox1.Invalidate();
}
这将显示基本mm以显示像素(在我的情况下为3.779527) - 世界坐标为每像素1 mm,如果应用graphics.ScaleTransform,这将会改变。
编辑:当然,如果将位图分配给pictureBox图像属性(并保持Graphics对象允许根据需要进行更改),它会有所帮助。
答案 2 :(得分:-1)
添加标签 在类 Form1 添加字段 PointF[] 坐标; Form1.cs [设计] 在属性中寻找灯光螺栓双击 Paint 创建处理程序 Form1_Paint(对象发送者,PaintEventArgs) { e.Graphics.PageUnit = GraphicsUnit.Inch; 如果(坐标!= null) e.Graphics.TransformPoints(CoorinateSpace.World, CoorinateSpace.Device,cooridates); } 再次为 Form1.MouseMove 创建处理程序 Form1_MouseMove(对象发送者,MouseEventArgs e { 坐标[0].X = e.Location.X; 坐标[0].Y = e.Location.Y; this.Refresh(); label1.Text = $"X = {坐标[0].X} Y = { {坐标[0].Y}”; }
Form1_Load(object sender,MouseEventArgs)
{
cooridates = new PointF[1] { new PointF(0f,0f) };
}
Move mouse to get cooridates in Inches