simplehtmldom类和图像

时间:2010-08-29 04:21:42

标签: php class

我正在使用simplehtmldom类来获取网站上的所有图片,

我正在尝试获取simplehtmldom返回的图像的宽度和高度,

我想在这里完成的是,如果图像宽度小于50像素,我不希望显示图像。

我尝试了getimagesize(),但是由于图像数量的原因,我认为它常常会超时。

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:1)

使用getimagesize()非常慢,特别是如果您正在抓取网站并获得许多图片。 PHP必须先下载每个图像的全部内容,然后才能将数据传递给getimagesize(),因此,如果您正在处理(例如)大型照片库,则每个图像可能会下载许多兆字节。

您可以采取一些措施来加快这一进程:

  1. 检查<img>标记的高度/宽度属性,只捕获大于50的图像。由于网页创建者可能会拉伸或缩小图像,因此可能不一定准确。但它可以帮助您免于下载精确尺寸的小图像。

  2. 不是直接使用getimagesize()获取图像,而是可以尝试仅获取每个图像的前几百个字节,其中包含图像标题信息。对于GIF / JPEG图像,高度/宽度将非常接近文件的开头,因此您可以节省文件传输开销。

  3. 增加脚本的执行时间。获取所有图像自然会是一个相当缓慢的过程,你最有可能遇到PHP的max_execution_time

  4. 评论后续:

    好吧,如果没有高度/宽度,那么你可以直接跳到图像(或图像的第一位)并直接提取高度/宽度。检查标签中的高度/宽度只是为了省去必须首先获取图像的麻烦。

    至于从HTML中提取高度/宽度,只需在使用SimpleHTMLDOM找到->getAttribute('width')标记后使用->getAttribute('height')<img>调用即可。像这样:

    $dom = file_get_html('http://example.com/somepage.html');
    $images = $dom->find('img');
    
    foreach($images as $img) {
        $h = $img->getAttribute('height');
        $w = $img->getAttribute('width');
    
        if (isnull($h) || (isnull($w)) {
           // height and/or width not available in tag, so fetch image and get size that way
           $h = ...
           $w = ...
        }
    
        if (($h >= 50) && ($w >= 50)) {
            // image is bigger than 50x50, so display it...
        }
    }
    

    如果你剪切/粘贴它,这可能是行不通的,只是做了我的头脑,但它应该足以让你开始。

答案 1 :(得分:0)

由于您没有发布正在使用的任何源代码,因此很难帮助您。

您应该知道高度和宽度属性不一定在HTML中,因此simplehtmldom对您没用。你需要为此使用别的东西。您与getimagesize()走在了正确的轨道上。如果您尝试访问的主机无法访问,此功能可能会超时。您需要使用set_time_limit()正确处理此问题。当getimagesize()返回0时,你也应该抓住。