Fonction - ImageFont (compatible PB/SB(2.00))

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Guillot
Messages : 522
Inscription : jeu. 25/juin/2015 16:18

Fonction - ImageFont (compatible PB/SB(2.00))

Message par Guillot »

Image

Salut les artistes,

une petite fonction pour afficher du texte dont la fonte est 'mixée' avec une image

probleme : PB (et SB) ne permettant pas de travailler sur 2 sorties graphique en même temps
je dois passer par une procedure d'initialisation qui lit l'image et qui doit donc être exécuter en dehors de StartDrawing/StopDrawing

initIF(image,centerX.l=-1,centerY=-1)
- image : numero de l'image
- [centerx/y] : definit le centre de l'image. par defaut, il est placer au milieu de l'image

puis on utilise
DrawTextIF(x,y,text.s)

j'espere que ça pourra vous etre utile

Code : Tout sélectionner

; fonction - imagefont - pf shadoko - 2016 

CompilerIf #PB_Compiler_OS<>5
    Macro doevents:Repeat:Until WaitWindowEvent() = #PB_Event_CloseWindow:EndMacro
CompilerElse
    Macro doevents:i=i:EndMacro
CompilerEndIf

;####################################################################################
Procedure SortIdx(Array t.l(1),Array idx.l(1),deb=0, fin=-1)
    Protected min,i,j,v,idmin
    If fin=-1: fin=ArraySize(t()):EndIf
    Dim idx(fin)
    For i=deb To fin:idx(i)=i:Next
    For i=deb To fin
        min=$7fffffff
        For j=i To fin
            v=t(idx(j))
            If v<min:min=v:idmin=j:EndIf
        Next
        Swap idx(i),idx(idmin)
    Next 
EndProcedure

Procedure initIF(image,centerX.l=-1,centerY=-1)
    ;image : numero de l'image
    ;centerx/y : definit le centre de l'image
    Structure IFsij
        i.b
        j.b
    EndStructure
    
    Protected i,j,n,di,dj
    Protected idx=ImageWidth(image):If centerX<0:centerX=idx/2:EndIf
    Protected idy=ImageHeight(image):If centery<0:centery=idy/2:EndIf
    Protected Dim IFdis.l(idx * idy-1)
    Global Dim IFidx.l(idx * idy-1)
    Global Dim IFbmp.l(idx-1,idy-1)
    Global Dim IFpos.IFsij(idx * idy-1)
    
    StartDrawing(ImageOutput(image))
    DrawingMode(#PB_2DDrawing_AllChannels)  
    For j=0 To idy-1
        For i=0 To idx-1
            IFbmp(i,j)=Point(i,j)
            IFpos(n)\i=i:di=i-centerX
            IFpos(n)\j=j:dj=j-centerY
            ;IFdis(n)=di*di+dj*dj
            IFdis(n)=Abs(di)+Abs(dj)
            n+1
        Next
    Next
    StopDrawing()    
    sortidx(IFdis(),IFidx())
EndProcedure

Procedure DrawTextIF(x,y,text.s)
    Protected n,nn=ArraySize(IFidx())
    DrawingMode(#PB_2DDrawing_Transparent |#PB_2DDrawing_AlphaBlend)
    For n=0 To nn
        With IFpos(IFidx(nn-n))
            If Alpha(IFbmp(\i,\j)):DrawText(x+\i,y+\j,text,IFbmp(\i,\j)):EndIf
        EndWith
    Next   
EndProcedure
;####################################################################################

Procedure exemple()
    EnableExplicit
    Protected i,j,n,idx=800,idy=600
    For n=0 To 7
        CreateImage(10+n,16,16,32,#PB_Image_Transparent)
        StartVectorDrawing(ImageVectorOutput(10+n))
        Select n
            Case 0
                VectorSourceCircularGradient(8-3,8-3,10)
                VectorSourceGradientColor($ffffffff, 0.0)
                VectorSourceGradientColor($ffffaaaa, 0.4)
                VectorSourceGradientColor($ff886666, 1.0)     
                VectorSourceGradientColor($00886666, 1.0) 
                AddPathCircle(8,8,7):FillPath()
            Case 1
                AddPathBox(11,11,4,4):VectorSourceColor($08000000):FillPath()
                AddPathBox(8,8,2,2):VectorSourceColor($ff0000ff):FillPath()
            Case 2
                AddPathCircle(12,12,3):VectorSourceColor($11000000):FillPath()
                AddPathCircle(8,8,3)
                VectorSourceColor($ff008800):FillPath(#PB_Path_Preserve)
                VectorSourceColor($ffffffff):StrokePath(2)
            Case 3
                AddPathBox(6,6,4,4)
                VectorSourceColor($ffaaaaff):FillPath(#PB_Path_Preserve)
                VectorSourceColor($ffffffff):StrokePath(1)
                AddPathBox(6,10,4,4):VectorSourceColor($ff8888ff):FillPath()
            Case 4
                VectorSourceCircularGradient(8,8,7)
                VectorSourceGradientColor($ff008800, 0.0)
                VectorSourceGradientColor($ff00ffff, 0.8)     
                VectorSourceGradientColor($0000ffff, 1.0)     
                FillVectorOutput()
            Case 5
                AddPathCircle(8,8,7):VectorSourceColor($ffffffff):FillPath()
                AddPathCircle(8,8,1):VectorSourceColor($ff0000ff):StrokePath(1)
                AddPathCircle(8,8,4):VectorSourceColor($ff0000ff):StrokePath(1)
            Case 6
                RandomSeed(1)
                For i=0 To 15
                    AddPathBox(Random(8)+4,Random(8)+4,1,1)
                    VectorSourceColor(RGBA(0,Random(255),0,$44)):FillPath()
                Next
            Case 7
                AddPathBox(11,11,4,4):VectorSourceColor($10000000):FillPath()
                AddPathBox(7,7,4,4):VectorSourceColor($ffff4444):FillPath()
                AddPathBox(5,5,4,4):VectorSourceColor($ffffbbbb):FillPath()
                AddPathBox(6,6,4,4):VectorSourceColor($ffff8888):FillPath()
        EndSelect    
        StopVectorDrawing()
    Next
    
    LoadFont(0, "Courier New", 45)
    CreateImage(0,idx,idy,32,$888888)
    StartDrawing(ImageOutput(0))
    For j=0 To idx Step 16
        For i=16 To idx Step 16
            Box(i,j,16,16,($a0+(i+j) & $10) * $010101)
        Next
    Next    
    StopDrawing()
    
    For i=0 To 7
        initif(10+i)        
        StartDrawing(ImageOutput(0))
        DrawingFont(FontID(0))   
        DrawTextif(20,i*72,"BONJOUR tout le monde")
        DrawAlphaImage(ImageID(10+i),0,30+i*72)
        StopDrawing()
    Next
    OpenWindow(0, 0, 0, idx, idy, "test4", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ImageGadget(0, 0, 0, idx, idy,ImageID(0))
    doevents 
EndProcedure

exemple()
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Fonction - ImageFont (compatible PB/SB(2.00))

Message par Kwai chang caine »

C'est une super bonne idée et c'est joli 8O
Merci beaucoup, je pense que un jour ça pourrait m'être utile 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Fonction - ImageFont (compatible PB/SB(2.00))

Message par GallyHC »

Bonjour,

Je viens de testé et le résultat est bien sympa. Avec tout ce genre de code, on va bientôt pouvoir faire un Photoshop complet.
Merci pour ce partage.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Fonction - ImageFont (compatible PB/SB(2.00))

Message par Micoute »

J'adore et j'adopte. Immense merci pour le partage.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Fonction - ImageFont (compatible PB/SB(2.00))

Message par comtois »

wow, bel exemple d'utilisation de la bibliothèque VectorDrawing !

Je n'ai jamais pris le temps de la tester, mais avec un exemple comme celui-ci ça donne envie.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Fred
Site Admin
Messages : 2648
Inscription : mer. 21/janv./2004 11:03

Re: Fonction - ImageFont (compatible PB/SB(2.00))

Message par Fred »

J'avoue que je ne comprends pas du tout comment t'arrives à ce resultat... Mais si ca marche c'est le principal :D
Avatar de l’utilisateur
Guillot
Messages : 522
Inscription : jeu. 25/juin/2015 16:18

Re: Fonction - ImageFont (compatible PB/SB(2.00))

Message par Guillot »

à comtois :

ben en fait, la lib vectordrawing n'y est pas pour grand chose
je dessine juste mes petites images avec (à gauche de l'écran), mais j'aurais tout aussi bien pu les faire avec la 2ddrawing
DrawTextIF est d'ailleurs destinée à la 2ddrawing

en revanche j'ai fais une version pour la vectordrawing
elle fonctionne avec DrawVectorText, mais aussi avec StrokePath et Fillpath
(j'essai de la poster ce soir)

à fred :
le fonctionnement :
pour chaque pixels de la petite image j'affiche le texte avec un decalage x/y correpondant a la position du pixel dans l'image, et avec comme couleur la couleur du pixel
le tout est de procéder dans le bonne ordre : de lexterieur vers l'interieur
(j'avais comencé par des cercles concentrique(ligne 48), mais des carrés concentrique (ligne 49) donne un résultat un peu plus propre)
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Fonction - ImageFont (compatible PB/SB(2.00))

Message par comtois »

Guillot a écrit :à comtois :

ben en fait, la lib vectordrawing n'y est pas pour grand chose
je dessine juste mes petites images avec (à gauche de l'écran), mais j'aurais tout aussi bien pu les faire avec la 2ddrawing
DrawTextIF est d'ailleurs destinée à la 2ddrawing
Oui je m'en suis rendu compte après coup, en lisant le code.
Au premier coup d'oeil j'avais vu bcp de commandes issues de la lib VectorDrawing, ce qui m'a induit en erreur.

ça n'enlève rien à mon commentaire, c'est du bon boulot :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Fred
Site Admin
Messages : 2648
Inscription : mer. 21/janv./2004 11:03

Re: Fonction - ImageFont (compatible PB/SB(2.00))

Message par Fred »

Guillot a écrit :à fred :
le fonctionnement :
pour chaque pixels de la petite image j'affiche le texte avec un decalage x/y correpondant a la position du pixel dans l'image, et avec comme couleur la couleur du pixel
le tout est de procéder dans le bonne ordre : de lexterieur vers l'interieur
(j'avais comencé par des cercles concentrique(ligne 48), mais des carrés concentrique (ligne 49) donne un résultat un peu plus propre)
Haaa, c'est malin ca ! Merci pour l'explication
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Fonction - ImageFont (compatible PB/SB(2.00))

Message par blendman »

salut

C'est excellent. C'est comme les "styles" dans photoshop.

D'ailleurs, tu pourrais faire ça avec des "shapes" aussi, pas uniquement sur du texte.
Par exemple, avec la lib vectordrawing, tu fais un carré, et tu plaques ton "style" dessus ;).

En tout cas, merci pour le partage c'est super intéressant.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Fonction - ImageFont (compatible PB/SB(2.00))

Message par djes »

Je viens de me rendre compte que je n'avais pas répondu... Ce code est vraiment super ! Il y a de l'astuce (inventivité), de la recherche (pugnacité) et enfin une implémentation hyper pro. Chapeau bas ! :o
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Fonction - ImageFont (compatible PB/SB(2.00))

Message par Ar-S »

Très beau effets, on dirait clairement du jeu de style photoshop.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Fonction - ImageFont (compatible PB/SB(2.00))

Message par JohnJohnsonSHERMAN »

Je vois que ce sujet est remonté et je m'apercois que je n'avais même pas félicité l'auteur de cette merveille... :oops:

Eh bien je te tire une révérence du haut de mes deux chenilles Guillot 8) J'adore le principe, super idée :P
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Fonction - ImageFont (compatible PB/SB(2.00))

Message par Shadow »

Whaou c'est jolie ça !
Mais niveau code j'y comprends quedale.
Merci !
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
Guillot
Messages : 522
Inscription : jeu. 25/juin/2015 16:18

Re: Fonction - ImageFont (compatible PB/SB(2.00))

Message par Guillot »

à blendman :
bonne remarque
je l'ai fait
j'ai rebatisé ça "Fonction - Brush"
http://www.purebasic.fr/french/viewtopi ... =6&t=16385
Répondre