Sites


Processing

L'impression

Pour l'instant, nous avons travaillé sur l'écran en générant des images et des animations. Nous allons maintenant nous intéresser aux possibilités qu'offre Processing en matière d'impression : nous allons créer un document PDF (Portable Document Format) contenant des formes géométriques vectorielles, document qui pourra ensuite être imprimé sur du papier ou un autre médium.

Mode direct

Dans ce premier exemple, nous allons générer 500 cercles aléatoirement et les dessiner dans un document PDF, qui sera sauvé dans notre dossier de travail.

01_PDF_1

import processing.pdf.*;
size(400, 400, PDF, "Cercles.pdf");
for (int i = 0; i < 500; i++)
   ellipse(random(width),random(height), 50, 50);
exit();

Comment fonctionne ce programme ? Tout d'abord, nous commençons par importer toutes les classes de la librairie processing.pdf. Nous utilisons la méthode size() qui permet de définir les caractéristiques de notre espace de dessin : cette fois-ci, nous mentionnons quatre paramètres. Notez le mot-clé PDF qui indique à Processing que nous allons dessiner dans le document "Cercles.pdf", passé en quatrième paramètre de la méthode.

Avec ce mode direct de tracé, puisque nous dessinons directement dans le document et non plus sur l'écran, nous n'avons plus besoin de la fenêtre de visualisation de Processing. Le programme se termine par la commande exit(), qui indique au logiciel de terminer le programme tout seul, exactement comme si nous avions appuyé sur le bouton stop de l'interface.

Le document généré au format pdf se trouve dans le dossier de sketch de votre application. Vous pouvez double-cliquer dessus pour l'ouvrir.

02_PDF_Fichier_export_1

Mode enregistrement

Nous allons voir maintenant comment dessiner à la fois sur l'écran et dans un fichier .pdf à l'aide des commandes beginRecord() et endRecord(). Ces deux méthodes vont nous permettre de démarrer et arrêter l'enregistrement des commandes graphiques dans un fichier PDF.

Comme précédemment, le fichier généré est sauvegardé dans le dossier du sketch.

Dans l'exemple suivant, nous allons réaliser un outil graphique, une sorte de pinceau numérique dont la taille du tracé dépend de la vitesse à laquelle nous déplaçons la souris. Au démarrage de l'application, dans le setup(), nous indiquons le début de l'enregistrement par la commande beginRecord() qui prend en paramètres le type d'export (pour l'instant Processing ne supporte que l'extension PDF) et le nom du fichier en second paramètre. Lorsqu'on appuie sur la touche ESPACE, l'enregistrement est stoppé et l'application s'arrête. Comme précédemment, le fichier généré est sauvegardé dans le dossier du sketch.

03_PDF_Detail

import processing.pdf.*;

void setup()
{
  size(400, 400);
  beginRecord(PDF, "Cercles.pdf");
}

void draw() {
  if (mousePressed)
  {
    float r = dist(pmouseX, pmouseY, mouseX, mouseY) + 5;
    ellipse(mouseX, mouseY, r, r);
  }
}

void keyPressed() {
    endRecord();
    exit();
}

La ligne suivante :

float r = dist(pmouseX, pmouseY, mouseX, mouseY) + 5;

... permet de calculer la vitesse de la souris grâce à la méthode dist et aux variables pmouseX, pmouseY et mouseX et mouseY. Nous ajoutons 5 pour ne pas avoir des cercles de rayon 0 sur l'écran (ce qui reviendrait à avoir des cercles invisibles).

La variable drag sert à savoir si l'utilisateur est en train de déplacer la souris en maintenant le clic appuyé, ce qui active à l'aide de draw() l'action de dessiner des cercles sous le pointeur de la souris.

Un générateur de livres

Au lieu de générer un document d'une seule page, nous allons à présent réaliser un livre de plusieurs pages. Nous allons créer dynamiquement un folioscope (http://fr.wikipedia.org/wiki/Folioscope)  dont chaque page représentera une image de l'animation à un instant donné. C'est la méthode nextPage() qui va créer une page vierge à chaque fois que cette instruction sera appelée durant l'enregistrement.

04_PDF_Folioscope_2

import processing.pdf.*;

PGraphicsPDF pdf;
float x = 0;
float y = 75;

void setup() {
  size(400, 150);
  smooth();
  pdf = (PGraphicsPDF) beginRecord(PDF, "Bulle.pdf");
}

void draw() {
  background(255);
  fill(0);
  ellipse(x, y, 30, 30);

  x = x + random(5);
  y = y + random(-5, 5);

  if (x - 30 > width) {
    endRecord();
    exit();
  }
  else{
    pdf.nextPage();
    }
}

Nous avons introduit la variable pdf pour stocker une référence au document que nous générons. Lorsque nous avons fini de dessiner une image dans draw(), nous passons à l'image suivante par la commande pdf.nextPage(). Le programme est conçu pour s'arrêter lorsque la bulle sort de l'écran. Après l'exécution du programme, le fichier sauvegardé du folioscope se trouve dans le dossier du sketch et porte le nom Bulle.pdf. En l'ouvrant, vous pourrez constater qu'il comporte 164 pages, chacune d'entre elles présentant notre balle en un instant donné de son mouvement dans l'espace de dessin.

Pixel versus vectoriel

Lorsque nous dessinons sur l'écran, un rectangle par exemple, nous remplissons les pixels d'une zone de l'écran avec une couleur particulière. Lorsque nous sauvegardons cette image dans un fichier, la première méthode consiste à utiliser des formats d'image particuliers (JPEG, GIF, TIFF par exemple) qui enregistrent individuellement chaque pixel qui compose l'illustration. Avec ce type de format, si nous voulons agrandir l'image, l'ordinateur sera dans l'impossibilité de créer des pixels intermédiaires et d'ajouter du détail, car il ne possède aucune information dans le fichier lui permettant d'extrapoler les modifications liées à cet agrandissement de formes.

En enregistrant la même image au format vectoriel, Processing ne va plus sauver chaque pixel un à un, mais plutôt les caractéristiques de chaque forme dessinée : sa forme, sa position et sa couleur. Ainsi, lorsque nous agrandissons l'image, l'ordinateur est capable de dessiner avec précision les détails d'une image qu'il n'aurait pas été possible de produire avec une image pixelisée.  Le pdf est un format de sauvegarde vectoriel. 

Importer les fonctionnalités PDF

Dans les exemples précédents, nous avons employé import processing.pdf.* qui permet d'importer la librairie relative à la création de documents PDF. Une librairie est un ensemble de fonctionnalités qui étend les possibilités de Processing et chaque fois que nous aurons à utiliser l'export PDF dans notre sketch, nous utiliserons cette commande d'importation.

Si jamais vous essayez d'utiliser les méthodes relatives à l'export PDF sans avoir importé la librairie, vous allez rencontrer des erreurs qui s'afficheront dans la console et le programme ne pourra démarrer. Au lieu de taper cette ligne de code, vous pouvez l'ajouter automatiquement en cliquant dans le menu Sketch > Import Library... > pdf.

Il y a une erreur de communication avec le serveur Booktype. Nous ne savons pas actuellement où est le problème.

Vous devriez rafraîchir la page.