GDI problème de netteté autour texte ajouté à un bitmap

boeledi Messages postés 1 Date d'inscription lundi 17 mai 2004 Statut Membre Dernière intervention 18 décembre 2007 - 18 déc. 2007 à 14:04
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 - 19 déc. 2007 à 00:17
Bonjour à Tous,

Tout d'abord, je dois avouer que je suis totalement novice en programmation GDI. Ceci explique certainement ma question...

Dans le cadre d'un développement de site web .NET 2.0, je dois notamment créer des images dynamiquement, qui contiennent entre autre, du texte.

Bref, je crée un bitmap, lui assigne une couleur de fond, puis écris le texte et ainsi de suite jusqu'à sauvegarder l'image obtenue sur disque.

Tout va très bien sauf que lorsque je regarde de plus près le résultat obtenu (notamment en zoomant), je m'aperçois que ce n'est pas net tout autour du texte. On dirait que le fait d'avoir ajouté le text au bitmap a provoqué une sorte d'interférence entre les pixels qui se trouvent directement autour du texte.

Voici le code que j'utilise... Quelqu'un aurait-il une solution?
Merci d'avance,

Didier

Code source:

Public Sub Generate(ByVal vstrText As String)

' Image Container
Dim bmBitmap As Bitmap = New Bitmap(100, 150, PixelFormat.Format32bppArgb)
Dim grGraphic As Graphics = Graphics.FromImage(bmBitmap)

' Rendering quality
grGraphic.SmoothingMode = SmoothingMode.HighQuality
grGraphic.InterpolationMode = InterpolationMode.HighQualityBilinear
grGraphic.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit

' random values for the colors
Dim rndNumber As Random = New Random(DateTime.Now.Millisecond)
Dim r, g, b As Integer
r = rndNumber.Next(0, 200)
g = rndNumber.Next(0, 200)
b = rndNumber.Next(0, 200)

' Background
Dim bgImg as Rectangle = new Rectangle(0,0,100,150)
Dim myBrush As New SolidBrush(Color.FromArgb(r, g, b))
grGraphic.FillRectangle(myBrush,bgImg)
myBrush.Dispose()

' Font
Dim myFont As Font = New Font("Times New Roman", 25, FontStyle.Bold) 'FontStyle.Regular

' text color
Dim myPen As New SolidBrush(Color.white)

' Text drawing
Dim myFont as Font= new Font("Arial", 10.0f, FontStyle.Regular, GraphicsUnit.Point)

grGraphic.DrawString(vstrText, myFont, myPen, New PointF(10.0f, 10.0f))

'Release Brush
myPen.Dispose()

' Affichage de l'image sur la page
bmBitmap.Save("d:\tests\test.jpg", ImageFormat.Jpeg)

'Dispose Font
myFont.Dispose()

'Dispose bitmap
bmBitmap.Dispose()

'Dispose graphical interface
grGraphic.Dispose()
End Sub

<!-- / message -->
<!-- attachments -->

3 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
18 déc. 2007 à 14:14
Bonjour,

Pas tout lu et ne sais même pas en quel langage c'est écrit... et ne veux pas le savoir.

Je dirais simplement ceci : quand on lisse, on lisse....
Si on ne veut pas lisser, on a du plus net, mais plus "en escalier" pour les diagonales. Si on lisse, on "adoucit" autour pour diminuer les "escaliers"..

C'est un choix à faire ...
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
18 déc. 2007 à 15:38
Salut,

bmBitmap.Save("d:\tests\test.jpg", ImageFormat.Jpeg)


Le jpg est un format de compression avec pertes. Il travail sur des
carrés de 8 * 8 pixels, et approxime le tout par des fonctions assez
sordides.


Bref, il arrvie qu'une jolie bimtap sauvegardée en jpg ne soit plus jolie (Notamment au niveau des contours...)


Tu peux par exemple utiliser le format png, qui comprime moins, mais sans pertes.

<hr size="2" width="100%" />3ème année en ecole d'ingé d'info cherche stage de 4 mois à partir du 01/04/08
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
19 déc. 2007 à 00:17
Mais non, il s'agit simplement du lissage tout à fait normal dans le dessin GDI (anti-aliasing).

Et heureusement qu'il existe, car faire du lissage sois même quand on écrit du texte, qu'on dessine des formes ou qu'on zoom une image, bonjour

Mais évidement, on peut le contrôler. Pour le texte, c'est la propriété TextRenderingHint de la classe Graphics:

Dim grGraphic As Graphics = Graphics.FromImage(bmBitmap)
grGraphic.TextRenderingHint = Drawing.Text.TextRenderingHint.SingleBitPerPixel
grGraphic.DrawString(vstrText, myFont, myPen, New PointF(10.0f, 10.0f))

Et c'est prèt, t'as plus de lissage
0
Rejoignez-nous