문제

제가 볼 때 대부분의 사람들이 사용하는 방식은 처리 클라이언트 측에서 화면이나 웹 페이지에 직접 이미지를 그리는 것입니다.

처리를 사용하여 시각적 캔버스 없이 이미지를 만든 다음 이 이미지를 파일에 저장하려면 어떻게 해야 합니까?

제가 관심을 갖고 있는 구체적인 단계는 다음과 같습니다.

  1. 누군가가 웹페이지를 방문하여 처리 프로그램이 실행되기 시작합니다.
  2. 처리 프로그램은 배후에서 작동하여 이미지를 생성한 다음 알려진 파일 이름으로 저장합니다.
  3. 웹페이지는 알려진 파일 이름을 로드합니다(처리 프로그램이 실행된 후에만 존재합니다. 그렇다면 웹페이지가 완료되면 이미지를 로드하는 것을 어떻게 알 수 있습니까?)

나는 프로세싱 프로그램이 서버에서 실행되고 있고(이는 프로세싱이 일반적으로 작동하는 방식과 반대임) 파일이 서버에 저장될 것이라고 가정합니다.또한 생성되는 파일 수를 조절하기 위해 처리 프로그램의 일부 코드를 가정합니다. 예를 들어 기존 이미지가 5분 이내에 생성된 경우 새 이미지를 생성하지 않습니다.

도움이 되었습니까?

해결책

나는 서블릿의 처리를 사용하여 즉시 이미지를 렌더링함으로써 이 작업을 수행했습니다.제가 발견한 문제는 처리가 스레드로부터 안전하지 않기 때문에 여러 개의 처리 인스턴스를 생성하고 이를 대기열에서 공유해야 한다는 것입니다.

다음은 Google 지도에서 오버레이로 사용할 Mandelbrot 프랙탈을 렌더링하는 서블릿입니다.

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

}

다른 팁

내가 올바르게 기억한다면 처리는 원래 Java용으로 작성되었습니다.그런 다음 Javascript로 이식되었습니다.Java를 사용하여 이미지를 만들 수 있습니다.

처리의 Java 버전을 다운로드할 수 있습니다. 여기 그리고 그것을 사용하십시오.처리는 자바스크립트에만 국한되지 않습니다.Ben이 언급했듯이 Java 프로그램으로 시작되었습니다.홈페이지에는 javascript, clojure, ruby ​​및 scala 구현도 나열되어 있습니다.

이를 웹 페이지의 나머지 부분에 통합하는 방법은 주로 웹 프레임워크에 따라 다릅니다.

서버에서 자바스크립트 엔진을 실행하고 브라우저에서 사용하는 것처럼 처리를 사용할 수 있습니다.

v8 인터프리터를 설치하는 방법은 다음과 같습니다.

v8 Javascript Engine을 독립형으로 실행합니다.

이것이 파일에 접근할 수 있게 해주는지는 잘 모르겠지만, 그렇게 할 수 있는 방법이 있다고 확신합니다.

처리는 Java입니다.2.0(베타 x)의 새로운 기능인 JavaScript 모드는 처리 중 처리 코드를 javaScript로 "사전 처리"하는 라이브러리입니다.실제로 기능이 적고 호환되는 처리 라이브러리가 없습니다.2.0의 이러한 변경 사항에 대해 처리 개발자가 보낸 내용은 다음과 같습니다.

2.0 알파 7부터 Java 애플릿 지원이 제거됩니다.우리의 우선 순위, 웹 브라우저 지원 부족, ...브라우저 제조업체와 OS 공급 업체는 애플릿을 더 어렵고 매력적이지 않은 것은 패배하는 전투입니다 ...현재, 처리 JS (또는 처리 1.5)를 사용하는 대신 웹에서 실행되는 것들에 대한 더 나은 옵션입니다 ... (전문 보기)

PHP를 사용하여 파일을 서버에 저장하는 방법에 대한 처리 위키 문서가 있습니다.도움이 될지 확실하지 않습니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top