views:

439

answers:

2

Not sure if this is even possible but I would like to add a control / object to a web page so that end users could click a button to capture what they are seeing in the browser so they can then submit the image back as part of a website review process.

I had thought ActiveX control but if we could use flash or silverlight that would be better.

Thanks for any suggestions.

+1  A: 

On Windows, you can press Alt + PrintScreen to copy the current window into the clipboard.

If you can use FireFox, I suggest to look at ScrapBook+.

If you need an automated process, try SWT. This library has a browser component which you can use to load some HTML, display it and copy the result into an image. The problem is to know when the browser has finished rendering the document. This code fragment should get you started:

public HTML2Png ()
{
    display = new Display();
    shell = new Shell(display);
    shell.setLayout(new FillLayout());
    shell.setSize(920, 700);
    shell.setLocation(10, 20);
    browser = new Browser(shell, SWT.NONE);

    browser.addProgressListener(new ProgressListener() {
        public void changed (ProgressEvent progressevent)
        {
        }

        public void completed (ProgressEvent progressevent)
        {
            boolean result = browser.execute("window.status=document.bgColor;");
            if (!result)
            {
                System.err.println("Executing script failed!");
                return;
            }

            System.out.println("Loading completed.");
            completed.set(true);
        }
    });
    browser.addPaintListener(new PaintListener() {
        public void paintControl (PaintEvent paintevent)
        {
            System.out.println(paintevent);
        }
    });
}

void createPNG (String url, String pngFile)
{
    System.out.println("Working on "+url);
    completed.set(false);

    shell.open();

    browser.setText("<html><body bgcolor=\"#FF00FF\"></body></html>");
    GC source = new GC (shell);
    int testColor = 0xFF00FF00;
    Image image = new Image (display, new Rectangle(0, 0, 1, 1));

    int i = 100;
    while (display.readAndDispatch() && i > 0)
    {
        source.copyArea(image, 0, 0);
        if (image.getImageData().getPixel(0,0) == testColor)
            break;
        sleep();
        i --;
    }

    if (i == 0)
        throw new RuntimeException("Loading took too long");

    completed.set(false);
    browser.setUrl(url);
    i = 50;
    while (!shell.isDisposed() && i > 0)
    {
        if (completed.get())
        {
            source.copyArea(image, 0, 0);
            if (image.getImageData().getPixel(0,0) != testColor)
            {
                image = new Image (display, browser.getClientArea());
                source.copyArea(image, 0, 0);

                //if (checkImage(image, testColor))
                    break;
            }

            i --;
        }

        while (display.readAndDispatch())
            ;

        sleep();
    }

    if (i == 0)
        throw new RuntimeException ("Loading timed out");

    ImageLoader io = new ImageLoader ();
    io.data = new ImageData[] { image.getImageData() };
    File f = new File (pngFile);
    io.save (f.getAbsolutePath(), SWT.IMAGE_PNG);

    System.out.println("Saved image "+f+", "+f.length()+" bytes");
}
Aaron Digulla
This would save it on the client's machine, but not submit it back to the server.
MusiGenesis
A: 

The Print Screen button? Anything else would be pretty difficult to do properly.

krdluzni