14

我正在寻找一个开源 Java 库来为给定的 URL 生成缩略图。我需要捆绑此功能,而不是调用外部服务,例如Amazonwebsnapr

这篇文章中提到了http://www.webrenderer.com/ :服务器生成的网页截图,但它是一个商业解决方案。

我希望有一个基于 Java 的解决方案,但可能需要考虑执行诸如khtml2png 之类的外部进程,或集成诸如html2ps之类的东西。

有什么建议么?

4

4 回答 4

6

首先想到的是使用 AWT 来捕获屏幕抓取(参见下面的代码)。您可以查看捕获JEditorPaneJDIC WebBrowser控件或SWT 浏览器(通过AWT 嵌入支持)。后两者嵌入原生浏览器(IE、Firefox),所以引入依赖;JEdi​​torPane HTML 支持在 HTML 3.2 停止。可能这些都不适用于无头系统。

import java.awt.Component;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JLabel;

public class Capture {

    private static final int WIDTH = 128;
    private static final int HEIGHT = 128;

    private BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
            BufferedImage.TYPE_INT_RGB);

    public void capture(Component component) {
        component.setSize(image.getWidth(), image.getHeight());

        Graphics2D g = image.createGraphics();
        try {
            component.paint(g);
        } finally {
            g.dispose();
        }
    }

    private BufferedImage getScaledImage(int width, int height) {
        BufferedImage buffer = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g = buffer.createGraphics();
        try {
            g.drawImage(image, 0, 0, width, height, null);
        } finally {
            g.dispose();
        }
        return buffer;
    }

    public void save(File png, int width, int height) throws IOException {
        ImageIO.write(getScaledImage(width, height), "png", png);
    }

    public static void main(String[] args) throws IOException {
        JLabel label = new JLabel();
        label.setText("Hello, World!");
        label.setOpaque(true);

        Capture cap = new Capture();
        cap.capture(label);
        cap.save(new File("foo.png"), 64, 64);
    }

}
于 2008-10-04T14:12:08.810 回答
3

您实际上是在要求 Java 可访问的完整渲染引擎。就个人而言,我会省去麻烦并调用一个子进程。

否则,我会遇到这个纯 Java 浏览器:Lobo

于 2008-10-04T02:18:08.690 回答
0

是不是有一个 QA/测试网站/服务可以让你指定一个你想在某个浏览器(IE、FIREFOX、SAFARI 版本 x、y、z)中呈现的网页,他们会将快照邮寄回你。'

我不记得该服务了——也许其他经常使用 ajaxian 的开发人员可能还记得它?

于 2008-10-04T02:40:07.083 回答
0

尝试调用ImageMagick。我知道这不是 Java 解决方案,但您可以从 Java 调用它,甚至还有Java 前端,尽管我在这方面的成功较少。

于 2008-10-06T07:41:04.730 回答