質問
のんほとんどの人は使用 処理 は画像上に直接画面またはウェブページにクライアント側で行われます。
はどのように一つの処理を無視覚的なキャンバスの保存この画像ファイル?
ここでの具体的なステップに興味がある私にとって:
- 人を訪問、ホームページから引き起こされる処理プログラムを開始
- の処理プログラムが作品の裏方作成の画像を保存で知られるファイル名
- ホームページが負荷に知られるファイル名だけ存在する後処理プログラムが実行では、どうすれば今のホームページから画像を読み込むのに用いる、時で終了?)
私はその処理プログラムしないようにするには、サーバーで逆にどのように処理、通常の作品、ファイルを保存することは、サーバーにコピーします。私はもともコードの処理プログラムをスロットル数のファイルを作成した、例えば、新規作成の場合、イメージ、既存のイメージを作成した5分です。
解決
私はその場で画像をレンダリングするためにサーブレットの処理を使用して、これをやりました。 私が見つけた問題は、処理はスレッドセーフではありませんので、私は複数の処理インスタンスを作成し、キューにそれらを共有しなければならなかったということです。
ここで、オーバーレイとして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();
}
}
}
他のヒント
処理はもともとJavaのために書かれました。次に、それをJavaScriptに移植されました。あなたは、イメージを作成するためにJavaを使用することができます。
あなたのWebページの残りの部分にこれを統合する方法は、お使いのWebフレームワークに主に依存します。
あなたは、ブラウザでそれを使用したいだけのようサーバーおよび使用処理のJavaScriptエンジンを実行することができます。
ここでは、V8インタプリタをインストールすることができます方法は次のとおりです。
私は、これはあなたがファイルにアクセスすることを可能にする場合はかなりわからないんだけど、私はこれを行うための方法があると確信しています。
処理は、Javaです。 2.0(ベータX)における新しいJavaScriptモードは、 processingjs のライブラリ「前処理」の処理コードの統合にありますJavaScriptの。実際にはあまり機能し、どれも処理ライブラリに互換性があるがあります。これは2.0で、この変更について開発者を処理するからです。
Javaアプレットのサポートは2.0アルファ7それを開始して、除去されています 単に私たちの与えられた、もはやこれらをサポートしても意味がありません。 優先順位は、Webブラウザのサポートの欠如、...しばらくブラウザメーカー、 OSベンダーは、アプレットのすべてのより困難と魅力であることを確認してください 処理JS(または処理を使用して、現時点での戦いを失います... 1.5)の代わりに、一般的にウェブ上で動作するもののためのより良いオプションです... (全文を参照)する
サーバーにファイルを保存するためにPHPを使用する方法についての処理のwikiで、この資料があります。それは助けることができるかどうかわからない。