Bonsoir,
J'utilise processing pour faire des petits gribouillages que j'aimerai bien imprimer. Malheureusement actuellement mes réalisations font la taille de mon écran, et donc l'export en png n'a pas la résolution suffisante pour l'impression.
Je cherche donc comment trouver un moyen de "zoomer" sur ma zone de travail, à savoir faire en sorte qu'un pixel de mon écran corresponde par exemple à 10 pixels effectifs dans mon image.
J'ai également regardé du côté de l'export PDF avec beginRecord(PDF, "frame.pdf") ; seulement les ressources demandées par mes gribouillages rendent manifestement cette méthode impossible...
Merci d'avance à l'âme charitable susceptible de me filer un coup de pouce
Hors ligne
Salut, pas sûr d'avoir bien compris, mais je viens d'essayer les petits exemples de cette page de référence : https://processing.org/reference/libraries/pdf/ (premier résultat d'une recherche "processing pdf") et ça me produit bien un pdf même avec "espace de dessin" très très grand. Ensuite, comme n'importe quel autre document, quelles que soient ses dimensions, mon lecteur pdf peut l'imprimer en l'ajustant à la taille de ma feuille.
flipo44 a écrit:
seulement les ressources demandées par mes gribouillages rendent manifestement cette méthode impossible...
oui.. mais encore ?? quelles ressources, quel impossible ? ça se "manifeste" comment ?
Dernière modification par Nicolas Lhommet (2015-03-06 08:17:24)
Hors ligne
Bonjour Nicolas,
Merci beaucoup pour ta réponse !
En fait quand j'insère la fonction beginRecord(PDF, "frame.pdf") dans le programme, cela "rame" complètement, je pense qu'il y a trop de points à tracer dans le pdf.
je te mets en pj le programme sur lequel je travaille. J'ai mis les instructions PDF en commentaire : lorsqu'elles sont commentées le programme fonctionne très bien, mais dès qu'on utilise l'enregistrement PDF ce n'est plus fonctionnel...
Hors ligne
Bonjour,
Tu peux créer le pdf uniquement lorsque tu sauvegardes l'image, comme cela ton processus garde sa fluidité :
import processing.pdf.*; PGraphics calque; void setup() { size(400, 400); calque = createGraphics(width, height); } void draw() { calque.beginDraw(); calque.line(pmouseX, pmouseY, mouseX, mouseY); calque.endDraw(); image(calque, 0, 0); } void keyPressed() { beginRecord(PDF, "image.pdf"); image(calque, 0, 0); endRecord(); }
Hors ligne
ah je pensais que l'enregistrement PDF n'était possible que lorsque la saisie se faisait pendant l'enregistrement ! Je vais essayer ça. Je vous tiens au courant !
Merci !
Hors ligne
hello Mushussu,
Je viens d'essayer ton exemple, le pdf s'enregistre bien mais en fait la résolution est celle du calque...je pensais que cela enregistrait en vectoriel. Pour l'impression ça ne va pas le faire du coup.
Hors ligne
processing dessine à 72 dpi en fonction de la résolution à laquelle tu veux imprimer tu peux faire une simple règle de trois pour connaitre les dimension à donner à ton sketch
il y a un tuto sur le site de processing à ce sujet, je ne l'ai pas encore lu mais à mon avis il devrait te donner pas mal d'infos : https://processing.org/tutorials/print/
Hors ligne
As-tu pris le temps de lire la doc de référence que je t'ai indiquée ? Moi oui, et j'y ai justement trouvé une solution à ton problème, en bas de la page : en créant le pdf avec createGraphics(), après on peut "dessiner" la même chose qu'à l'écran directement dans le pdf...
J'en profite d'ailleurs pour apporter quelques précisions pour ceux à qui la pertinence de ta question échapperait, c'est effectivement tout l’intérêt de la chose : garder les tracés vectoriels (lignes, points, courbes, contour, remplissages, etc...) de Processing en les mettant les uns après les autres dans le pdf. S'il y a beaucoup de traits, le fichier (bien que de taille réduite) sera évidemment assez "lourd" à afficher... un peu comme les pdf des plans de "réseau de transports urbains" de certaines (grandes) villes, parfois longs à se "re-dessiner".
Mais tous les tracés sont ainsi conservés tels quels à l'intérieur du fichier PDF, dans le format Postscript, et c'est justement ce format (un standard créé par Adobe mais introduit par Apple en 1985 dans ses imprimantes laser, avec le fameux combo Macintosh/LaserWriter qui a "popularisé" ce format ainsi que la PAO au bureau) qui peut ensuite être interprété par une imprimante laser pour refaire le "dessin" trait par trait dans sa mémoire interne avant de l'imprimer, et ce quelque soit la résolution.
C'est le même système qui (comme avec les logiciels de dessin vectoriel Inkscape ou Illustrator) permet par exemple de reproduire proprement, avec un tracé bien lisse (et non pas tout "pixelou" ) n'importe quelle police de caractère dans toutes les tailles, et dans l'absolu, d'utiliser le même fichier pour imprimer un timbre et une affiche en "4 (mètres) par 3".
Dernière modification par Nicolas Lhommet (2015-03-08 12:54:20)
Hors ligne
flipo44 : pour ton sketch en pièce jointe, ce n'est pas l'enregistrement en pdf qui pose problème, ni le nombre de traits qui fait ramer Processing, j'y reviens si tu voulais mieux comprendre ce qui se passe.
Tu effectues tes tracés "hors-ligne" (ou "offline", c'est à dire sans les afficher) dans ton calque. Comme tu t'en es rendu compte, tu perds tes tracés vectoriels à cause de l'utilisation de la fonction image() qui te sert à afficher le calque complété avec chaque nouveau trait, mais qui le transforme préalablement en une image qui correspond seulement à la "grille de pixels" ("bitmap" en anglais, par opposition à vectoriel) obtenue à un moment donné du dessin, donc "figée" à la résolution de l'image.
Pour l'enregistrement PDF, absolument tous les tracés effectués dans la "zone de dessin" de Processing sont conservés en mémoire, puis enfin écrits sur le disque quand l'enregistrement est arrêté. Les tracés dans tes calques ne sont donc pas concernés, mais ta boucle draw() affiche systématiquement deux images, et même une troisième lorsqu'un nouveau trait est ajouté au calque, ce qui équivaut (au moins) à quelques dizaines d'images créées , puis affichées, par secondes...
Rien de plus banal pour un affichage sur l'écran, chaque nouvelle image recouvrant immédiatement la précédente qui n'est pas conservée, ça ne pose pas de problème.
Mais avec l'enregistrement PDF, ce sont autant d'images qui s'accumulent en mémoire, car conservées pour finalement être "écrites" sur le disque en une seule fois (dans le fichier pdf) en fin d'enregistrement, ce qui peut prendre un certain temps en raison du volume de données... avec au final un très gros fichier, sachant que toutes ces images y sont stockées au format PPM (http://en.wikipedia.org/wiki/Netpbm_format#PPM_example) donc généralement pas (ou peu) compressées. (EDIT: et pour ne rien arranger, j'ai constaté que, pour chaque image enregistrée, un image supplémentaire, toute noire et de même résolution, est inexplicablement ajoutée...)
Dernière modification par Nicolas Lhommet (2015-03-08 21:21:52)
Hors ligne
Bonjour Nicolas, Beranger,
Tout d'abord merci infiniment pour cette réponse très complète et pour avoir pris le temps de lire mon programme.
Je comprends du coup effectivement le problème avec mon code dans lequel ma boucle draw() était incluse dans l'enregistrement PDF.
D'après ma compréhension la solution à mon problème résiderait donc dans l'approche proposée par Mushussu, à savoir écrire les données de mon pgraphics seulement au moment de sauvegarder l'image.
dans l'exemple de Mushussu, le calque est toutefois passé en bitmap pour l'enregistrement :
void keyPressed() { beginRecord(PDF, "image.pdf"); image(calque, 0, 0); endRecord(); }
je ne vois pas trop comment enregistrer sans passer en bitmap.
En revanche j'ai creusé du côté de createGraphics comme Nicolas me l'a suggéré. Dans ce cas j'écris dans mon PGraphicsPDF en même temps que j'écris dans mon calque bitmap. J'arrive alors bien à enregistrer en PDF ! seulement pour le moment mon code est un peu bancal, je duplique mes instructions pour le calque affiché et le PGraphicsPDF :
import processing.pdf.*; PImage img; PGraphics calque1; PGraphics calque2; PGraphicsPDF pdf; float opacite=255/2; ArrayList history = new ArrayList(); float distthresh = 300; boolean symetrie=false; void setup() { size(2056, 1433); calque1 = createGraphics(width, height); calque2 = createGraphics(width, height); img = loadImage("20510305_coleo1.png"); pdf = (PGraphicsPDF) createGraphics(width, height, PDF, "pause-resume.pdf"); } void draw(){ calque1.beginDraw(); calque1.background(255,opacite); calque1.endDraw(); calque2.beginDraw(); calque2.endDraw(); image(img, 0, 0); image(calque1,0, 0); image(calque2, 0, 0); if (mousePressed) { PVector d = new PVector(mouseX,mouseY,0); history.add(0,d); calque2.beginDraw(); pdf.beginDraw(); for (int p=0; p<history.size(); p++){ PVector v = (PVector) history.get(p); float joinchance = p/history.size() + d.dist(v)/distthresh; calque2.stroke(d.dist(v)*1.25,50); //I added this line to make the color dependent on distance. pdf.stroke(d.dist(v)*1.25,50); //I added this line to make the color dependent on distance. if (joinchance < random(0.2)){ calque2.line(d.x,d.y,v.x,v.y); pdf.line(d.x,d.y,v.x,v.y); } } calque2.endDraw(); pdf.endDraw(); image(calque2, 0, 0); } } void keyPressed() { if (key == CODED) { if (key == 's') { calque2.get().save(year()+""+month()+""+day()+"-"+hour()+"h"+minute()+".png"); beginRecord(pdf); endRecord(); saveHiRes(5); } }
Hors ligne
Bonsoir. Effectivement comme je l'ai déjà expliqué, tous les graphismes faits "hors-ligne" ne seront "affichables" qu'en utilisant la fonction image() qui les transformera en "bitmap", et lors d'un "enregistrement PDF", chaque image résultante sera placée dans le fichier : on est d'accord, c'est bien dommage
Je n'ai pas trouvé non plus de méthode pour "redessiner" un calque contenant des tracés vectoriels (PGraphics), aussi bien à l'écran que dans le pdf... et effectivement ça manque, car d'une manière générale, ça serait bien utile de pouvoir transformer (agrandissement et autres) les vecteurs de ce type de calque, et même de pouvoir les modifier postérieurement à leur création... mais quelqu'un pourrait peut-être nous aiguiller sur une solution existante pour les PGraphics (de type JAVA2D en l’occurrence) ?
La méthode du pdf dessiné "hors-ligne" créé avec createGraphics() permet de choisir précisément ce qu'on veut mettre dans le fichier, en le dissociant de l'affichage. Donc, à moins que toutes les opérations d'affichage conviennent également pour le pdf (ce qui, comme on l'a vu, n'est pas du tout le cas avec ton utilisation des calques...) ça paraît être une bonne méthode. Ce n'est pas forcément très "élégant" de faire systématiquement deux fois les mêmes tracés (une fois pour l'affichage et une fois pour le pdf) mais ça règle ton problème, et c'est là bien l'essentiel.
Par contre, je ne comprends pas pourquoi, dans ce cas, tu continues à utiliser beginRecord() et endRecord() ....
Voici dans son INTÉGRALITÉ le passage de la documentation concernée (préparez une bûche pour la cheminée )
citation :
Using createGraphics() to Create a PDF File
To write a PDF file using only the createGraphics() command, rather than as part of a sketch, it's necessary to call dispose() on the PGraphicsPDF object. This is the same as calling exit(), but it won't quit the sketch.import processing.pdf.*; PGraphics pdf = createGraphics(300, 300, PDF, "output.pdf"); pdf.beginDraw(); pdf.background(128, 0, 0); pdf.line(50, 50, 250, 250); pdf.dispose(); pdf.endDraw();
donc aucun "PGraphicsPDF" en vue, ni de "beginRecord" ou "endRecord"..... par contre, l'accent est clairement mis sur la fonction dispose(), à utiliser dans ce cas pour terminer l'enregistrement du PDF. Même si on comprend mal l'anglais, l'exemple proposé est tout à fait clair là-dessus.... et sans une lecture appliquée (au sens propre comme au figuré) de la documentation (qui a justement été écrite pour lever, autant que faire se peut, les ambiguïtés) ça sera difficile d'avancer... mais bon courage !
Dernière modification par Nicolas Lhommet (2015-03-11 00:17:25)
Hors ligne
Bonjour Nicolas,
Merci pour ton retour riche en enseignement (une fois n'est pas coutume )
effectivement je me suis compliqué la vie pour le createGraphics, j'ai repris la syntaxe du premier exemple :
import processing.pdf.*; boolean recording; PGraphicsPDF pdf; void setup() { size(400, 400); pdf = (PGraphicsPDF) createGraphics(width, height, PDF, "pause-resume.pdf"); } void draw() { // Be sure not to call background, otherwise your file // will just accumulate lots of mess, only to become invisible // Draw something good here if (mousePressed) { line(pmouseX, pmouseY, mouseX, mouseY); } } void keyPressed() { if (key == 'r') { if (recording) { endRecord(); println("Recording stopped."); recording = false; } else { beginRecord(pdf); println("Recording started."); recording = true; } } else if (key == 'q') { if (recording) { endRecord(); } exit(); } }
ceci dit je ne comprends par pourquoi dans cet exemple ils emploient
pdf = (PGraphicsPDF) createGraphics(width, height, PDF, "pause-resume.pdf");
et dans le second
PGraphics pdf = createGraphics(300, 300, PDF, "output.pdf");
en creusant un peu hier je me demandais si un moyen de sauvegarder mon sketch en haute résolution serait de dupliquer mon pgraphics calque2 dans un nouveau pgraphics dont les dimensions seraient plus grandes, en "scalant" calque2 au préalable. est il possible de copier le contenu d'un pgraphics vers un autre ?
Hors ligne
flipo44 a écrit:
Merci pour ton retour riche en enseignement (une fois n'est pas coutume )
euh, je sais pas comment je dois le prendre...
citation :
est il possible de copier le contenu d'un pgraphics vers un autre ?
dis donc, t'en as plein des questions à mon tour de t'en poser une, en échange : est-ce qu'on pourrait pas faire ce que tu dis avec la librairie "geomerative" (trouvée en tapant "vector" dans le gestionnaire de librairie de Processing) ? Une fois n'est pas coutume tu pourrais faire des essais et nous dire ce que ça donne, ça serait super !
Hors ligne