Créer un fichier xml

Ce script permet, à partir de la webcam, de générer un fichier xml. Une classe a été créée pour l’occasion. Elle peut créer un fichier xml et d’écrire des éléments à partir de l’analyse d’une image.
Ce script a été produit pour une structure de xml bien précise. Pour l’écriture d’une autre structure il faudra modifier la classe...

Précédent | 16/27 | Suivant

La classe xml_writer

Voici la classe

voici le code:
// classe xml_writer
// crée un fichier xml
// methode :
// .initialise("nom_du_fichier") // ouvre l'écriture
// .ajouteFrame(image) // ajoute un frame à partir d'une image croppée au besoin
// .ajouteFrame(array) // ajoute un array de nombre
// .stoppe() // ferme le fichier (indispensable)

class xml_writer {

String nomdufichier;
int nb_images;
PImage frame;
boolean start;
PrintWriter output;

xml_writer(String tnom) {
  nomdufichier=tnom;
  start=false;
}

void initialise() {
  if (start==false) {
    output = createWriter(nomdufichier);
    output.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
    output.println("<ArrayOfEcranMatrix xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">");

    start=true;
    nb_images=0;
    println("fichier créé");
  }
}

void stoppe() {
  if (start==true) {
    output.flush(); // Writes the remaining data to the file
    output.println("</ArrayOfEcranMatrix>");
    output.close(); // Finishes the file
    println("fichier fermé");
  }
}

void ajouteFrame(int[] f) {
  println("ajout d'un frame depuis un array");
  if (start==true) {
    if (f.length > (44*28)-1) {
      output.println("  <EcranMatrix>");
      output.println("    <Bytes>");
      for (int i=0;i< 44*28;i++) {
        output.println("<int>"+ f[i] +"</int>");
      }
      output.println("    </Bytes>");
      output.println("    <Name>"+nb_images+"</Name>");
      output.println("  </EcranMatrix>");
      nb_images++;
    }
  }
}

void ajouteFrame(PImage tframe) {
  println("ajout d'un frame depuis une image");

  float ratio=44*1.0/28*1.0; // ratio de l'image
  float imaratio = tframe.width*1.0 / tframe.height*1.0;

  if (imaratio < ratio) {
    tframe.resize(44, 0);
  }
  else {
    tframe.resize(0, 28);
  }

  tframe.save("images/img_"+ nb_images +".tif");
  PImage finali=tframe.get(0, 0, 44, 28);

  if (start==true) {
    finali.loadPixels();

    output.println("  <EcranMatrix>");
    output.println("    <Bytes>");
    for (int i=0;i< 44*28;i++) {
      int pixelColor = finali.pixels[i];
      // Faster method of calculating r, g, b than red(), green(), blue()
      int r = (pixelColor >> 16) & 0xff;
      int g = (pixelColor >> 8) & 0xff;
      int b = pixelColor & 0xff;
      float luminance = 0.3*r + 0.59*g + 0.11*b;
      output.println("      <int>"+ int(luminance) +"</int>");
    }
    output.println("    </Bytes>");
    output.println("    <Name>"+nb_images+"</Name>");
    output.println("  </EcranMatrix>");
    nb_images++;
  }
  else {
    println("ecriture impossible, fichier non ouvert");
  }
}
}

Un exemple d’utilisation cette classe

Ce code envoie l’image de l’écran vers la classe, qui se charge de la réduire puis la coder dans le xml. Une image est aussi sauvée dans le dossier du script.

import processing.video.*;
Capture video;

xml_writer lefichier;

void setup(){
 size(640,480);
 
 video = new Capture(this, 640, 480, 15);
 lefichier = new xml_writer("test.xml");
 lefichier.initialise();
 background(255);
}

void draw(){
 set(0, 0, video);
}

public void keyPressed() {
 switch (key) {
   case ' ': lefichier.ajouteFrame(get()); break;
   case 'x': lefichier.stoppe(); exit(); break;
 }
}

public void captureEvent(Capture c) {
 c.read();
}

Une variante : exporter les images d’un film

Ici, on capture une image tous les 15eme de secondes et on les exporte. Pas d’action manuelle, le script se lance, fait son job et quitte.
Attention, la librairie video est assez difficile sur les fichiers à afficher. Certaines vidéos se lisent mal, crashent parfois. Tester différents types de compression. Je n’ai jamais réussi a être certain d’un format...

import processing.video.*;

Movie myMovie;
xml_writer lefichier;

void setup() {
 size(640, 480, P2D);
 background(0);
 frameRate(15);
 // Ne pas oublier de placer la vidéo dans le dossier du script
 // et de modifier la ligne ci-dessous
 myMovie = new Movie(this, "station.mov");
 myMovie.play();
 lefichier = new xml_writer("movie.xml");
 lefichier.initialise();
}

void movieEvent(Movie myMovie) {
 myMovie.read();
}

void draw() {
 image(myMovie, 0,0,width,height);
 if (myMovie.duration() == myMovie.time()) {
   lefichier.stoppe();
   exit();
 }
 else {
   lefichier.ajouteFrame(myMovie.get());
 }
}

void keyPressed() { // appuyer sur n'importe quelle touche quitte proprement
   lefichier.stoppe();
   exit();
}