باستخدام المعالجة على خادم لإنشاء صور وراء الكواليس

StackOverflow https://stackoverflow.com/questions/1889881

  •  19-09-2019
  •  | 
  •  

سؤال

الطريقة التي أرى معظم الناس استخدامها يعالج هو رسم صورة مباشرة على شاشة أو صفحة ويب على جانب العميل.

كيف يمكن للمرء استخدام المعالجة لإنشاء صورة دون قماش مرئي، ثم احفظ هذه الصورة على ملف؟

فيما يلي خطوات محددة أنا مهتم:

  1. يقوم شخص ما بزيارة صفحة ويب، مما يؤدي إلى بدء تشغيل برنامج المعالجة قيد التشغيل
  2. سيعمل برنامج المعالجة وراء الكواليس لإنشاء صورة، ثم احفظه على اسم ملف معروف
  3. سيتم تحميل صفحة الويب اسم الملف المعروف (والذي يوجد فقط بعد تشغيل برنامج المعالجة - لذلك، كيف يمكن صفحة الويب أن تعرف تحميل الصورة عند الانتهاء؟)

أفترض أن برنامج المعالجة يعمل على خادم (يتعارض مع كيفية عمل المعالجة عادة)، وسيتم تخزين الملف على الخادم. أنا أيضا افتراض بعض التعليمات البرمجية في برنامج المعالجة لخنق عدد الملفات التي تم إنشاؤها - على سبيل المثال، لن تقوم بإنشاء صورة جديدة إذا تم إنشاء صورة موجودة في غضون 5 دقائق.

هل كانت مفيدة؟

المحلول

لقد فعلت هذا، باستخدام المعالجة في Servlet لجعل الصور على الطيران. مشكلة وجدت هي أن المعالجة ليست آمنة للخيط، لذلك اضطررت إلى إنشاء مثيلات معالجة متعددة ومشاركتها في قائمة انتظار.

إليك Servlet الذي يجعل Fractals Mandelbrot، لاستخدامه من قبل خرائط 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 إذا كنت أتذكر بشكل صحيح. ثم تم استئناف جافا سكريبت. يمكنك استخدام Java لإنشاء الصورة.

يمكنك تنزيل إصدار جافا من المعالجة هنا واستخدام ذلك. المعالجة لا تقتصر على جافا سكريبت. كما يذكر بن، بدأت كبرنامج Java. كما تسرد الصفحة الرئيسية التطبيقات في جافا سكريبت وجلد روبي و Scala.

كيفية دمج هذا في بقية صفحات الويب الخاصة بك يعتمد في الغالب على إطار الويب الخاص بك.

يمكنك تشغيل محرك JavaScript AA على الخادم واستخدام المعالجة تماما مثلما كنت تستخدمه في المتصفح.

إليك وكيف يمكنك تثبيت مترجم V8:

تشغيل محرك JavaScript V8 المستقل.

لست متأكدا تماما إذا كان هذا يسمح لك بالوصول إلى الملفات، لكنني متأكد من وجود طرق للقيام بذلك.

المعالجة هي جافا. وضع JavaScript، الجديد في 2.0 (Beta X) هو دمج المعالجات مكتبة "العمليات المسبقة" معالجة رمز في جافا سكريبت. في الواقع هناك ميزات أقل ولا توجد مكتبة المعالجة غير متوافقة. هذا من قبل معالجة المطورين حول هذا التغيير في 2.0:

يتم إزالة دعم تطبيق Java Applet، بدءا من 2.0 ألفا 7.، فهذا ببساطة لا معنى لدعم هذه بعد الآن، بالنظر إلى أولوياتنا، ونقص دعم متصفح الويب، ... في حين أن صناع المستعرض ونظام التشغيل البقر يصنعون تطبيقات جميع أكثر صعوبة وغير شاذة هي معركة خاسرة ... في الوقت الراهن، تستخدم المعالجة JS (أو المعالجة 1.5) بدلا من ذلك بشكل عام خيار أفضل للأشياء التي تعمل على الويب ... (انظر النص الكامل)

هناك هذه المقالة في معالجة Wiki حول كيفية استخدام PHP لحفظ الملفات إلى الخادم. لست متأكدا مما إذا كان يمكن أن تساعد.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top