System.Drawing.Bitmap GetBounds GraphicsUnit.Inch

时间:2012-07-20 20:13:52

标签: c# image bitmap system.drawing system.drawing.imaging

有人可以告诉我如何在除像素以外的任何单位中从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();

3 个答案:

答案 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