Uso del procesamiento en el servidor para crear imágenes detrás de las escenas

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

  •  19-09-2019
  •  | 
  •  
¿Fue útil?

Solución

He hecho esto, el uso de procesamiento en un servlet para representar imágenes sobre la marcha. Un problema que encontramos es que el procesamiento no es seguro para subprocesos, así que tuve que crear varias instancias de proceso y compartirlas en una cola.

Aquí hay un servlet que hace que los fractales de Mandelbrot, para ser utilizado por Google Maps como una superposición:

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();
        }
    }

}

Otros consejos

Tratamiento fue escrito originalmente para Java si no recuerdo mal. Entonces fue portado a Javascript. Se podría utilizar Java para crear la imagen.

Se puede descargar la versión Java de procesamiento aquí y usar eso. El proceso no se limita a javascript. Como se menciona Ben, que comenzó como un programa Java. La página de inicio también enumera las implementaciones en JavaScript, clojure, rubí, y Scala.

¿Cómo integrar esto en el resto de su página web depende principalmente de su framework de desarrollo web.

Usted podría funcionar un motor de javascript en el procesamiento del servidor y el uso al igual que tendría que utilizar en el navegador.

Así es como se puede instalar el intérprete v8:

Correr V8 Javascript independiente del motor.

No estoy muy seguro de si esto le permite acceder a los archivos, pero estoy seguro de que hay maneras de hacer esto.

El procesamiento es Java. El modo de Javascript, nuevo en 2,0 (beta x) es una integración de código de procesamiento processingjs una biblioteca que "pre procesos" en javascript. En realidad hay menos características y biblioteca de procesamiento ninguno es compatible. Esto es desde el procesamiento de los desarrolladores acerca de este cambio en 2.0:

  está siendo retirado apoyo

Java Applet, a partir de 2,0 alpha 7.   simplemente no tiene sentido apoyar a éstos más, teniendo en cuenta nuestra   prioridades, la falta de soporte de los navegadores web, ... mientras que los fabricantes de navegadores y   proveedores de sistemas operativos hacen applets más difícil y poco atractiva es una   perdiendo la batalla ... Por el momento, el uso de Procesamiento de JS (o procesamiento   1.5) es en cambio generalmente una mejor opción para las cosas que se ejecutan en la web ...   rel="nofollow">

No es este artículo en el Procesamiento de wiki sobre cómo usar PHP para guardar archivos en el servidor. No está seguro de si puede ayudar.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top