html – 在服务器上使用Processing在后台创建图像

我看到大多数人使用Processing的方式是将图像直接绘制到客户端的屏幕或网页上.

如何使用Processing在没有可视画布的情况下创建图像,然后将此图像保存到文件中?

以下是我感兴趣的具体步骤:

>有人访问网页,导致Processing程序开始运行
> Processing程序将在幕后工作以创建图像,然后将其保存为已知文件
>网页将加载已知的文件名(仅在处理程序运行后才存在) – 因此,网页如何知道在图像完成后加载图像?

我假设Processing程序在服务器上运行(这与Processing通常的工作方式相反),文件将存储在服务器上.我还假设在Processing程序中有一些代码来限制创建的文件数量 – 例如,如果在5分钟内创建了现有图像,它将不会创建新图像.

最佳答案
我已经这样做了,使用Servlet中的Processing来动态渲染图像.
我发现的一个问题是Processing不是线程安全的,所以我不得不创建多个Processing实例并在队列中共享它们.

这是一个呈现Mandelbrot分形的servlet,供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);
                }
            } // end foreach column
        }
        p.updatePixels();

        // render info
        p.fill(0x22000000);
        p.text("X: " + tileX + "\nY: " + tileY + "\nZ: " + zoom,13);
        p.fill(0x22FFFFFF);
        p.text("X: " + tileX + "\nY: " + tileY + "\nZ: " + zoom,12);

        p.line(0,2);
        p.line(0,2,0);
        p.line(255,255,253);
        p.line(255,253,255);

        // done
        p.loadPixels();
        BufferedImage img = new BufferedImage(256,BufferedImage.TYPE_INT_ARGB);
        img.setRGB(0,p.pixels,256);
        p.draw();

        response.setHeader("Content-Type","image/png");
        ImageIO.write(img,"PNG",response.getoutputStream());

        try {
            pQueue.put(p);
        } catch (InterruptedException e) {
            e.printstacktrace();
        }
    }

}

相关文章

vue阻止冒泡事件 阻止点击事件的执行 &lt;div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些