Rank: Newbie
Groups: Guest
Joined: 7/24/2009(UTC) Posts: 1
|
I am currently evaluating this product and want to implement curved text. I found an example in the forum, but it does not work exactly as I want. See my example image: [Image was removed] First of all the text does not appear as if it is at the correct angle. Secondly, I would like the text to appear centered on the circle like this example: [Image was removed] Does anyone have any ideas? Thanks in advance, Al Tremblay Here is my sample code: Code: Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
Const centerX As Integer = 228
Const centerY As Integer = 228
Const radius As Integer = 220
Dim bitmap As New Aurigma.GraphicsMill.Bitmap(450, 450, _
Aurigma.GraphicsMill.PixelFormat.Format24bppRgb)
Dim graphics As Aurigma.GraphicsMill.Drawing.GdiGraphics = _
bitmap.GetGdiGraphics()
graphics.FillRectangle(New Aurigma.GraphicsMill.Drawing.SolidBrush( _
Aurigma.GraphicsMill.RgbColor.White), 0, 0, 460, 460)
Dim font As New Aurigma.GraphicsMill.Drawing.Font( _
"verdana", 30, False, False)
font.VerticalAlignment = Aurigma.GraphicsMill.Drawing.VerticalAlignment.Top
Dim text As String = "THE FIRST ENGLISH SETTLEMENT IN CONNECTICUT"
Dim positions As Single() = font.GetCharacterPositions(text, 0)
graphics.DrawEllipse(New Aurigma.GraphicsMill.Drawing.Pen( _
Aurigma.GraphicsMill.RgbColor.Black, 1), 0, 0, 450, 450)
Dim brush As New Aurigma.GraphicsMill.Drawing.SolidBrush(Aurigma.GraphicsMill.RgbColor.Black)
For i As Integer = 0 To text.Length - 1
Dim angle As Single = positions(i) / radius + Math.PI
Dim x As Single = centerX + radius * Math.Cos(angle)
Dim y As Single = centerY + radius * Math.Sin(angle)
Dim rotateMatrix As New System.Drawing.Drawing2D.Matrix
rotateMatrix.RotateAt(angle / Math.PI * 180 + 90, _
New System.Drawing.PointF(x, y))
graphics.Transform = rotateMatrix
graphics.DrawString(text.Chars(i), font, brush, x, y)
Next
Dim strOutputFilePath As String = Server.MapPath("images\") & "text1.png"
Dim strNewImagePath As String = "~/images/text1.png"
bitmap.Save(strOutputFilePath)
image1.ImageUrl = strNewImagePath
End Sub
Edited by user 15 years ago
| Reason: Not specified
|
|
|
|
Rank: Advanced Member
Groups: Guest
Joined: 1/31/2005(UTC) Posts: 458
Was thanked: 5 time(s) in 5 post(s)
|
Hello Al, Take a look at the code sample below. It produces more 'smooth' text and centers text at the top of the circle: Code:Private Sub RunTest()
Dim text As String = "THE FIRST ENGLISH SETTLEMENT IN CONNECTICUT"
Const centerX As Integer = 300
Const centerY As Integer = 300
Const radius As Integer = 200
Dim bitmap As New Aurigma.GraphicsMill.Bitmap( _
2 * centerX, _
2 * centerY, _
Aurigma.GraphicsMill.PixelFormat.Format24bppRgb)
Dim g As Aurigma.GraphicsMill.Drawing.GdiGraphics = bitmap.GetGdiGraphics()
g.FillRectangle( _
New Aurigma.GraphicsMill.Drawing.SolidBrush(Aurigma.GraphicsMill.RgbColor.White), _
0, _
0, _
bitmap.Width, _
bitmap.Height)
Dim font As new Aurigma.GraphicsMill.Drawing.Font("Tahoma", 37, false, false)
font.VerticalAlignment = Aurigma.GraphicsMill.Drawing.VerticalAlignment.Baseline
font.HorizontalAlignment = Aurigma.GraphicsMill.Drawing.HorizontalAlignment.Center
Dim positions As Single() = font.GetCharacterPositions(text, 0)
Dim textSize As SizeF = font.MeasureString(text)
g.DrawEllipse( _
New Aurigma.GraphicsMill.Drawing.Pen(Aurigma.GraphicsMill.RgbColor.Black, 1), _
centerX - radius, _
centerY - radius, _
radius * 2, _
radius * 2)
Dim brush As New Aurigma.GraphicsMill.Drawing.SolidBrush(Aurigma.GraphicsMill.RgbColor.Black)
Dim textAngle As Double = textSize.Width / radius
Dim startAngle As Double = Math.PI - (Math.PI - textAngle) / 2
For i As Integer = 0 To text.Length - 1
Dim charWidth As Single
If (i < text.Length - 1) Then
charWidth = positions(i + 1) - positions(i)
Else
charWidth = textSize.Width - positions(i) - 1
End If
Dim angle As Double = startAngle - _
(positions(i) + charWidth / 2.0F) * textAngle / textSize.Width
Dim x As Single = CType(centerX + radius * Math.Cos(angle), Single)
Dim y As Single = CType(centerY - radius * Math.Sin(angle), Single)
dim degAngle As Single = CType(90 - angle / Math.PI * 180.0, Single)
Dim rotateMatrix As New System.Drawing.Drawing2D.Matrix()
rotateMatrix.RotateAt(degAngle, New System.Drawing.PointF(x, y))
g.Transform = rotateMatrix
g.DrawString(text(i).ToString(), font, brush, x, y)
Next
bitmap.Save("c:\\temp\\roundTextTmp.bmp")
End Sub
Here is output of this sample: Alex Kon attached the following image(s): |
|
|
|
|
Forum Jump
You cannot post new topics in this forum.
You cannot reply to topics in this forum.
You cannot delete your posts in this forum.
You cannot edit your posts in this forum.
You cannot create polls in this forum.
You cannot vote in polls in this forum.