4

谁能告诉我如何以像素以外的任何单位从 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();
4

3 回答 3

4

这方面的信息有点稀疏,我能够找到这个MSDN 论坛帖子,表明由于位图已经创建,单位已经设置并且不可更改。由于GraphicsUnit是通过引用传递的,因此您在调用后查看它会发现它设置回Pixelfrom Inch。如果您确实想更改绘制矩形的大小,请将Graphics.PageUnit Propertyon设置formGraphicsGraphicsUnit您想要绘制矩形的位置。

从上面的链接:

在这个示例中,Image.GetBounds 方法的参数不会改变结果,因为 Bitmap 的边界已经确定。参数只确定单位长度处理的范围,逐英寸或逐点。但参数不会影响结果。

强调我的

于 2012-07-20T21:42:24.533 回答
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,这将改变。

编辑:当然,如果您将位图分配给图片框图像属性(并保留 Graphics 对象以允许根据需要进行更改),这会有所帮助。

于 2017-09-18T17:53:14.050 回答
-1

在 Form1 类中添加标签 添加字段 PointF[] 坐标;Form1.cs [设计] 在属性中查找照明螺栓双击 Paint 创建处理程序 Form1_Paint(object sender,PaintEventArgs) { e.Graphics.PageUnit = GraphicsUnit.Inch; if (cooridates != null) e.Graphics.TransformPoints(CoorinateSpace.World, CoorinateSpace.Device,cooridates); } 再次为 Form1.MouseMove 创建处理程序 Form1_MouseMove(object sender,MouseEventArgs e { cooridates[0].X = e.Location.X; cooridates[0].Y = e.Location.Y; this.Refresh(); label1.文本 = $"X = {cooridates[0].X} Y = { { cooridates[0].Y } "; }

                                                                            Form1_Load(object sender,MouseEventArgs)
                                                                                {
                                                                                    cooridates = new PointF[1] { new PointF(0f,0f) };
                                                                                         }

                                                                                             Move mouse to get cooridates in Inches
于 2021-07-18T18:18:32.157 回答