Merci pour ce lien, j'ai déjà essayé le SmoothResize mais malheureusement mon PNG est indexé et la fonction ne le gère pas. A moins qu'il soit possible de convertir un PNG indexé en non indexé ?
Merci pour ce lien, j'ai déjà essayé le SmoothResize mais malheureusement mon PNG est indexé et la fonction ne le gère pas. A moins qu'il soit possible de convertir un PNG indexé en non indexé ?
J'ai trouvé ce code : http://graphics32.org/news/newsgroup...rticle_id=6918
Il permet d'ouvrir une image PNG, de la convertir en Bitmap32 puis de la sauver en PNG de nouveau.
Les fonctions d'ouverture et de sauvegarde semblent fonctionner, mais je n'arrive pas à faire un resize de Bitmap32.
Quelqu'un aurait déjà fait cela ?
avec un Bitmap 32bits chargé dans un TImage tu peux faire ceci
voici ce que ça donne en chargeant ton image PNG transformée en Bitmap 32 bits sous XnView
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 procedure TForm1.FormPaint(Sender: TObject); var BF: TBlendFunction; begin BF.BlendOp := AC_SRC_OVER; BF.BlendFlags := 0; BF.SourceConstantAlpha := 255; BF.AlphaFormat := AC_SRC_ALPHA; Windows.AlphaBlend(Canvas.Handle, 10, 10, Image1.Width div 2, Image1.Height, Image1.Picture.Bitmap.Canvas.Handle, 0, 0, Image1.Width, Image1.Height, BF); end;
Merci pour cet exemple.
Si j'ai bien compris tu as converti mon image d'exemple en bitmap32 sans delphi puis appliqué ta fonction ? Et on peut sauver le résultat en PNG ?
ben tu disais savoir le faire dans ton précédent message note que la fonction AlphaBlend fonctionne avec un hDC, donc un Canvas.Handle, elle devrait pouvoir fonctionner avec Bitmap32 voir même PNGImage pour peu qu'il fournisse un Canvas et son Handle.
Oui je peux peut être réussir à faire ca
Donc je viens d'essayer au plus simple, avec des PNGImage et l'AlphaBlend, il y a bien des Handle sur les PNGImage mais j'ai une erreur qui me dit que je ne peux pas dessiner sur le Canvas d'un PNGImage (même chose avec des PNGObject).
Je vais tenter avec le Bitmap32 si j'arrive à faire quelque chose...
Bon en lisant la doc de Graphics32 j'ai pu avancer un peu.
J'utilise donc le lien que j'ai donné dans mon post précédent et cette fonction (qui est en vrac donc à réaranger par la suite après les tests) :
Je charge donc mon PNG, je le duplique à gauche et à droite sur un nouveau Bitmap32 et je laisse un écart entre les 2. Puis je resize en divisant par 2 et j'enregistre en PNG.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 procedure PNGExample; var transparent: boolean; myBitmap,myBitmap2,myBitmap3: tBitmap32; R: TKernelResampler; begin myBitmap := TBitmap32.Create; myBitmap2 := TBitmap32.Create; myBitmap3 := TBitmap32.Create; transparent := true; if LoadPNGintoBitmap32 (MyBitmap, 'D:\Test\Output_0001.png', transparent) then begin if transparent then begin // add anything else that should be done if we a transparent PNG image... MyBitmap.DrawMode := dmBlend; end else begin MyBitmap.DrawMode := dmOpaque; end; MyBitmap2.Width:=2606; MyBitmap2.Height:=73; MyBitmap3.Width:=1303; MyBitmap3.Height:=73; MyBitmap2.Draw(0,0,myBitmap); MyBitmap2.Draw(1910,0,myBitmap); R := TKernelResampler.Create(MyBitmap2); R.Kernel := TLinearKernel.Create; MyBitmap3.Draw(MyBitmap3.BoundsRect, MyBitmap2.BoundsRect, MyBitmap2); SaveBitmap32ToPNG (myBitmap3, transparent, clWhite, 'D:\Test\Test.png', 5);
Tout semble fonctionner sauf qu'entre les 2 PNG que j'ai dupliqué, au lieu d'avoir de la transparence j'ai du noir que je n'arrive pas à enlever...
dans Bitmap32 tu dois avoir une fonction clear ou fill qui permet de le remplir avec une couleur dont le canal alpha est à 0 (avant de dessiner les deux images)
Effectivement un Bitmap32.Clear ne fonctionne pas mais un Bitmap32.Clear($FFFFFFFF) semble fonctionner
Je vais finir mes tests mais ca semble bien s'annoncer
Merci !
Bon ben dernier problème : j'ouvre un PNG que je charge dans un Bitmap32 et j'enregistre directement ce Bitmap32 en PNG donc aucune modification. Au lieu d'avoir le fichier suivant (original), j'obtiens ce fichier qui rajoute des pixels blancs...
ce doit être un problème de format d'enregistrement, tu es passé de 738 couleurs à 264...mais ce que je ne comprend pas c'est que ta première image n'a pas de canal alpha, donc je ne vois pas comment le programme pourrait décider de modifier le contours du texte...ça ressemble plus à une image dont le canal alpha a été transformé en couleur de transparence binaire.
Les 2 images que j'ai posté ne sont que des captures réalisées avec l'outil capture de Windows, le mieux serait peut être que je poste un PNG original non modifié ?
Edit : Fichier d'origine non retouché :
Salut
Voici un exemple complet qui traite de ce sujet.
Bon dev
De retour parmis vous après 10 ans!!
Merci pour ce lien qui pourrait m'être fort utile
Je vais étudier les possibilités, je peux revenir vers toi en cas de problème ou de question ?
Merci !
Pas de souci. De mémoire, il s'agit d'une fonction de redimensionnement avec un filtre anti-aliasing. L'exemple que je t'ai donné date un peu mais le principe reste le même. Il utilise la librairie Graphic32. Si tu as besoin de plus de détails, je me replongerais dans le code. Bon courage
De retour parmis vous après 10 ans!!
Merci c'est très sympa
Je pense que ca peut correspondre à ce que je cherche, à savoir charger un PNG avec transparence, le resizer avec un filtre un peu plus évolué que le basique (du genre Spline ou Lanczos ou Mitchell) et l'enregistrer en PNG avec transparence.
On va voir ce que ca donne
Alors déjà j'ai un petit problème (mais ton projet n'est pas prévu pour ca à la base), il y a une fonction pour charger un PNG en Bitmap32 mais par pour enregistrer un Bitmap32 en PNG.
Aurais-tu une fonction qui fait cela ?
Deuxième chose, Graphics32 n'utilise plus le StretchFilter mais un TKernelResampler (qui reprend les filtres du StretchFilter et quelques uns en plus d'après ce que j'ai pu voir). Mais ca encore ca se modifie, l'idéal pour moi dans un 1er temps serait de pouvoir charger un PNG dans un Bitmap32 et enregistrer ce Bitmap32 en PNG
Salut
Je n'ai pas retrouvé le code qui permettrait de sauver un objet Bitmap32 en PNG, mais il me semble qu'il suffirait d'utiliser tout simplement la fonction SaveToFile. En attendant, je vais quand même essayer de chercher dans mes cartons, ça fait un bon moment que j'ai développé tout ça
[EDIT] J'ai retrouvé ces liens si ça peut t'aider...
http://www.developpez.net/forums/d67...r-image-png/#5
http://www.developpez.net/forums/d15...-transparence/
De retour parmis vous après 10 ans!!
Merci de t'intéresser à mon sujet et merci pour le lien
En regardant bien, ta fonction permet de charger un PNG en Bitmap32 et ton lien montre comment enregistrer un TPngImage ou TPngObject directement, il n'y a pas de conversion du BMP32 vers PNG avant de pouvoir le sauvegarder, d'où mon problème...
J'ai peur de n'avoir pas tout compris...
J'essaye autrement :
Dans le sujet suivant, on explique comment dissocier une image 32bits (RGBA) et 2 images :
24 bits pour l'image RGB et 8 bits pour le masque alpha
Puis on explique comment refusionner l'image et la sauvegarder
http://www.developpez.net/forums/d15...ransparence/#8
Ps : Je vais chercher dans mes codes, je l'ai déjà fait. Patience
De retour parmis vous après 10 ans!!
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager