मैंने फ्लाई पर छवियों को प्रस्तुत करने के लिए एक सर्वलेट में प्रोसेसिंग का उपयोग करके ऐसा किया है। मुझे मिली एक समस्या यह है कि प्रसंस्करण थ्रेड-सुरक्षित नहीं है, इसलिए मुझे कई प्रोसेसिंग उदाहरण बनाना था और उन्हें कतार में साझा करना था।
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-05 14:27:17
क्यों आप कार्य के लिए प्रसंस्करण चयन कर रहे हैं, बजाय दे कार्य में मदद भाषा का चुनाव प्रत्यक्ष? –
मान्य सवाल। मुझे प्रसंस्करण पसंद है क्योंकि यह गैर-तुच्छ ग्राफिक्स को बनाने में आसान बनाता है। लेकिन मुझे लगता है कि मैं इसे नहीं देख रहा हूं, अगर यह सिस्टम के भीतर समझ में नहीं आता है (क्या मैं एक गोल छेद में एक वर्ग चरम जाम करने की कोशिश कर रहा हूं?) –
प्रस्तुत करने के लिए छवि और समय की जटिलता के आधार पर, आप कैनवास में सामने के अंत में छवि प्रस्तुत करने के लिए प्रसंस्करण.जेएस का उपयोग करने पर विचार कर सकते हैं। – JAMESSTONEco