Page 1 sur 1

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

Publié : jeu. 17/nov./2016 16:25
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()

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

Publié : jeu. 17/nov./2016 17:45
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)

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

Publié : jeu. 17/nov./2016 20:28
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

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

Publié : jeu. 17/nov./2016 20:32
par Micoute
J'adore et j'adopte. Immense merci pour le partage.

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

Publié : mer. 23/nov./2016 12:33
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.

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

Publié : jeu. 24/nov./2016 13:37
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

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

Publié : jeu. 24/nov./2016 17:14
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)

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

Publié : jeu. 24/nov./2016 17:42
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 :)

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

Publié : ven. 25/nov./2016 8:39
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

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

Publié : jeu. 31/août/2017 9:27
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.

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

Publié : jeu. 31/août/2017 10:05
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

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

Publié : ven. 01/sept./2017 1:16
par Ar-S
Très beau effets, on dirait clairement du jeu de style photoshop.

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

Publié : ven. 01/sept./2017 13:04
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

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

Publié : ven. 01/sept./2017 13:12
par Shadow
Whaou c'est jolie ça !
Mais niveau code j'y comprends quedale.
Merci !

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

Publié : lun. 11/sept./2017 23:34
par Guillot
à blendman :
bonne remarque
je l'ai fait
j'ai rebatisé ça "Fonction - Brush"
http://www.purebasic.fr/french/viewtopi ... =6&t=16385