5

ほとんどの人がProcessingを使用しているのは、クライアント側の画面またはWebページに画像を直接描画するためです。

処理を使用してビジュアルキャンバスなしで画像を作成し、この画像をファイルに保存するにはどうすればよいでしょうか。

これが私が興味を持っている特定のステップです:

  1. 誰かがWebページにアクセスすると、Processingプログラムの実行が開始されます
  2. 処理プログラムは、舞台裏で画像を作成し、それを既知のファイル名で保存します。
  3. Webページは既知のファイル名をロードします(これはProcessingプログラムの実行後にのみ存在します-それで、Webページは画像が終了したときに画像をロードすることをどのように知ることができますか?)

私は、Processingプログラムがサーバー上で実行されており(これはProcessingの通常の動作とは逆です)、ファイルはサーバーに保存されると想定しています。また、処理プログラムに、作成されるファイルの数を制限するコードがあると想定しています。たとえば、既存のイメージが5分以内に作成された場合、新しいイメージは作成されません。

4

5 に答える 5

10

私はこれを行い、サーブレットでの処理を使用してその場で画像をレンダリングしました。私が見つけた問題は、Processingがスレッドセーフではないため、複数のProcessingインスタンスを作成し、それらをキューで共有する必要があったことです。

これは、Googleマップでオーバーレイとして使用されるマンデルブロフラクタルをレンダリングするサーブレットです。

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

}
于 2010-01-05T14:27:17.223 に答える
2

私が正しく覚えていれば、処理は元々Java用に書かれていました。その後、Javascriptに移植されました。Javaを使用してイメージを作成できます。

于 2009-12-11T18:15:00.687 に答える
1

ここからJavaバージョンのProcessingをダウンロードして使用できます。処理はjavascriptに限定されません。ベンが言及するように、それはJavaプログラムとして始まりました。ホームページには、javascript、clojure、ruby、scalaの実装もリストされています。

これをWebページの残りの部分に統合する方法は、主にWebフレームワークによって異なります。

于 2009-12-11T18:38:31.923 に答える
0

サーバー上でJavaScriptエンジンを実行し、ブラウザーで使用するのと同じように処理を使用できます。

v8インタープリターをインストールする方法は次のとおりです。

v8JavascriptEngineをスタンドアロンで実行します。

これでファイルにアクセスできるかどうかはよくわかりませんが、これを行う方法はあると思います。

于 2009-12-11T18:37:47.427 に答える
0

処理はJavaです。2.0(beta x)の新機能であるjavaScriptモードは、処理コードをjavaScriptに「前処理」するライブラリであるprocessingjsの統合です。実際には機能が少なく、互換性のある処理ライブラリはありません。これは、2.0でのこの変更に関するProcessing開発者からのものです。

Java Appletのサポートは、2.0 alpha 7から削除されます。優先順位、Webブラウザーのサポートの欠如などを考えると、これらをサポートすることはもはや意味がありません。ブラウザーメーカーとOSベンダーは、アプレットをさらに難しくしています。魅力を失うことは敗戦です...現時点では、代わりにProcessing JS(またはProcessing 1.5)を使用する方が、一般的にWeb上で実行されるものに適しています... (全文を参照)

PHPを使用してファイルをサーバーに保存する方法については、Processingwikiにこの記事があります。それが役立つかどうかわからない。

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

于 2012-10-03T22:57:57.807 に答える