4

ピクセル以外の単位でGetBoundsから長方形を取り戻す方法を教えてもらえますか?次のコード(この関数のMSDNドキュメントから直接削除)は、ポイント(1/72インチ)ではなく、明らかにピクセル単位の長方形を返します。(アイコンのサイズが、私が思うように32x32ピクセルではなく、32/72 "x32 / 72"である場合を除きます)。私はインチ単位の長方形での作業に最も興味がありますが、GetBoundspageUnitパラメーターが返される長方形に変化をもたらすのを見るだけで落ち着きます。

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、呼び出しの後でそれを見ると、Pixelからに戻されていることがわかりますInch。長方形が描画されるサイズを実際に変更する場合は、長方形を描画するにGraphics.PageUnit PropertyオンformGraphicsを設定GraphicsUnitします。

上記のリンクから:

このサンプルでは、​​Bitmapの境界が決定されているため、Image.GetBoundsメソッドのパラメーターは結果を変更しません。パラメータは、範囲を処理するための単位長さ、インチごと、またはポイントごとのみを決定します。ただし、パラメータは結果に影響しません。

強調鉱山

于 2012-07-20T21:42:24.533 に答える
1

これに答えるのは少し遅れましたが、「写真ボックスに何mm入れることができますか?」という質問に答えようとしたときにGoogleで見つけたので、そうすると思いました。それを行う方法を考え出す必要があります!。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 imageプロパティに割り当てる(そして必要に応じて変更できるようにGraphicsオブジェクトを保持する)と役立ちます。

于 2017-09-18T17:53:14.050 に答える
-1

クラスForm1にラベルを追加フィールドPointF[]cooridatesを追加します。Form1.cs [design]プロパティでライティングボルトを探します。ペイント作成ハンドラーをダブルクリックします。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 に答える