[asp.net]Graphics.Drawstring scherpte?

Pagina: 1
Acties:
  • 129 views sinds 30-01-2008
  • Reageer

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:01
hoi,

ben eindelijk een beetje bezig in .net.

Het probleem is als volgt:
Afbeeldingslocatie: http://www.print-solutions.nl/meuk/pixeling_txt.jpg

Afbeeldingslocatie: http://www.print-solutions.nl/meuk/pixeling_txt_2.jpg
In dit jpg-je komt het niet helemaal tot zijn recht, maar om de tekst staan nog wat pixels met een beetje "gelige" kleur. In het zwart/wit voorbeeld eronder is het denk ik wat duidelijker.

Ik plaats die text over een image met de volgende vb code:
Visual Basic .NET:
1
2
Dim f = New Font("TheSansBold", 30, FontStyle.Bold, GraphicsUnit.Point)
g.DrawString(txtString, f, New SolidBrush(Color.Blue), 30, 80)


Hoe krijg ik die text nu scherper?
De image is 300 dpi, en wordt met onderstaande code getekend:
Visual Basic .NET:
1
2
3
4
5
6
7
Dim g As System.Drawing.Graphics = 
System.Drawing.Graphics.FromImage(DirectCast(bmp, System.Drawing.Image))
        ' plaats een witte achtergrond
        g.FillRectangle(New SolidBrush(Color.White), 0, 0, cwidth, cheight)

        ' teken het object op het canvas
        g.DrawImage(img, offsetx, offsety, width, height)

Na deze code volgt dus het stukje met drawstring.

Weet iemand of het mogelijk is om die tekst "strakker" te maken?

[ Voor 4% gewijzigd door TeeDee op 03-03-2004 13:42 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

Probeer is wat met de SmoothingMode en/of de TextRenderingHint.

C#:
1
2
g.SmoothingMode =SmoothingMode.HighQuality;
g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:01
Het e.e.a. aan opties geprobeerd, dit had wel effect op de kwaliteit van de tekst. Maar die pixels "achter" de tekst blijven staan.

Zoals ik het nu heb:
Visual Basic .NET:
1
2
g.SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality
g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit

geeft wel het beste resultaat. Alleen zoals gezegd blijven die pixels erachter staan.

edit:
Het mag logisch zijn dat als de tekst helemaal over de image getekend wordt, dat er dan niks van te zien is. (afhankelijk ook weer van welke image het is)

Verder nog gezocht op google/dotnet247 en MSDN op:
draw text sharp, draw text sharper etc. etc.
Uiteraard krijg ik dan voorbeeld voor c sharp terug.

[ Voor 36% gewijzigd door TeeDee op 03-03-2004 14:42 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:01
Zoals gezegd/gevraagd hier de code die de image resized en de text tekent.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
    Sub ResizeImage(ByVal imgPath As String, ByVal width As Integer, 
ByVal height As Integer, ByVal orient As Integer, ByVal txt As String)

        ' kill het appje als er negatieve integers gegegeven worden
        If width <= 0 AndAlso height <= 0 Then
            Throw New ArgumentException("X en/of Y zijn neg.")
        End If

        ' check format
        Dim imgFormat As System.Drawing.Imaging.ImageFormat = GetImageFormat(imgPath)
        ' open het image
        Dim img As System.Drawing.Image = System.Drawing.Image.FromFile(imgPath)

        Dim canvaswidth As Integer
        Dim canvasheight As Integer
        Dim drawTxtCanv_width As Integer
        Dim drawTxtCanv_height As Integer
        Dim drawTxtOffset_y As Integer

        Dim offsetx As Integer
        Dim offsety As Integer
        If orient = 1 Then
            canvaswidth = 1843
            canvasheight = 1253
            drawTxtCanv_width = 1843
            drawTxtCanv_height = 300
            drawTxtOffset_y = 1003
        Else
            canvaswidth = 1253
            canvasheight = 1843
            drawTxtCanv_width = 1253
            drawTxtCanv_height = 300
            drawTxtOffset_y = 1593
        End If

        offsetx = (canvaswidth - width) / 2
        offsety = (canvasheight - height) / 2

        Dim bmp As New System.Drawing.Bitmap(canvaswidth, canvasheight)

        Dim g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage
(DirectCast(bmp, System.Drawing.Image))

        ' plaats een witte achtergrond
        g.FillRectangle(New SolidBrush(Color.White), 0, 0, canvaswidth, canvasheight)

        ' teken het object op het canvas
        g.SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias
        g.TextRenderingHint = Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit
        g.DrawImage(img, offsetx, offsety, width, height)


        ' hier de tekst

        Dim f As New Font("TheSansBold", 60, FontStyle.Bold, GraphicsUnit.Pixel)
        Dim h As New System.Drawing.StringFormat()
        h.Alignment = StringAlignment.Center
        h.LineAlignment = StringAlignment.Center
        Dim rT As New RectangleF
(10, drawTxtOffset_y, drawTxtCanv_width, drawTxtCanv_height)

        Dim j As String = txt
        g.DrawString(j.ToString, f, New SolidBrush(Color.Blue), rT, h)

        ' encoding setten
        Dim encoders() As ImageCodecInfo = ImageCodecInfo.GetImageEncoders()
        Dim encoderParameters As New EncoderParameters(1)
        Dim encoder As ImageCodecInfo
        encoderParameters.Param(1) = 
New EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100)


        ' afsluiten en opruimen
        img.Dispose()

' deze is nog niet helemaal goed. Die geeft nog een Error :(
        bmp.Save(imgPath, imgFormat, encoder, encoderParameters)

        bmp.Dispose()

    End Sub

Bovenstaande code is een sub die de image resized e.d.
Ik heb (op aanraden van .oisyn) geprobeerd de compressie hoog te zetten, maar de code die op regel 77 staat compileerd niet.
code:
1
2
Overload resolution failed because no accessible 'Save' 
accepts this number of arguments


Dus ik heb nog niet kunnen checken hoe of wat er voor zorgt dat de tekst niet scherp is. De code om de compressie hoger te zetten heb ik (voorbeeld) van dit topic gehaald. In deze code zit dus ook SmoothingMode en TextRenderingHint verwerkt. Geen van allen geeft dus resultaat.

Nu is dus het probleem, de encoding :(

[ Voor 3% gewijzigd door TeeDee op 04-03-2004 10:27 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:01
Update: Back to the drawing boards.

Probleem bestaat nog steeds. Ik vind overal op internet dezelfde soort scripts om de encoding e.d. op te vangen, EncoderParameters e.d. te setten (waardoor je ook de Quality Parameter aan kan spreken).

Ik ga eerst eens kijken of ik die scripts uberhaupt aan de praat krijg. Want wat ik ook doe, hij komt met de meest vreemde meldingen, terwijl mensen die die scripts gebruiken nergens problemen van ondervinden.

Ik kom hier zeker nog op terug :)

Heart..pumps blood.Has nothing to do with emotion! Bored


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:01
Update2:
Ik heb de verschilllende scripts die er te vinden waren niet aan de praat gekregen. Zodra je bijvoorbeeld:
Visual Basic .NET:
1
bmp.Save(imgpath, imgformat, encoding, encoderparameters)

Komt ie met een overload resolution. Het mag voor zichzelf spreken dat als je de laatste 2 parameters weghaalt, de hele handel wel gewoon werkt. Alleen het probleem blijft dan bestaan.

Wie o wie kan mij de goede richting op duwen?

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

TeeDee schreef op 05 maart 2004 @ 09:35:
Update2:
Ik heb de verschilllende scripts die er te vinden waren niet aan de praat gekregen. Zodra je bijvoorbeeld:
Visual Basic .NET:
1
bmp.Save(imgpath, imgformat, encoding, encoderparameters)

Komt ie met een overload resolution. Het mag voor zichzelf spreken dat als je de laatste 2 parameters weghaalt, de hele handel wel gewoon werkt. Alleen het probleem blijft dan bestaan.

Wie o wie kan mij de goede richting op duwen?
Zie: Image.Save Method. Kijk naar welke overloads er mogelijk zijn en wat jij probeert te doen. Bovendien zou die lap code die je hierboven postte niet werken, omdat encoder niet geinitialiseerd is.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:01
Shit. Imgformat mag niet, omdat dat al in encoding zit.
Even testen.

Thanks Korben. Het is me helemaal ontschoten om ook even extragratis en goed op MSDN te zoeken :)

edit:
Dat was tie! Toch vreemd dat die aangaf dat imgformat er bij moest. En de kwaliteit is nu dus goed.

Voor de liefhebbers:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
' functie om encoding info uit te lezen!
    Private Function GetEncoderInfo(ByVal mimeType As String) As ImageCodecInfo
        Dim j As Integer
        Dim encoders As ImageCodecInfo()
        encoders = ImageCodecInfo.GetImageEncoders()
        For j = 0 To encoders.Length
            If encoders(j).MimeType = mimeType Then
                Return encoders(j)
            End If
        Next j
        Return Nothing
    End Function

'====================
    ' resize de image
    Sub ResizeImage
(ByVal imgPath As String, ByVal width As Integer, ByVal height As Integer, 
ByVal orient As Integer, ByVal txt As String, ByVal kader As String)
        ' kill het appje als er negatieve integers gegegeven worden
        If width <= 0 AndAlso height <= 0 Then
            Throw New ArgumentException("X en/of Y negatief")
        End If

        ' check format stream
        Dim imgFormat As System.Drawing.Imaging.ImageFormat = GetImageFormat(imgPath)
        ' open het image
        Dim img As System.Drawing.Image = System.Drawing.Image.FromFile(imgPath)

        Dim canvaswidth As Integer
        Dim canvasheight As Integer
        Dim drawTxtCanv_width As Integer
        Dim drawTxtCanv_height As Integer
        Dim drawTxtOffset_y As Integer

        Dim offsetx As Integer
        Dim offsety As Integer
        If orient = 1 Then
            canvaswidth = 1843
            canvasheight = 1253
            drawTxtCanv_width = 1843
            drawTxtCanv_height = 300
            drawTxtOffset_y = 1003
        Else
            canvaswidth = 1253
            canvasheight = 1843
            drawTxtCanv_width = 1253
            drawTxtCanv_height = 300
            drawTxtOffset_y = 1593
        End If

        offsetx = (canvaswidth - width) / 2
        offsety = (canvasheight - height) / 2

        Dim bmp As New System.Drawing.Bitmap(canvaswidth, canvasheight)
        Dim g As System.Drawing.Graphics = 
System.Drawing.Graphics.FromImage(DirectCast(bmp, System.Drawing.Image))
        ' plaats een witte achtergrond
        g.FillRectangle(New SolidBrush(Color.White), 0, 0, canvaswidth, canvasheight)
        ' teken het object op het canvas
        g.DrawImage(img, offsetx, offsety, width, height)
        Dim eps As EncoderParameters = New EncoderParameters(1)
        eps.Param(0) = New EncoderParameter(Encoder.Quality, 100)
        Dim ici As ImageCodecInfo = GetEncoderInfo("image/jpeg")

        ' hier de tekst op de voorzijde
        Dim f As New Font("Arial", 60, FontStyle.Bold, GraphicsUnit.Pixel)
        Dim h As New System.Drawing.StringFormat()
        h.Alignment = StringAlignment.Center
        h.LineAlignment = StringAlignment.Center
        Dim rT As New RectangleF
(10, drawTxtOffset_y, drawTxtCanv_width, drawTxtCanv_height)

        Dim j As String = txt
        g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
        g.DrawString(j.ToString, f, New SolidBrush(Color.Blue), rT, h)


        ' afsluiten en opruimen
        img.Dispose()
        bmp.Save(imgPath, ici, eps)
        bmp.Dispose()
    End Sub

[ Voor 101% gewijzigd door TeeDee op 05-03-2004 10:25 ]

Heart..pumps blood.Has nothing to do with emotion! Bored

Pagina: 1