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
'Create Bitmap object
Dim bitmap As New Aurigma.GraphicsMill.Bitmap(450, 450, _
Aurigma.GraphicsMill.PixelFormat.Format24bppRgb)
Dim graphics As Aurigma.GraphicsMill.Drawing.GdiGraphics = _
bitmap.GetGdiGraphics()
'Fill background
graphics.FillRectangle(New Aurigma.GraphicsMill.Drawing.SolidBrush( _
Aurigma.GraphicsMill.RgbColor.White), 0, 0, 460, 460)
' Adjust font settings
Dim font As New Aurigma.GraphicsMill.Drawing.Font( _
"verdana", 30, False, False)
font.VerticalAlignment = Aurigma.GraphicsMill.Drawing.VerticalAlignment.Top
'font.HorizontalAlignment = Aurigma.GraphicsMill.Drawing.HorizontalAlignment.Center
Dim text As String = "THE FIRST ENGLISH SETTLEMENT IN CONNECTICUT"
'Get characters positions
Dim positions As Single() = font.GetCharacterPositions(text, 0)
'Draw ellipse
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)
'Draw character by character
For i As Integer = 0 To text.Length - 1
'Compute angle in radians
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)) ''Convert angle from radians to degrees
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 Sunday, December 20, 2009 4:27:14 AM(UTC)
| 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
'Create Bitmap object
Dim bitmap As New Aurigma.GraphicsMill.Bitmap( _
2 * centerX, _
2 * centerY, _
Aurigma.GraphicsMill.PixelFormat.Format24bppRgb)
'Fill background
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)
'Adjust font settings
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
'Get characters positions & text dimensions
Dim positions As Single() = font.GetCharacterPositions(text, 0)
Dim textSize As SizeF = font.MeasureString(text)
'Draw ellipse
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)
'Calculating basic params
Dim textAngle As Double = textSize.Width / radius
Dim startAngle As Double = Math.PI - (Math.PI - textAngle) / 2
'Draw character by character
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
'Compute angle to which rotate current character. Rotation will be
'performed relative to the middle of the bottom side of the character.
Dim angle As Double = startAngle - _
(positions(i) + charWidth / 2.0F) * textAngle / textSize.Width
'Compute the x and y coordinate of the bottom/top* middle* of the character
Dim x As Single = CType(centerX + radius * Math.Cos(angle), Single)
Dim y As Single = CType(centerY - radius * Math.Sin(angle), Single)
'Convert angle from radians to degrees
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.