Использование обработки на сервере для создания изображений за кулисами

Как я вижу, большинство людей используют Processing для рисования изображения непосредственно на экране или веб-странице на стороне клиента.

Как можно использовать Обработку для создания изображения без визуального холста, а затем сохранить это изображение в файл?

Вот конкретные шаги, которые меня интересуют:

  1. Кто-то посещает веб-страницу, в результате чего запускается программа обработки.
  2. Программа обработки будет работать за кулисами, чтобы создать изображение, а затем сохранить его с известным именем файла.
  3. Веб-страница загрузит известное имя файла (которое существует только после запуска программы обработки - так как же веб-страница может узнать о загрузке изображения по завершении?)

Я предполагаю, что программа Processing запущена на сервере (что противоречит тому, как обычно работает Processing), и файл будет храниться на сервере. Я также предполагаю, что в программе обработки есть какой-то код, чтобы ограничить количество создаваемых файлов - например, он не будет создавать новое изображение, если существующее изображение было создано в течение 5 минут.


person David Koelle    schedule 11.12.2009    source источник
comment
Почему вы выбираете Обработку для задачи, а не позволяете задаче определять язык?   -  person Jonathan Feinberg    schedule 11.12.2009
comment
Правильный вопрос. Мне нравится обработка, потому что она позволяет легко создавать нетривиальную графику. Но я полагаю, что я не обязан этому, если это не имеет смысла в системе (я пытаюсь вставить квадратный стержень в круглое отверстие?)   -  person David Koelle    schedule 11.12.2009
comment
В зависимости от сложности изображения и времени на рендеринг вы можете рассмотреть возможность использования processing.js для рендеринга изображения в интерфейсе на холсте.   -  person JAMESSTONEco    schedule 25.11.2012


Ответы (5)


Я сделал это, используя обработку в сервлете для рендеринга изображений на лету. Проблема, которую я обнаружил, заключается в том, что обработка не является потокобезопасной, поэтому мне пришлось создать несколько экземпляров обработки и поделиться ими в очереди.

Вот сервлет, который отображает фракталы Мандельброта, которые будут использоваться Google Maps в качестве наложения:

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

}
person George Bashi    schedule 05.01.2010
comment
Спасибо, сейчас офлайн, ссылку удалил. - person George Bashi; 04.07.2013

Обработка изначально была написана для Java, если я правильно помню. Затем он был перенесен на Javascript. Вы можете использовать Java для создания изображения.

person Ben Shelock    schedule 11.12.2009

Вы можете загрузить java-версию Processing здесь и использовать ее. Обработка не ограничивается javascript. Как упоминает Бен, он начинался как java-программа. На домашней странице также перечислены реализации на javascript, clojure, ruby ​​и scala.

Как интегрировать это в остальную часть вашей веб-страницы, в основном зависит от вашего веб-фреймворка.

person Peter Recore    schedule 11.12.2009

Вы можете запустить движок javascript на сервере и использовать обработку так же, как если бы вы использовали ее в браузере.

Вот как можно установить интерпретатор v8:

Автономный запуск движка Javascript версии 8.

Я не совсем уверен, позволяет ли это получить доступ к файлам, но уверен, что есть способы сделать это.

person Georg Schölly    schedule 11.12.2009
comment
хотя это возможно, почему бы просто не запустить исходную (java) версию обработки? Или у версии javascript есть дополнительные функции? - person Peter Recore; 11.12.2009

Обработка - это Java. Режим javaScript, новый в версии 2.0 (beta x), представляет собой интеграцию processingjs библиотеки, которая «предварительно обрабатывает» код обработки в javaScript. На самом деле функций меньше, и ни одна библиотека обработки не совместима. Это от разработчиков Processing об этом изменении в версии 2.0:

Поддержка Java-апплетов удаляется, начиная с версии 2.0 alpha 7. Просто нет смысла поддерживать их больше, учитывая наши приоритеты, отсутствие поддержки веб-браузеров, ... в то время как производители браузеров и поставщики ОС усложняют апплеты. и непривлекательный - это проигрышная битва ... На данный момент использование Processing JS (или Processing 1.5), как правило, является лучшим вариантом для вещей, работающих в Интернете ... (см. полный текст)

В вики по обработке данных есть статья о том, как использовать PHP для сохранения файлов на сервере. Не уверен, что это поможет.

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

person v.k.    schedule 03.10.2012