好库网 好库网首页 | 我的好库
好饱的专栏

Java实现生成网站快照缩略图片

发布者:好饱
发布日期:2011/5/19 15:27:03   更新日期:2011/5/19 17:26:41
阅读次数:6157
评分:4.80
介绍:许多网站提供了显示网站快照缩略图片的功能,其实质是HTML转换到JPG,本文提供的代码演示了截取google网站快照,效果不是特别好,但作为普通的应用已经足够了。
正文:

 

许多网站提供了显示网站快照缩略图片的功能,其实质是HTML转换到JPG,本文提供的代码演示了截取google网站快照,效果不是特别好,但作为普通的应用已经足够了。

import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;


/**
 * HTML2JPG,HTML页面转图片的实现方法。
 * 
 * @author 老紫竹(好库网,okbase.net)
 */
public class Test extends JFrame {


  public Test(String url, File file) throws Exception {
    JEditorPane editorPane = new JEditorPane();
    editorPane.setEditable(false);
    editorPane.setPage(url);
    JScrollPane jsp = new JScrollPane(editorPane);
    getContentPane().add(jsp);
    this.setLocation(0, 0);
    this.setVisible(true); // 如果这里不设置可见,则里面的图片等无法截取
    
    // 如果不延时,则图片等可能没有时间下载显示
    // 具体的秒数需要根据网速等调整
    Thread.sleep(5 * 1000);


    setSize(10000, 10000);


    pack();
    // BufferedImage image = new BufferedImage(editorPane.getWidth(),
    // editorPane.getHeight(), BufferedImage.TYPE_INT_RGB);
    BufferedImage image = new BufferedImage(editorPane.getWidth(), editorPane.getHeight(),
        BufferedImage.TYPE_INT_RGB);
    Graphics2D graphics2D = image.createGraphics();
    editorPane.paint(graphics2D);
    
    BufferedImage image1 = resize(image, 600, 400);


    ImageIO.write(image1, "jpg", file);
    dispose();
  }


  public static void main(String[] args) throws Exception {
    new Test("http://www.google.com", new File("d:/file.jpg"));
  }


  public static BufferedImage resize(BufferedImage source, int targetW, int targetH) {
    // targetW,targetH分别表示目标长和宽
    int type = source.getType();
    BufferedImage target = null;
    double sx = (double) targetW / source.getWidth();
    double sy = (double) targetH / source.getHeight();
    // 这里想实现在targetW,targetH范围内实现等比缩放。如果不需要等比缩放
    // 则将下面的if else语句注释即可
    if (sx > sy) {
      sx = sy;
      targetW = (int) (sx * source.getWidth());
      // } else {
      // sy = sx;
      // targetH = (int) (sy * source.getHeight());
    }
    if (type == BufferedImage.TYPE_CUSTOM) { // handmade
      ColorModel cm = source.getColorModel();
      WritableRaster raster = cm.createCompatibleWritableRaster(targetW, targetH);
      boolean alphaPremultiplied = cm.isAlphaPremultiplied();
      target = new BufferedImage(cm, raster, alphaPremultiplied, null);
    } else
      target = new BufferedImage(targetW, targetH, type);
    Graphics2D g = target.createGraphics();
    // smoother than exlax:
    g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
    g.dispose();
    return target;
  }
}
注意,里面的 this.setVisible(true);
这句话如果运行在一些不能显示图形界面的机器上,请屏蔽掉它。
不过如果没有这句话,网页里的图片就不能被截取了。

 


评论 [发表评论]
账号 密码 还没帐号呢,现在注册一个?

免责声明:好库网所展示的信息由买卖双方自行提供,其真实性、准确性和合法性由信息发布人负责。好库网不提供任何保证,并不承担任何法律责任。