Uso del procesamiento en el servidor para crear imágenes detrás de las escenas
-
19-09-2019 - |
Pregunta
La forma en que veo la mayoría de la gente utiliza Procesamiento rel="noreferrer"> es para dibujar una imagen directamente en una pantalla o una página web en el cliente.
¿Cómo se podría utilizar procesadores para crear una imagen sin un lienzo visual, a continuación, guardar esta imagen en un archivo?
Estos son los pasos específicos que estoy interesado:
- Un usuario visita una página web, lo que hace que el programa de procesamiento de empezar a correr
- El programa de procesamiento sería trabajar detrás de las escenas para crear una imagen, a continuación, guardarlo en un nombre de archivo conocido
- En la página web se cargue el nombre conocido (que sólo existe después de que el programa de procesamiento se ejecuta - así, ¿cómo puede conocer la página web para cargar la imagen cuando esté terminado)
Estoy asumiendo que el programa de procesamiento se ejecuta en un servidor (que es contrario a la forma de procesamiento por lo general funciona), y el archivo se almacenará en el servidor. También estoy asumiendo un cierto código en el programa de procesamiento de estrangular el número de archivos que se crean -. Por ejemplo, no va a crear una nueva imagen si una imagen existente se creó dentro de los 5 minutos
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 apoyoJava 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.