2009-12-11 10 views
5

Ja widzę większość ludzi używa Processing jest do rysowania obrazu bezpośrednio na ekranie lub na stronie internetowej po stronie klienta.Korzystanie przetwarzania na serwerze do tworzenia obrazów za kulisami

Jak wykorzystać Processing, aby utworzyć obraz bez wizualnego płótnie, a następnie zapisać ten obraz do pliku?

Oto konkretne kroki Jestem zainteresowany:

  1. ktoś odwiedza stronę internetową, która powoduje, że program tworzenie zacząć biegać
  2. program przetwarzania będzie działać za kulisami, aby utworzyć image, a następnie zapisz go pod znanym plikiem.
  3. Strona załaduje znaną nazwę pliku (która istnieje dopiero po uruchomieniu programu przetwarzania) - tak, jak strona internetowa może załadować obraz po jego zakończeniu?)

jestem przy założeniu, że program Obróbka jest uruchomiony na serwerze (co jest sprzeczne jak tworzenie zwykle działa), a plik zostanie zapisany na serwerze. Zakładam też, że w programie Processing jest jakiś kod, który ogranicza liczbę tworzonych plików - na przykład nie tworzy nowego obrazu, jeśli istniejący obraz został utworzony w ciągu 5 minut. jeśli dobrze pamiętam

+0

Czemu wybiera przetwórcze w ramach zadania, zamiast pozwolić zadanie pomóc skierować Wybór języka? –

+1

Ważne pytanie. Lubię przetwarzanie, ponieważ ułatwia tworzenie nietrywialnych grafik. Ale przypuszczam, że nie jestem do tego zobowiązany, jeśli nie ma to sensu w systemie (czy próbuję zaciąć kwadratowy kołek w okrągłym otworze?) –

+0

W zależności od złożoności obrazu i czasu renderowania, może rozważyć użycie przetwarzania.js, aby renderować obraz z przodu w obszarze roboczym. – JAMESSTONEco

Odpowiedz

10

Zrobiłem to, używając przetwarzania w serwecie, aby renderować obrazy w locie. Problemem, który znalazłem jest to, że przetwarzanie nie jest bezpieczne dla wątków, więc musiałem utworzyć wiele instancji przetwarzania i udostępnić je w kolejce.

Oto aplet który renderuje fraktale Mandelbrota, które mają być używane przez Google Maps jako nakładka:

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

} 
+0

Twój link demo to 404. – enobrev

+0

Dzięki, jest teraz offline, usunąłem link. –

2

tworzenie został pierwotnie napisany w języku Java. Został następnie przeniesiony do Javascript. Możesz użyć Javy do stworzenia obrazu.

0

Można uruchomić silnik JavaScript w przetwarzaniu serwer i użyj po prostu jak chcesz go używać w przeglądarce.

Oto w jaki sposób można zainstalować interpreter V8

Running v8 Javascript Engine standalone.

Nie jestem pewien, czy ta pozwala na dostęp do plików, ale jestem pewien, że istnieją sposoby, aby to zrobić.

+0

gdy jest to możliwe, dlaczego nie uruchomić oryginalnej wersji (java)? Czy wersja javascript ma dodatkowe funkcje? –

1

Można pobrać wersję java przetwarzania here i używać. Przetwarzanie nie jest ograniczone do javascript. Jak wspomina Ben, zaczęło się to jako program java. Strona domowa zawiera również listę implementacji w javascript, clojure, ruby ​​i scala.

Jak zintegrować to z resztą strony internetowej, zależy głównie od struktury sieci.

0

Processing jest Java. Tryb javaScript, nowy w wersji 2.0 (beta x), jest integracją biblioteki processingjs, która "przetwarza wstępnie" przetwarzając kod na javaScript. W rzeczywistości jest mniej funkcji i żadna biblioteka przetwarzania nie jest kompatybilna. To jest od deweloperów przetwarzania o tej zmianie w 2.0:

Obsługa apletu Java jest usuwana, począwszy od 2.0 alpha 7.Po prostu nie ma sensu ich obsługiwać, mając na uwadze nasze priorytety , brak obsługi przeglądarek internetowych, ... podczas gdy twórcy przeglądarek i dostawcy systemów operacyjnych sprawiają, że aplety stają się jeszcze trudniejsze i mniej atrakcyjne, ponieważ przegrywają bitwę o ... w tej chwili, z wykorzystaniem przetwarzania JS (lub przetwarzanie 1,5) jest natomiast generalnie lepszym rozwiązaniem dla rzeczy, które działają w sieci ... (see full text)

jest to artykuł w przetwórstwie wiki na temat korzystania z PHP zapisz pliki na serwerze. Nie jestem pewien, czy to może pomóc.

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

+0

dzięki, nie mogę utworzyć 3 linków. –

Powiązane problemy