0

次のコードでGraphics.RotateTransfrom()に問題があります。

    Dim newimage As Bitmap
    newimage = System.Drawing.Image.FromFile("C:\z.jpg")
    Dim gr As Graphics = Graphics.FromImage(newimage)
    Dim myFontLabels As New Font("Arial", 10)
    Dim myBrushLabels As New SolidBrush(Color.Black)
    Dim a As String

    '# last 2 number are X and Y coords.
    gr.DrawString(MaskedTextBox2.Text * 1000 + 250, myFontLabels, myBrushLabels, 1146, 240) 
    gr.DrawString(MaskedTextBox2.Text * 1000, myFontLabels, myBrushLabels, 1146, 290)
    a = Replace(Label26.Text, "[ mm ]", "")

    gr.DrawString(a, myFontLabels, myBrushLabels, 620, 1509)
    a = Replace(Label5.Text, "[ mm ]", "")

    gr.DrawString(a, myFontLabels, myBrushLabels, 624, 548)

    gr.RotateTransform(90.0F)

    gr.DrawString(a, myFontLabels, myBrushLabels, 0, 0)

    PictureBox1.Image = newimage

理由はわかりませんが、pictureBox1の画像が回転していません。誰かが解決策を知っていますか?

4

1 に答える 1

0

当面の問題は、RotateTransform メソッドが既存の画像に適用されないことです。

代わりに、グラフィックス オブジェクトの変換行列に適用されます。基本的に、変換マトリックスは、新しいアイテムを追加するために使用される座標系を変更します。

以下を試してください:

    Dim gfx = Graphics.FromImage(PictureBox1.Image)

    gfx.DrawString("Test", Me.Font, Brushes.Red, New PointF(10, 10))
    gfx.RotateTransform(45)
    gfx.DrawString("Rotate", Me.Font, Brushes.Red, New PointF(10, 10))

最初の文字列は通常どおりに描画され、2 番目の文字列は回転して描画されます。

したがって、新しいグラフィックス オブジェクトを作成し、回転を適用し、ソース イメージをグラフィックス (graphics.DrawImage) に描画してから、すべてのテキストを描画する必要があります。

    ' Easy way to create a graphisc object
    Dim gfx = Graphics.FromImage(PictureBox1.Image)

    gfx.Clear(Color.Black)
    gfx.RotateTransform(90) ' Rotate by 90°

    gfx.DrawImage(Image.FromFile("whatever.jpg"), New PointF(0, 0))
    gfx.DrawString("Test", Me.Font, Brushes.Red, New PointF(10, 10))
    gfx.DrawString("Rotate", Me.Font, Brushes.Red, New PointF(10, 10))

ただし、回転に注意してください。画像を描画する座標を変更する必要があることがわかります (または、グラフィックの RenderingOrigin プロパティを変更します。画像の中心に設定すると、回転を処理しやすくなります)。画像は表示されません (描画されますが、グラフィックの表示部分から外れます)。

それが役立つことを願っています

于 2012-11-27T08:21:40.630 に答える