1

Voilà, pour un projet perso, je désire exporter des images dans des formats quelconques (en fait, au moins PNG, JPEG, SVG et FIG).
Je me suis dit que la meilleure solution pour les formats classiques tels que PNG, JPEG et GIF serait d'utiliser MagickWand, l'API C d'ImageMagick, et m'occuper moi-même du SVG et du FIG. Je pensais m'en servir également pour calculer les dimensions des textes. En gros, tout ce que je veux faire, c'est dessiner des rectangles, du texte (centré, aligné à droite, en haut, en bas, ... ), mais avec le même rendu dans tous les formats.

Manque de chance, la doc est franchement pas terrible, voire carrément mauvaise :/
Du coup, je n'arrive pas à faire un simple rectangle en PNG sad 

J'ai essayé pas mal de trucs, dans ce genre :
		file->magick_wand = NewMagickWand();
		file->drawing_wand = NewDrawingWand();
		MagickNewImage(file->magick_wand, 640, 480, color->pixel_wand);
		MagickSetImageBackgroundColor(file->magick_wand, color->pixel_wand);
		DrawSetViewbox(file->drawing_wand, 0, 0, 640, 480);
		DrawSetFillColor(file->drawing_wand, color->pixel_wand);
		DrawSetFillOpacity(file->drawing_wand, 1.0);
		DrawSetStrokeColor(file->drawing_wand, color->pixel_wand);
		DrawSetStrokeWidth(file->drawing_wand, 1.0);
		DrawSetFillColor(file->drawing_wand, color->pixel_wand);
		DrawRectangle(file->drawing_wand, 10., 20., 50., 80.);
		MagickDrawImage(file->magick_wand, file->drawing_wand);
		MagickSetImageFormat(file->magick_wand, "PNG");
		MagickWriteImageFile(file->magick_wand, file->png);
		fclose(file->png);


Mais j'ai toujours une image complètement noire sad Auriez-vous des idées ?
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

2

ça a pas l'air d'inspirer grand monde...

sinon, y'a un avantage particulier à imageMagick, ou gd ça pourrait le faire?

3

À vrai dire, je n'y avais pas pensé... mais gd n'a pas l'air de permettre de calculer la taille d'une chaîne de caractères sad 
Ou alors y a-t-il une autre méthode pour le faire ?

En gros, j'ai un rectangle, une chaîne STR, et je veux pouvoir afficher STR comme je veux dans le rectangle (centré, à n pixels du bord droit, etc... )
En fait, je voudrais pouvoir prendre en compte tout ça : alignement.gif

(le but du projet, c'est de prendre un XML en entrée et de le dessiner, en prenant en compte un fichier de style qui imite beaucoup le format CSS)
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

4

ah c'est la taille des chaines que tu veux particulièrement. je sais pas si gd le fait. y'a un gd2 aussi je crois.

5

Gd se contente de supposer que les caractères font tous la même largeur tritop


Sinon, je pense avoir compris mon problème :
PixelSetColor
PixelSetColor() sets the color of the pixel wand with a string (e.g. "blue", "#0000ff", "rgb(0,0,255)", "cmyk(100,100,100,10)", etc.).
The format of the PixelSetColor method is MagickBooleanType PixelSetColor(PixelWand *wand,const char *color)
A description of each parameter follows:
wand: the pixel wand.
color: the pixel wand color.


PixelSetColorCount
PixelSetColorCount() sets the color count of the pixel wand. The format of the PixelSetColorCount method is void PixelSetColorCount(PixelWand *wand,const unsigned long count) A description of each parameter follows:
wand: the pixel wand.
count: the number of this particular color.


Je faisais un pixelsetcolorcount, mais en essayant avec un pixelsetcolor, ça fonctionne happy
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

6

La taille des chaines, tu peux l'avoir avec strlen il me semble.

dehors
Tout ce qui passe pas par le port 80, c'est de la triche.

7

tongue

Bon, effectivement, ça fonctionne bien, j'ai un rendu identique pour le dessin des rectangles en svg et en png (bon, à part pour le le border-width qui n'est pas parfaitement pris en compte, mais spa grave pour l'instant). Maintenant, je vais m'occuper de la génération du .fig avant d'afficher les chaînes de caractères embarrassed

Au passage, j'avais un bug que j'ai réussi à corriger, même si je ne le comprends pas bien :

PixelSetColor(& color1, ...); 
PixelSetColor(& color2, ...);
DrawSetFillColor(file->drawing_wand, color1);
DrawSetStrokeColor(file->drawing_wand, color2);


); DrawSetStrokeColor(file->drawing_wand, color2);
plante, alors que la version suivante fonctionne :PixelSetColor(& color1, ...); 
DrawSetFillColor(file->drawing_wand, color1);
PixelSetColor(& color2, ...

On dirait qu'il ne peut y avoir qu'une seule couleur active à la fois... Je ne vois pas trop l'intérêt de permettre d'en allouer plusieurs, alors hum
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

8

onur (./6) :
La taille des chaines, tu peux l'avoir avec strlen il me semble.

dehors

Il est scriptable son soft ? grin

9

hu ?
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

10

11

(en effet ^^ désolé du hs)

12

Bon, j'arrive à générer mes PNG, et y afficher du texte... sauf que petit problème :

pSnH

Je prends bien soin de complètement spécifier toutes les caractéristiques de la police (avec des constantes), et pourtant, il y a des problèmes; on dirait que le même texte est affiché plusieurs fois sur la seconde ligne alors que ce n'est pas le cas (j'ai compté le nombre d'appels à la fonction en question).
        DrawSetFillColor(file->drawing_wand, color_stroke->pixel_wand);
        DrawSetStrokeColor(file->drawing_wand, color_stroke->pixel_wand);
        DrawSetFontWeight(file->drawing_wand, 500);
        DrawSetFontSize(file->drawing_wand, (float) 18);
        DrawSetGravity(file->drawing_wand, 0);
        DrawSetFontStretch(file->drawing_wand, NormalStretch);
        DrawSetFontStyle(file->drawing_wand, NormalStyle);
        DrawSetTextDecoration(file->drawing_wand, NoDecoration);
        DrawSetFont(file->drawing_wand, "Symbol");
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

13

Problème résolu : il fallait mettre DrawSetStrokeWidth à 0 pour avoir un affichage à peu près correct happy

Mais ça reste assez chiant, quand même (l'espacement entre les lettres ne me semble pas bon, par exemple). Autre problème avec ImageMagick : c'est leeeeeeeeeeeeeeeent sick mon programme prend 10s pour s'exécuter, dont plus 90% dans les routines de postscript qui gèrent les polices de caractères couic (pourtant, il n'y a vraiment pas grand-chose).
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant