Utilisation du traitement sur un serveur pour créer des images dans les coulisses

StackOverflow https://stackoverflow.com/questions/1889881

  •  19-09-2019
  •  | 
  •  

Question

La façon dont je vois la plupart des gens utilisent est pour dessiner une image directement sur un écran ou une page Web sur le côté client.

Comment un traitement d'utilisation pour créer une image sans une toile visuelle, puis enregistrez cette image dans un fichier?

Voici les étapes spécifiques que je suis intéressé par:

  1. Quelqu'un visite une page Web, ce qui fait que le programme de traitement pour commencer à courir
  2. Le programme de traitement travaillerait dans les coulisses pour créer une image, puis enregistrez-le sur un nom de fichier connu
  3. La page Web chargerait le nom de fichier connu (qui existe seulement après que le programme de traitement est exécuté -, comment la page Web peut savoir pour charger l'image quand il est fini)

Je suppose que le programme de traitement est en cours d'exécution sur un serveur (ce qui est contraire à la façon dont le traitement fonctionne en général), et le fichier sera stocké sur le serveur. Je suppose également un code dans le programme de traitement pour accélérer le nombre de fichiers qui sont créés -. Par exemple, il ne va pas créer une nouvelle image si une image existante a été créée dans les 5 minutes

Était-ce utile?

La solution

Je l'ai fait, en utilisant le traitement dans un Servlet pour rendre les images à la volée. Un problème que j'ai trouvé est que le traitement n'est pas thread-safe, donc je devais créer plusieurs instances de traitement et de les partager dans une file d'attente.

Voici une servlet qui rend Fractales Mandelbrot, à utiliser par Google Maps comme une superposition:

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.concurrent.LinkedBlockingQueue;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import processing.core.PApplet;

public class Tile extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static LinkedBlockingQueue<PApplet> pQueue = new LinkedBlockingQueue<PApplet>();

    private PApplet createPApplet() {
        PApplet p = new PApplet();
        p.init();
        p.size(256, 256);
        p.noLoop();
        p.textFont(p.createFont("Monospace", 8, true));
        p.stroke(0x22FFFFFF);
        p.colorMode(PApplet.HSB, 256, 1, 1);
        return p;
    }

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        PApplet p;

        if (pQueue.size() == 0) {
            p = createPApplet();
        } else {
            try {
                p = pQueue.take();
            } catch (InterruptedException e) {
                p = createPApplet();
            }
        }

        int zoom = Integer.parseInt(request.getParameter("z"));
        int tileX = Integer.parseInt(request.getParameter("x"));
        int tileY = Integer.parseInt(request.getParameter("y"));
        int tiles = 1 << zoom;

        p.loadPixels();

        final int N = 256;
        //final double inverse_N = 2.0 / 256;
        final double inverse_N = 2.0 / tiles / 256;
        int y = -1;

        while ((++y) < N) {
            double Civ = (double) (y + tileY * 256) * inverse_N - 1.0;
            for (int x = 0; x < N; x++) {
                double Crv = (double) (x + tileX * 256) * inverse_N - 1.5;

                double Zrv = Crv;
                double Ziv = Civ;

                double Trv = Crv * Crv;
                double Tiv = Civ * Civ;

                int i = 256;
                do {
                    Ziv = (Zrv * Ziv) + (Zrv * Ziv) + Civ;
                    Zrv = Trv - Tiv + Crv;

                    Trv = Zrv * Zrv;
                    Tiv = Ziv * Ziv;
                } while (((Trv + Tiv) <= 4.0) && (--i > 0));

                if (i == 0) {
                    p.pixels[x + y * N] = 0x00000000;
                } else {
                    p.pixels[x + y * N] = p.color(256 - i,1,1);
                }
            } // end foreach column
        }
        p.updatePixels();

        // render info
        p.fill(0x22000000);
        p.text("X: " + tileX + "\nY: " + tileY + "\nZ: " + zoom, 1, 13);
        p.fill(0x22FFFFFF);
        p.text("X: " + tileX + "\nY: " + tileY + "\nZ: " + zoom, 0, 12);

        p.line(0, 0, 0, 2);
        p.line(0, 0, 2, 0);
        p.line(255, 255, 255, 253);
        p.line(255, 255, 253, 255);

        // done
        p.loadPixels();
        BufferedImage img = new BufferedImage(256, 256,
                BufferedImage.TYPE_INT_ARGB);
        img.setRGB(0, 0, 256, 256, p.pixels, 0, 256);
        p.draw();

        response.setHeader("Content-Type", "image/png");
        ImageIO.write(img, "PNG", response.getOutputStream());

        try {
            pQueue.put(p);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

Autres conseils

Le traitement a été initialement écrit pour Java si je me souviens bien. Il a ensuite été porté à Javascript. Vous pouvez utiliser Java pour créer l'image.

Vous pouvez télécharger la version java de traitement et l'utiliser. Le traitement ne se limite pas à javascript. Comme Ben mentionne, il a commencé comme un programme java. La page d'accueil répertorie également les mises en œuvre en javascript, Clojure, rubis et scala.

Comment intégrer dans le reste de votre page Web dépend surtout de votre framework web.

Vous pouvez exécuter un moteur javascript sur le traitement du serveur et de l'utilisation comme vous utiliseriez dans le navigateur.

Voici comment vous pouvez installer l'interpréteur v8:

exécution Javascript v8 autonome du moteur.

Je ne suis pas tout à fait sûr si cela vous permet d'accéder aux fichiers, mais je suis sûr qu'il ya des façons de le faire.

Le traitement est Java. Le mode javaScript nouveau dans la version 2.0 (bêta x) est une intégration de processing.js une bibliothèque que le code de traitement « avant les processus » en javaScript. En fait, il y a moins de fonctionnalités et aucune bibliothèque de traitement est compatible. Ceci est de développeurs Traitement au sujet de ce changement dans la version 2.0:

  

support Java Applet est supprimé, à partir de 2,0 alpha 7. Il   tout simplement n'a pas de sens pour soutenir ces plus, compte tenu de notre   les priorités, le manque de soutien du navigateur web, ... tandis que les fabricants de navigateurs et   les fournisseurs de systèmes d'exploitation font applets d'autant plus difficile et peu attrayante est un   perdre la bataille ... En ce moment, en utilisant le traitement JS (ou traitement   1.5) est au contraire généralement une meilleure option pour les choses qui fonctionnent sur le web ...    (voir texte intégral)

Il y a dans cet article wiki Traitement comment utiliser PHP pour enregistrer les fichiers sur le serveur. Je ne sais pas si cela peut aider.

http://wiki.processing.org/w/Saving_files_to_a_web-server

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top