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))

第一个字符串是正常绘制的,而第二个字符串是旋转绘制的。

因此,您需要做的是创建一个新的图形对象,应用您的旋转,将源图像绘制到图形(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 回答