[Resolu] drawtext() not antialiased

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

[Resolu] drawtext() not antialiased

Message par blendman »

salut

Savez-vous s'il est possible d'avoir un drawtext() sans l'anti-aliasing de la police ?

Code : Tout sélectionner

#Window =0
#Font =0
#canvas = 0
   

LoadFont(#Font, "Verdana", 102)
Flags = #PB_Window_SystemMenu | #PB_Window_ScreenCentered

If OpenWindow(#Window, 0, 0, 300, 300, "Drawtext aliased", Flags)
  
  CanvasGadget(#canvas, 0,0,300,300)
  If StartDrawing(CanvasOutput(#canvas))
    DrawingFont(FontID(#Font))
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(10, 10, "0123456789...", #Black)
    StopDrawing()
  EndIf
EndIf


While WaitWindowEvent() ! #PB_Event_CloseWindow 
Wend
C'est pour sauvegarder l'image obtenue et en faire une font bitmap.

Merci.

EDIT : en gros, j'obtiens, l'image du haut et je voudrais l'image du bas

Image
Dernière modification par blendman le mar. 18/mars/2014 14:28, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: drawtext() not antialiased

Message par Backup »

facile :)

il faut numériser ton image ,(c'est a dire la mettre dans un tableau)

puis la pixeliser en utilisant un Box() (a chaque fois qu'on rencontre la couleur noire (c'est ta fonte ... )... on remplace le pixel par un Box() )

qui est en fait un pixel Carré de la taille que tu veux !! :)
la variable "Pas" determine la taille du pixel final .... ça change le résultat forcement :)

Code : Tout sélectionner

;***********************************************
;Titre  :*pixelise_fonte
;Auteur  : Dobro
;Date  :03/03/2014
;Heure  :19:17:39
;Version Purebasic :  PureBasic 5.20 LTS (Windows - x86)
;Version de l'editeur :EPB V2.54
; Libairies necessaire : Aucune 
;***********************************************

#Window =0
#Font =0
#canvas = 0
Global taille_x,taille_y,Pas
taille_x=1024
taille_y=300
Pas=2  ; ceci donne la taille du pixel au redessin final
Global Dim tab(taille_x,taille_y)


LoadFont(#Font, "Verdana", 24*pas)
Flags = #PB_Window_SystemMenu | #PB_Window_ScreenCentered

If OpenWindow(#Window, 0, 0, taille_x,taille_y, "Drawtext aliased", Flags)
	
	CanvasGadget(#canvas, 0,0,taille_x,taille_y)
	
	If StartDrawing(CanvasOutput(#canvas))
		DrawingFont(FontID(#Font))
		DrawingMode(#PB_2DDrawing_Transparent)
		DrawText(10, 10, "0123456789...", #Black)
		; on Numérise
		for y=1 to taille_y-1
			For x=1 to taille_x-1 
				tab(x,y)=point(x,y)
			Next x
		Next y
		box(1,1,taille_x,taille_y,Rgb(255,255,255))
		; on restitue avec defaut en utilisant un box ça dessiner avec un pixel carré de la taille qu'on veux
		for y=1 to taille_y-1 
			For x=1 to taille_x-1 
				if tab(x,y)=$0
					box(x,y,pas+1,pas+1,$0)
				Endif
				x=x+pas 
			Next x
			y=y+pas
		Next y
		DrawText(10, 100, "0123456789...", #Black)
		StopDrawing()
	EndIf
EndIf


While WaitWindowEvent() ! #PB_Event_CloseWindow
Wend
; Epb

Dernière modification par Backup le mar. 04/mars/2014 0:30, modifié 3 fois.
Demivec
Messages : 91
Inscription : sam. 18/sept./2010 18:13

Re: drawtext() not antialiased

Message par Demivec »

Code : Tout sélectionner

#Window =0
#Font =0
#canvas = 0
#image = 0

Procedure removeShade_Filter(x, y, sourceColor, targetColor)
  If sourceColor & $FFFFFF <> 0
    sourceColor = RGB($FF, $FF, $FF)
  EndIf
  ProcedureReturn sourceColor
EndProcedure

LoadFont(#Font, "Verdana", 20) ;102
Flags = #PB_Window_SystemMenu | #PB_Window_ScreenCentered

Define taille_x, taille_y

taille_x = 300
taille_y = 300
If OpenWindow(#Window, 0, 0, taille_x, taille_y, "Drawtext aliased", Flags)
  
  CanvasGadget(#canvas, 0,0,taille_x, taille_y)
  If CreateImage(#image, taille_x, taille_y, 24)
    If StartDrawing(ImageOutput(#image))
      DrawingFont(FontID(#Font))
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(10, 10, "0123456789...", #White)
      StopDrawing()
    EndIf
    
    If StartDrawing(CanvasOutput(#canvas))
      DrawingMode(#PB_2DDrawing_CustomFilter)
      CustomFilterCallback(@removeShade_Filter())
      DrawImage(ImageID(#image), 0, 0)
      StopDrawing()
    EndIf
  EndIf 
  
EndIf


While WaitWindowEvent() ! #PB_Event_CloseWindow 
Wend
Dernière modification par Demivec le mar. 04/mars/2014 1:44, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: drawtext() not antialiased

Message par Backup »

je pense que la Soluce a Demivec est meilleur que la mienne :)
car moi je reecrit la fonte , alors que lui Filtre les points de couleur


c'est plus logique :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: drawtext() not antialiased

Message par Backup »

voici donc ma version Filtrante :)

Code : Tout sélectionner

;***********************************************
;Titre  :*De-alias_fonte
;Auteur  : Dobro
;Date  :04/03/2014
;Heure  :01:02:48
;Version Purebasic :  PureBasic 5.21 LTS (Windows - x86)
;Version de l'editeur :EPB V2.54
; Libairies necessaire : Aucune 
;***********************************************


#Window =0
#Font =0
#canvas = 0
Global taille_x,taille_y,Pas
taille_x=1024
taille_y=300
Taille_fonte=70
Global Dim tab(taille_x,taille_y)

LoadFont(#Font, "Verdana", Taille_fonte)
Flags = #PB_Window_SystemMenu | #PB_Window_ScreenCentered
If OpenWindow(#Window, 0, 0, taille_x,taille_y, "Drawtext aliased", Flags)
	CanvasGadget(#canvas, 0,0,taille_x,taille_y)
	If StartDrawing(CanvasOutput(#canvas))
		DrawingFont(FontID(#Font))
		DrawingMode(#PB_2DDrawing_Transparent)
		DrawText(10, 10, "0123456789...", #Black)
		; on Numérise (mise en tableau )
		coul_fond.l = point(1,1) ; couleur du fond
		for y=1 to taille_y-1
			For x=1 to taille_x-1 
				coul.l=point(x,y)
				if coul.l <> $0 and Coul.l<>coul_fond.l ; on Filtre
					coul.l=$0
				Endif
				tab(x,y)=coul.l ; une fois filtré on stock
			Next x
		Next y
		box(1,1,taille_x,taille_y,Rgb(255,255,255))
		; on restitue 
		for y=1 to taille_y-1 
			For x=1 to taille_x-1 
				plot(x,y,tab(x,y)) ; on destock la couleur pour la dessiner
				x=x+pas 
			Next x
			y=y+pas
		Next y
		DrawText(10, 100, "0123456789...", #Black)
		StopDrawing()
	EndIf
EndIf

While WaitWindowEvent() ! #PB_Event_CloseWindow
Wend

; Epb

G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: drawtext() not antialiased

Message par G-Rom »

Code : Tout sélectionner

#Window =0
#Font =0
#canvas = 0
   

LoadFont(#Font, "Verdana", 102)
Flags = #PB_Window_SystemMenu | #PB_Window_ScreenCentered

If OpenWindow(#Window, 0, 0, 300, 300, "Drawtext aliased", Flags)
  
  CanvasGadget(#canvas, 0,0,300,300)
  If StartDrawing(CanvasOutput(#canvas))
    DrawingFont(FontID(#Font))
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(10, 10, "0123456789...", #Black)
    StopDrawing()
  EndIf
  
  If StartDrawing(CanvasOutput(#canvas))
    For y = 0 To OutputHeight()-1
      For x = 0 To OutputWidth()-1
        color=Point(x,y)
        
       If color<>$FFFFFF
          Plot(x,y,0)
       EndIf 
        
      Next
    Next
    StopDrawing()
  EndIf
  
  
EndIf


While WaitWindowEvent() ! #PB_Event_CloseWindow 
Wend
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: drawtext() not antialiased

Message par Backup »

@g-rom
oui mais si on ajoute une ligne de code
dans les choux le Code a G-rom :lol:

Code : Tout sélectionner

#Window =0
#Font =0
#canvas = 0
LoadFont(#Font, "Verdana", 102)
Flags = #PB_Window_SystemMenu | #PB_Window_ScreenCentered
If OpenWindow(#Window, 0, 0, 300, 300, "Drawtext aliased", Flags)
	CanvasGadget(#canvas, 0,0,300,300)
	If StartDrawing(CanvasOutput(#canvas))
		box(1,1,300,300,rgb(255,200,0))  ; <<<<<<<<<<<<<< ajout par Dobro histoire de gonfler le monde LOL
		DrawingFont(FontID(#Font))
		DrawingMode(#PB_2DDrawing_Transparent)
		DrawText(10, 10, "0123456789...", #Black)
		StopDrawing()
	EndIf
	If StartDrawing(CanvasOutput(#canvas))
		For y = 0 To OutputHeight()-1
			For x = 0 To OutputWidth()-1
				color=Point(x,y)
				If color<>$FFFFFF
					Plot(x,y,0)
				EndIf
			Next
		Next
		StopDrawing()
	EndIf
EndIf
While WaitWindowEvent() ! #PB_Event_CloseWindow
Wend 
; Epb


alors que le miens :mrgreen:

Code : Tout sélectionner

;***********************************************
;Titre  :*De-alias_fonte
;Auteur  : Dobro
;Date  :04/03/2014
;Heure  :01:02:48
;Version Purebasic :  PureBasic 5.21 LTS (Windows - x86)
;Version de l'editeur :EPB V2.54
; Libairies necessaire : Aucune 
;***********************************************


#Window =0
#Font =0
#canvas = 0
Global taille_x,taille_y,Pas
taille_x=1024
taille_y=300
Taille_fonte=70
Global Dim tab(taille_x,taille_y)

LoadFont(#Font, "Verdana", Taille_fonte)
Flags = #PB_Window_SystemMenu | #PB_Window_ScreenCentered
If OpenWindow(#Window, 0, 0, taille_x,taille_y, "Drawtext aliased", Flags)
	CanvasGadget(#canvas, 0,0,taille_x,taille_y)
	
	If StartDrawing(CanvasOutput(#canvas))
		box(1,1,300,300,rgb(255,200,0))  ; <<<<<<<<<<<<<< ajout par Dobro histoire de gonfler le monde LOL
		DrawingFont(FontID(#Font))
		DrawingMode(#PB_2DDrawing_Transparent)
		DrawText(10, 10, "0123456789...", #Black)
		; on Numérise (mise en tableau )
		coul_fond.l = point(1,1) ; couleur du fond
		for y=1 to taille_y-1
			For x=1 to taille_x-1 
				coul.l=point(x,y)
				if coul.l <> $0 and Coul.l<>coul_fond.l ; on Filtre
					coul.l=$0
				Endif
				tab(x,y)=coul.l ; une fois filtré on stock
			Next x
		Next y
		box(1,1,taille_x,taille_y,Rgb(255,255,255))
		; on restitue 
		for y=1 to taille_y-1 
			For x=1 to taille_x-1 
				plot(x,y,tab(x,y)) ; on destock la couleur pour la dessiner
				x=x+pas 
			Next x
			y=y+pas
		Next y
		DrawText(10, 100, "0123456789...", #Black)
		StopDrawing()
	EndIf
EndIf

While WaitWindowEvent() ! #PB_Event_CloseWindow
Wend

; Epb

marche toujours ...

allez .. retourne a ton engin a fondre le plastic qui pue :lol:
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: drawtext() not antialiased

Message par G-Rom »

Le code que j'ai proposé marche uniquement avec du texte banane :D
Rien empêche de faire une procédure qui te sort une image "aliasé" du texte
Pas besoin de Tableau global... mais bon, tu codes avec des moufles et deux mains gauche avec des pouces de main droite... :D
Allez, va jouer avec ta quéquette dans le sable et laisse les grands parlé programmation :mrgreen:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: drawtext() not antialiased

Message par Backup »

:lol:
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: drawtext() not antialiased

Message par venom »

Sympa ces codes, je n'en ai pas l'utilité pour le moment mais ça peut servir :)






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: drawtext() not antialiased

Message par Fig »

Code : Tout sélectionner

CustomFilterCallback(@removeShade_Filter())
Je ne connaissais pas cette instruction, c'est récent ? Image
Intéressant... 8)

Ah, et pour info, je crois que ça fonctionne ainsi pour virer le cleartype windows
Supprimer l'antialiasing (momentanément, le temps de faire les bitmaps)

Code : Tout sélectionner

SystemParametersInfo_(#SPI_SETFONTSMOOTHING,#false,0,0)
Puis le remettre...

Code : Tout sélectionner

SystemParametersInfo_(#SPI_SETFONTSMOOTHING,#true,0,0)
Donc...

Code : Tout sélectionner

#Window =0
#Font =0
#canvas = 0
   

LoadFont(#Font, "Verdana", 102)
Flags = #PB_Window_SystemMenu | #PB_Window_ScreenCentered

If OpenWindow(#Window, 0, 0, 300, 300, "Drawtext aliased", Flags)
  CanvasGadget(#canvas, 0,0,300,300)
  SystemParametersInfo_(#SPI_SETFONTSMOOTHING,#False,0,0)
  If StartDrawing(CanvasOutput(#canvas))
    DrawingFont(FontID(#Font))
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(10, 10, "0123456789...", #Black)
    StopDrawing()
  EndIf
  SystemParametersInfo_(#SPI_SETFONTSMOOTHING,#True,0,0)
EndIf

While WaitWindowEvent() ! #PB_Event_CloseWindow
Wend
PS: attention aux mycoses avec le bac à sable... :?
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: drawtext() not antialiased

Message par blendman »

salut

Merci beaucoup pour vos codes ;).

@Fig : merci ! Tu obtiens le même résultat que dans photoshop, c'est exactement ce que je recherche.
Répondre