Page 1 sur 1

[Resolu] drawtext() not antialiased

Publié : lun. 03/mars/2014 18:51
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

Re: drawtext() not antialiased

Publié : lun. 03/mars/2014 19:18
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


Re: drawtext() not antialiased

Publié : lun. 03/mars/2014 22:14
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

Re: drawtext() not antialiased

Publié : mar. 04/mars/2014 0:40
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 :)

Re: drawtext() not antialiased

Publié : mar. 04/mars/2014 0:49
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


Re: drawtext() not antialiased

Publié : mar. 04/mars/2014 1:09
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

Re: drawtext() not antialiased

Publié : mar. 04/mars/2014 11:26
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:

Re: drawtext() not antialiased

Publié : mar. 04/mars/2014 13:28
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:

Re: drawtext() not antialiased

Publié : mar. 04/mars/2014 14:29
par Backup
:lol:

Re: drawtext() not antialiased

Publié : mar. 04/mars/2014 15:50
par venom
Sympa ces codes, je n'en ai pas l'utilité pour le moment mais ça peut servir :)






@++

Re: drawtext() not antialiased

Publié : mar. 04/mars/2014 21:11
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... :?

Re: drawtext() not antialiased

Publié : sam. 08/mars/2014 15:25
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.