Domanda

Il mio modo di vedere la maggior parte delle persone usano è per disegnare un'immagine direttamente su uno schermo o una pagina web sul lato client.

Come sarebbe uno utilizzare l'elaborazione per creare un'immagine senza una tela visiva, quindi salvare l'immagine in un file?

Ecco i passaggi specifici Sono interessato a:

  1. Un utente visita una pagina web, che fa sì che il programma di elaborazione per avviare l'esecuzione
  2. Il programma di elaborazione dovrebbe lavorare dietro le quinte per creare un'immagine, quindi salvarlo con un nome noto
  3. La pagina web dovrebbe caricare il nome del file conosciuti (che solo esiste dopo il programma di elaborazione è gestito -? Così, come può la pagina web sapere per caricare l'immagine quando è finito)

Sto assumendo che il programma di elaborazione è in esecuzione su un server (che è in contrasto con il funzionamento di solito Processing), e il file verrà memorizzato sul server. Sto anche assumendo po 'di codice nel programma di elaborazione di strozzare il numero di file che vengono creati -., Ad esempio, non creerà una nuova immagine se un'immagine esistente è stato creato entro 5 minuti

È stato utile?

Soluzione

Ho fatto questo, utilizzando l'elaborazione in un servlet per il rendering di immagini al volo. Un problema che ho trovato è che la lavorazione non è thread-safe, quindi ho dovuto creare più istanze di trasformazione e condividerli in una coda.

Ecco una servlet che rende frattali di Mandelbrot, per essere utilizzato da Google Maps come un overlay:

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

}

Altri suggerimenti

Lavorazione è stato originariamente scritto per Java se non ricordo male. E 'stato poi portato su Javascript. Si potrebbe utilizzare Java per creare l'immagine.

È possibile scaricare la versione Java di lavorazione qui e usare quella. Elaborazione non è limitato a JavaScript. Come Ben menziona, è iniziato come un programma Java. La homepage elenca anche le implementazioni in javascript, clojure, rubino, e Scala.

Come integrare questo nel resto della tua pagina web principalmente dipende dal vostro framework web.

È possibile eseguire un un motore javascript sul trattamento del server e l'uso proprio come usereste nel browser.

Ecco come è possibile installare l'interprete v8:

esecuzione JavaScript V8 motore autonomo.

Io non sono molto sicuro se questo consente di accedere ai file, ma sono sicuro che ci sono modi per farlo.

Lavorazione è Java. La modalità javaScript nuovo in 2.0 (beta x) è un'integrazione di processingjs una libreria che "pre processi" codice di elaborazione in javascript. In realtà c'è meno caratteristiche e biblioteca nessuna elaborazione è compatibile. Questo è dalla lavorazione sviluppatori su questo cambiamento di 2.0:

  Supporto

Applet Java è stato rimosso, a partire dal 2.0 alpha 7.   semplicemente non ha senso per sostenere più questi, data la nostra   le priorità, la mancanza di supporto per il browser web, ... mentre produttori di browser e   produttori di sistemi operativi rendono applet più difficile e poco attraente è un   perdendo la battaglia ... Al momento, utilizzando l'elaborazione JS (o Processing   1.5) è invece generalmente una scelta migliore per le cose che girano sul web ...    (vedi testo completo)

C'è questo articolo in Processing wiki su come utilizzare PHP per salvare i file sul server. Non so se può aiutare.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top