Transparence dans un png

Tout ce qui concerne l'utilisation ou l'installation d'Asymptote.

Modérateur: gdm_asy

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

Transparence dans un png

Messagepar Romain Janvier » Jeudi 13 Octobre 2011, 22:29

Bonjour,

J'aimerai produire des images png avec un fond transparent et avec un dessin partiellement transparent. Le problème c'est que lorsque je produis du png, le fond est bien transparent, mais l'opacité des objets n'est pas respecté. Si je fais un pdf, j'ai l'opacité des objets, mais le fond est blanc et toute l'image est "opaque". Un exemple :

5e7faa18be335f5e224a76832a17cc41.png

Code: Tout sélectionner
import geometry;
unitsize(1cm);
settings.tex="pdflatex";
settings.outformat="pdf";
fill((path)circle((0,0),3),yellow+opacity(0.2));
fill((path)circle((3,0),3),blue+opacity(0.2));


Si j'essaie de convertir le pdf en png avec "convert", l'image n'a pas de couche alpha, donc cela ne marche pas non plus...

Si quelqu'un a une idée...

Merci.
Romain Janvier
Kilo-utilisateur
 
Messages: 146
Inscription: Lundi 23 Août 2010, 13:57
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: Transparence dans un png

Messagepar GMaths » Samedi 15 Octobre 2011, 18:36

Bonjour, j'y suis parvenu avec convert :

2011-10-15_193524.png
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Transparence dans un png

Messagepar Romain Janvier » Samedi 15 Octobre 2011, 19:04

Merci, mais j'avais déjà trouvé cela.

Le problème, c'est que je voudrai aussi que les cercles soient partiellement transparents. Je pense que je vais produire l'image sans transparence et utilise imagemagick pour virer le blanc et ajouter la transparence.

L'idéal, cela serait de pouvoir gérer la transparence directement lors de l'export en png dans asymptote. Mais bon, il met déjà le fond transparent dans ce cas.
Romain Janvier
Kilo-utilisateur
 
Messages: 146
Inscription: Lundi 23 Août 2010, 13:57
Statut actuel: Actif et salarié | Enseignant

Re: Transparence dans un png

Messagepar GMaths » Samedi 15 Octobre 2011, 19:14

Romain Janvier a écrit:Le problème, c'est que je voudrai aussi que les cercles soient partiellement transparents.
par rapport à ? le contenu d'une page internet ?

Romain Janvier a écrit:L'idéal, cela serait de pouvoir gérer la transparence directement lors de l'export en png dans asymptote.

???
Asymptote utilise convert pour créer les png !

------------

Je ne comprends pas tout ce que tu veux dire.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Transparence dans un png

Messagepar Romain Janvier » Samedi 15 Octobre 2011, 21:10

En fait, j'ai fait des images de rapporteurs, équerres, compas et règles pour faire des animations flash (il faut que je fasse le ménage, mais je mettrai le code plus tard). Je veux aussi en faire des png avec transparence pour importer les images dans geogebra. Si les instruments sont opaques, cela nuit grandement à la lisibilité. Et puis c'est aussi parce que je suis tombé sur ce problème et que je voulais voir s'il y avait une solution.

Au passage, comment faire pour avoir des images png avec une bonne résolution sans passer par convert en utilisant -density ? Parce que les png produits par asymptote ont une résolution ridicule.
Romain Janvier
Kilo-utilisateur
 
Messages: 146
Inscription: Lundi 23 Août 2010, 13:57
Statut actuel: Actif et salarié | Enseignant

Re: Transparence dans un png

Messagepar GMaths » Samedi 15 Octobre 2011, 21:53

Romain Janvier a écrit:c'est aussi parce que je suis tombé sur ce problème et que je voulais voir s'il y avait une solution.


Romain Janvier a écrit:Au passage, comment faire pour avoir des images png avec une bonne résolution sans passer par convert en utilisant -density ? Parce que les png produits par asymptote ont une résolution ridicule.


Pourquoi cette réticence à utiliser convert alors que de toute façon... c'est ce qu'utilise asymptote quand tu lui demandes un png ?

Asymptote can also produce any output format supported by the ImageMagick convert program (version 6.3.5 or later recommended; an Invalid Parameter error message indicates that the MSDOS utility convert is being used instead of the one that comes with ImageMagick). The optional setting -render n requests an output resolution of n pixels per bp. Antialiasing is controlled by the parameter antialias, which by default specifies a sampling width of 2 pixels. To give other options to convert, use the convertOptions setting or call convert manually. This example emulates how Asymptote produces antialiased tiff output at one pixel per bp:
asy -o - venn | convert -alpha Off -density 144x144 -geometry 50%x eps:- venn.tiff


Pour moi... je ferais un script qui convertirait par lot tous les fichiers asy mis dans un dossier donné... en utilisant asymptote pour obtenir un pdf puis les outils d'imagemagick pour le png... afin de pouvoir personnaliser davantage les réglages.

Je n'ai pas creusé beaucoup la question mais il me semble qu'avec l'option -f png, asymptote passe forcément par une compilation latex, alors qu'il faut pdflatex pour les transparences.
Il y a moyen de passer des paramètres à convert lors de la commande asymptote
Code: Tout sélectionner
asy -f png convertOptions="-alpha Set -transparent white" nomdufichier.asy

mais pour avoir la transparence des cercles par rapport à eux-même comme dans mon premier envoi... il faut pour moi passer par une compilation avec pdflatex... et le "deuxième niveau" de transparence pour l'image globale tu ne pourras l'avoir qu'avec un outil externe.

Avec composite d'imagemagick par exemple :

2011-10-15_222857.png


Je pratique rarement ce genre de choses... donc mon propos est à relativiser.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Transparence dans un png

Messagepar Romain Janvier » Dimanche 16 Octobre 2011, 11:33

Merci, c'est exactement ce que je voulais faire.

Bon il faut que je creuse un peu parce qu'après je veux rajouter les graduations, donc il ne faut pas qu'elles soient en transparence. À mon avis il faut que je fasse une image avec le fond du rapporteur (sans transparence) et une image avec juste les graduations. Puis avec convert, je mets le fond en transparent et je superpose les graduations.

Et je n'ai rien contre convert, bien au contraire. Mais si au lieu de faire toutes ces manips, je pouvais me contenter de changer settings.outformat="pdf" en settings.outformat="png", cela serait plus simple à automatiser.

Bon allez, je vais tester tout ça.
Romain Janvier
Kilo-utilisateur
 
Messages: 146
Inscription: Lundi 23 Août 2010, 13:57
Statut actuel: Actif et salarié | Enseignant

Re: Transparence dans un png

Messagepar Romain Janvier » Dimanche 16 Octobre 2011, 12:45

Ça fait 1h que je suis dessus et je ne comprends rien... Impossible de transformer le blanc en transparent avec convert. J'ai essayé de mettre les options dans tous les sens mais rien à faire. J'ai essayé
Code: Tout sélectionner
convert -alpha Set -transparent white ImageOrigine.pdf ImageFinale.png

Pourtant quand asymptote me sort un png, ça marche. Mais la résolution n'est pas modifié, malgré -convertOptions="-density 300", que cela soit dans le fichier ou en ligne de commande.

J'ai même essayé de convertir un png fait avec gimp, mais là non plus cela ne marche pas. J'ai essayé de mettre le nom du fichier d'origine avant "-alpha Set -transparent" mais sans succès. J'ai testé toutes les permutations possibles... La seule option qui marche quand j'appelle manuellement convert, c'est "-density 300".

J'utilise imagemagick 6.6.5-10 sous Fedora 15...

Edit :
Bon j'avance un peu. La conversion avec transparence marche en gif... Allez comprendre. Là je me bats pour faire la composition.
Dernière édition par Romain Janvier le Dimanche 16 Octobre 2011, 14:33, édité 1 fois.
Romain Janvier
Kilo-utilisateur
 
Messages: 146
Inscription: Lundi 23 Août 2010, 13:57
Statut actuel: Actif et salarié | Enseignant

Re: Transparence dans un png

Messagepar Francky » Dimanche 16 Octobre 2011, 14:33

Si tu n'as pas de label*, tu peux essayer de demander à asymptote de te cracher du svg,
et ensuite tenter une conversion en png avec tes paramètres.

Flash permet ou pas de bidouiller le svg ? (je crois pas en fait)

Ton idée semble super sympa, mais le problème, c'est flash !!!
L'avenir semble plutôt du côté html5, mais, c'est vrai qu'il y a pas encore
grand chose de pratique pour bosser avec.

--
* le code svg pour les label d'asymptote est ...
mais ça passe si il faut.
Linux Mint | TeXLive - TexMaker - asymptote | Python3 & C - Geany - Project Euler - SPOJ
Entia non sunt multiplicanda praeter necessitatem
Francky
Giga-utilisateur
 
Messages: 683
Inscription: Dimanche 11 Avril 2010, 13:01
Statut actuel: Actif et salarié | Enseignant

Re: Transparence dans un png

Messagepar Romain Janvier » Dimanche 16 Octobre 2011, 14:35

J'ai des labels dans mes images.

Et en fait, c'est du swf, pas du flv.

Mais là c'est surtout imagemagick qui pose des problèmes...

Pour infos, les images que je veux faire :

rapporteur-demi-circulaire.png


rapporteur-circulaire.png
Romain Janvier
Kilo-utilisateur
 
Messages: 146
Inscription: Lundi 23 Août 2010, 13:57
Statut actuel: Actif et salarié | Enseignant

Re: Transparence dans un png

Messagepar GMaths » Dimanche 16 Octobre 2011, 14:56

Romain Janvier a écrit:La seule option qui marche quand j'appelle manuellement convert, c'est "-density 300".

Donc apparemment... c'est le bon "convert" qui est utilisé.
Je dis cela car je précise aux utilisateurs de windows qu'il y a un truc à savoir la première fois qu'on l'utilise convert sous windows : mettre le chemin complet vers convert sous peine que ce soit l'utilitaire dos du même nom qui soit utilisé.

Autre mise en garde à ceux qui veulent tester : choisissez un visualiseur adapté pour voir s'il y a transparence de la couleur blanche : car nombre de visualiseurs ont un background blanc par défaut et ils ne permettent pas de savoir si le paramètre de transparence est pris en compte.

------------------

Pour le problème sous Fedora... je ne sais pas, car je ne peux pas tester.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Transparence dans un png

Messagepar Romain Janvier » Dimanche 16 Octobre 2011, 15:23

Je ne suis pas sous windows et le visualiseur que j'utilise affiche correctement les parties transparentes.

Mais là je rame encore... Avec les images en gif, j'ai des contours blancs parce que la suppression des zones blanches ne se fait pas en tenant compte de l'antialiasing... Alors que l'export de asymptote en png convertit le pourcentage de blanc en pourcentage de transparence.

Je vais essayer de virer l'antialiasing et de faire un export en très grande résolution, faire mes manips puis réduire la résolution.

Edit :
En modifiant la ligne donnée dans la doc de asymptote :
Code: Tout sélectionner
asy -o - venn | convert -alpha Off -density 144x144 -geometry 50%x eps:- venn.tiff

J'ai fait l'export en tiff et j'ai fait la composition avec gimp. Cela donne :
rapporteur-circulaire-reduit.png

rapporteur-demi-circulaire-reduit.png


Et le code pour les faire (il y a des options qui ne sont pas encore implémentées) :
Code: Tout sélectionner
void rapporteur(pair depart=(0,0), real angle=0, real longueur=3, real largeur=1.5, real largcentre=0.5, bool graduation=true, bool labels=true, bool doublegraduation=true,bool reverse=false, bool fill=true, bool contours=true, real hLStep=0.3, real hStep=0.2, real hstep=0.1, real step=1, real Step=5, real LStep=10, real lstep=LStep, pen p=currentpen, pen fillpen=lightblue+opacity(0.2),pen couleurext=currentpen, pen texteext=couleurext+fontsize(10),pen couleurint=currentpen,pen texteint=couleurint+fontsize(8)){
path interieur=(longueur+largeur,0)..(0,longueur+largeur)..(-longueur-largeur,0)--(-longueur-largeur,-largeur)--(longueur+largeur,-largeur)--cycle;
path exterieur=(longueur,0)..(0,longueur)..(-longueur,0)--(-largcentre,0)..(0,largcentre)..(largcentre,0)--cycle;
transform r=rotate(angle);

if (fill) {
fill(shift(depart)*r*(exterieur^^interieur),evenodd+fillpen);
}

if (contours) {
draw(shift(depart)*r*(exterieur^^interieur));
draw(shift(depart)*r*((-largcentre/2,0)--(largcentre/2,0)^^(0,-largcentre/2)--(0,largcentre/2)));
}

if (graduation){
real r1=longueur+largeur;
path tick1=(r1,0)--(r1-hstep,0);
path tick2=(r1,0)--(r1-hStep,0);
path tick3=(r1,0)--(r1-hLStep,0);
for(real i=0;i<=180;i=i+step){
draw(shift(depart)*rotate(angle+i)*tick1);
};
for(real i=0;i<=180;i=i+Step){
draw(shift(depart)*rotate(angle+i)*tick2);
};
for(real i=0;i<=180;i=i+LStep){
draw(shift(depart)*rotate(angle+i)*tick3);
};

if (doublegraduation){
real r2=longueur;
path tick22=(r2,0)--(r2+hStep,0);
path tick23=(r2,0)--(r2+hLStep,0);

for(real i=0;i<=180;i=i+Step){
draw(shift(depart)*rotate(angle+i)*tick22);
};
for(real i=0;i<=180;i=i+LStep){
draw(shift(depart)*rotate(angle+i)*tick23);
};
};
};

if (labels) {
real rayon1=longueur+largeur-hLStep;
real rayon2=longueur+hLStep;
real modif=180;
pen p1=texteext;
pen p2=texteint;
if (reverse) {
rayon2=rayon1;
rayon1=longueur+hLStep;
modif=0;
p1=texteint;
p2=texteext;
}
for(real i=0;i<=180;i=i+lstep){
//label("$"+(string)i+"$",Rotate(angle)*shift((i,-hLStep)));
label(rotate(angle-90+i)*("$"+(string)i+"$"),shift(depart)*(rayon1*dir(i+angle)),dir(modif+i+angle),p1);
if (doublegraduation) {
//label("$"+(string)i+"$",Rotate(angle)*shift((i,-hLStep)));
label(rotate(angle+90-i)*("$"+(string)i+"$"),shift(depart)*(rayon2*dir(180-i+angle)),dir(modif-i+angle),p2);
};
};
};
};

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void rapporteurcirculaire(pair depart=(0,0), real angle=0, real longueur=4.5, real largeur=1, real taillecroix=0.5, bool graduation=true, bool contours=true, bool labels=true,bool reverse=false, bool fill=true, real hLStep=0.4, real hStep=0.38, real hstep=0.3, real step=1, real Step=5, real LStep=10, real lstep=LStep, pen p=currentpen, pen fillpen=yellow+opacity(0.2),pen couleurtexte=currentpen,pen texte=couleurtexte+fontsize(10)){
path contour=circle(depart,longueur+largeur);
if (fill) {
fill(contour,fillpen);
}
if (contours) {
draw(contour);
draw(circle(depart,longueur));
draw(shift(depart)*rotate(angle)*((-taillecroix,0)--(longueur-taillecroix,0)));
for (int i=90;i<360;i+=90) {
draw(shift(depart)*rotate(angle+i)*((0,0)--(taillecroix,0)^^(longueur-2taillecroix,0)--(longueur-taillecroix,0)));
};

real d1=longueur*1.9/4.5;
real d3=longueur*3/4.5;
real d2=.5d1+.5d3;
draw(arc(depart,d1,angle,angle+30),Arrow(3mm));
draw(arc(depart,d2,angle,angle+30),Arrow(3mm));
draw(arc(depart,d3,angle,angle+30),Arrow(3mm));

}
if (graduation){
real r1=longueur+largeur;
path tick1=(r1,0)--(r1-hstep,0);
path tick2=(r1,0)--(r1-hStep,0);
path tick3=(r1,0)--(r1-hLStep,0);
real r2=longueur;
path tick23=(r2,0)--(r2+hLStep/2,0);
for(real i=0;i<360;i=i+step){
draw(shift(depart)*rotate(angle+i)*tick1);
};
for(real i=0;i<360;i=i+Step){
draw(shift(depart)*rotate(angle+i)*tick2);
};
for(real i=0;i<360;i=i+LStep){
draw(shift(depart)*rotate(angle+i)*tick3);
draw(shift(depart)*rotate(angle+i)*tick23);
};


};

if (labels) {
real rayon1=longueur+hLStep/2+(largeur-1.5hLStep)/2;
real modif=180;
if (reverse) {
modif=0;
}
for(real i=0;i<360;i=i+lstep){
//label("$"+(string)i+"$",Rotate(angle)*shift((i,-hLStep)));
label(rotate(angle-90+i)*("$"+(string)i+"$"),shift(depart)*(rayon1*dir(i+angle)),texte);
};
};
};
Romain Janvier
Kilo-utilisateur
 
Messages: 146
Inscription: Lundi 23 Août 2010, 13:57
Statut actuel: Actif et salarié | Enseignant

Re: Transparence dans un png

Messagepar GMaths » Dimanche 16 Octobre 2011, 18:40

A propos de rapporteur, une autre suggestion de forme.
Le code est très ancien (c'était à mes débuts avec asymptote) donc je ne donne cet exemple que pour suggérer la forme de rapporteur... et surtout pas pour donner le code en modèle car probablement que je ferais différemment en ayant un peu d'expérience.

Je ne sais plus pourquoi j'avais ajouté des traits supplémentaires.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Transparence dans un png

Messagepar Romain Janvier » Dimanche 16 Octobre 2011, 20:24

Ha oui, il est sympa le tien.

Le problème avec les miens, c'est qu'ils sont faits de plein d'éléments. Et lorsque pdf2swf me convertit tout cela en swf, le nombre d'éléments explose vite. J'ai dû limiter certaines animations pour ne pas dépasser le max autorisé dans un swf...
Romain Janvier
Kilo-utilisateur
 
Messages: 146
Inscription: Lundi 23 Août 2010, 13:57
Statut actuel: Actif et salarié | Enseignant

Re: Transparence dans un png

Messagepar GMaths » Dimanche 16 Octobre 2011, 20:55

GMaths a écrit:Je ne sais plus pourquoi j'avais ajouté des traits supplémentaires.

Je les ai supprimés.

----------

A ceux qui tenteraient de compiler le code... et qui obtiendraient quelque chose de bizarre (un problème d'arc différent),
signalons que geometry.asy a subi une mise à jour depuis la sortie de la version 2.13.

Il sera nécessaire d'avoir la dernière version de geometry.asy.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant


Retourner vers Asymptote

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 4 invités