Php 获取最大的图像
我正在做一个图像搜索项目,我想得到一页最大的图像。 我添加了一些代码来修复图像的真实地址,删除可能是广告的图像。比较那里的宽度*高度回声出最大的一个。但是我的代码有一些问题。这是我的全部代码。有谁能帮我解决哪里出了问题以及如何优化代码,我觉得这个过程是一个痛苦的过程。谢谢大家Php 获取最大的图像,php,simple-html-dom,Php,Simple Html Dom,我正在做一个图像搜索项目,我想得到一页最大的图像。 我添加了一些代码来修复图像的真实地址,删除可能是广告的图像。比较那里的宽度*高度回声出最大的一个。但是我的代码有一些问题。这是我的全部代码。有谁能帮我解决哪里出了问题以及如何优化代码,我觉得这个过程是一个痛苦的过程。谢谢大家 <?php require_once 'simple_html_dom.php'; require 'url_to_absolute.php'; //get image absolute url $v = 'http
<?php
require_once 'simple_html_dom.php';
require 'url_to_absolute.php'; //get image absolute url
$v = 'http://www.yomiuri.co.jp/stream/';
$html = file_get_html($v);
$maxsize = -1;
$the_biggest_image = false;
$arr = array('ad', 'ads','gif');// add ads possible words as a arry which is check in the image url
foreach($html->find('img') as $element) {
preg_match_all('#https?://(.*?)($|/)#m', urldecode(stripcslashes($v)), $r); //get site base url
$pic = $element->src;
$comm = url_to_absolute( $r[0][0], $pic);//get image absolute url
$check_flag = true;
foreach($arr as $item) {
if (substr_count(strtolower($comm),$item) > 0) $check_flag = false;
}// remove ads images
if ($check_flag) $arr = @getimagesize($comm);// get the rest images width and height
reset($comm);
if (($arr[0] * $arr[1]) > $maxsize) {
$maxsize = $arr[0] * $arr[1]; //compare images' sise
$the_biggest_image = $comm;
echo '<img src="'.$the_biggest_image.'" />'; //echo the biggest one
}
}
?>
您还没有真正说出您的错误,但幸运的是,您的代码中有几个错误。可能会给您带来错误的错误在该块中:
if ($check_flag) $arr = @getimagesize($comm);// get the rest images width and height
reset($comm);
if (($arr[0] * $arr[1]) > $maxsize) {
$maxsize = $arr[0] * $arr[1]; //compare images' sise
$the_biggest_image = $comm;
echo '<img src="'.$the_biggest_image.'" />'; //echo the biggest one
}
基于您的代码,我创建了以下解决方案-它使用相同的逻辑,允许您设置图像的最小宽度和高度,以确保返回正确的图像
private function getMainImageFromUrl($pageUrl) {
$biggestImage = '';
$minImgWidth = 300;
$minImgHeight = 300;
$images = $this->getImagesFromDom($pageUrl);
$visited = array();
$maxSize = -1;
$ignore = array('ad', 'ads','gif'); // get rid of ads (check if these contains following)
foreach ($images as $image) {
$pic = $image->getAttribute('src');
# if source is empty, skip to another image
if ( empty( $pic ) )
continue;
# get image absolute url
$absUrl = url_to_absolute($pic);
# ignore already seen images (skip to another), add new images
if ( in_array( $absUrl, $visited ) )
continue;
$visited[] = $absUrl;
# remove ads
$ignoring = false;
foreach($ignore as $item)
if ( stripos( $absUrl,$item ) !== false ){
$ignoring=true;
break;
}
if ( $ignoring )
continue;
$imageSize = @getimagesize($absUrl);
if ( ( $imageSize[0] * $imageSize[1] ) > $maxSize) {
$maxSize = $imageSize[0] * $imageSize[1];
if ($minImgWidth < $imageSize[0] && $minImgHeight < $imageSize[1])
$biggestImage = $absUrl;
}
}
return $biggestImage;
}
private function getImagesFromDom( $url ) {
ini_set('default_socket_timeout', 4);
$dom = new DOMDocument();
@$dom->loadHTMLFile( $url );
$dom->preserveWhiteSpace = false;
# Get images from DOM
return $dom->getElementsByTagName('img');
}
私有函数getMainImageFromUrl($pageUrl){
$biggestImage='';
$minImgWidth=300;
$minImgHeight=300;
$images=$this->getImagesFromDom($pageUrl);
$visited=array();
$maxSize=-1;
$ignore=array('ad','ads','gif');//清除广告(检查这些广告是否包含以下内容)
foreach($images作为$image){
$pic=$image->getAttribute('src');
#如果源为空,请跳到另一个图像
如果(空($pic))
继续;
#获取图像绝对url
$absUrl=url到绝对值($pic);
#忽略已看到的图像(跳到另一个),添加新图像
if(在数组中($absUrl,$visted))
继续;
$visited[]=$absUrl;
#删除广告
$忽略=错误;
foreach($ignore as$项目)
if(stripos($absUrl,$item)!==false){
$ignoring=true;
打破
}
如果($忽略)
继续;
$imageSize=@getimagesize($absUrl);
如果($imageSize[0]*$imageSize[1])>$maxSize){
$maxSize=$imageSize[0]*$imageSize[1];
如果($minImgWidth<$imageSize[0]&&$minImgHeight<$imageSize[1])
$biggestImage=$absUrl;
}
}
返回$biggestImage;
}
私有函数getImagesFromDom($url){
ini设置(“默认套接字超时”,4);
$dom=新的DOMDocument();
@$dom->loadHTMLFile($url);
$dom->preserveWhiteSpace=false;
#从DOM获取图像
返回$dom->getElementsByTagName('img');
}
@Khez,@Pekka,我的错误是警告:reset()[function.reset]:传递的变量不是数组或对象
。对,有2个$arr
,是我的错。@Khez,那怎么修改呢?我只想得到一个最大的图像返回。我已经尽我所能尝试过了。我需要帮助。谢谢。用绝对url函数更新你的代码,我会给你一个优化的工作版本。@Khez,我已经更新了绝对url函数
代码$最大的图像
就是我真正给出的。如果一个页面有两个以上同样大小的最大图像,只需回显其中一个即可。再次感谢。你实际上必须得到有问题的图像,所以这完全取决于你的连接。如果你想要原始磁盘大小而不是图像像素的最大图像,你可以欺骗系统一点,不下载任何图像,但是。。。超出你的需要。
<?php
require_once 'simple_html_dom.php';
require 'url_to_absolute.php'; //get image absolute url
// options
$url = 'http://www.yomiuri.co.jp/stream/';
$ignore = array('ad', 'ads','gif');// add ads possible words as a arry which is check in the image url
$biggestImage = 'path to "no image found" image';
// process
$maxSize = -1;
$visited = array();
$html = file_get_html($url);
// base url
$parts=parse_url($url);
$host=$parts['scheme'].'://'.$parts['host'];
// loop images
foreach($html->find('img') as $element) {
$pic = $element->src;
if($pic=='')continue;// it happens on your test url
$absUrl = url_to_absolute($host, $pic);//get image absolute url
// ignore already seen images, add new images
if(in_array($absUrl, $visited))continue;
$visited[]=$absUrl;
// remove ads images
$ignoring=false;
foreach($ignore as $item)
if (stripos($absUrl,$item)!==false){
$ignoring=true;
break;
}
if($ignoring)continue;
// get image
$image=@getimagesize($absUrl);// get the rest images width and height
if (($image[0] * $image[1]) > $maxSize) {
$maxSize = $image[0] * $image[1]; //compare images' sise
$biggestImage = $absUrl;
}
}
echo '<img src="'.$biggestImage.'" />'; //echo the biggest one
?>
private function getMainImageFromUrl($pageUrl) {
$biggestImage = '';
$minImgWidth = 300;
$minImgHeight = 300;
$images = $this->getImagesFromDom($pageUrl);
$visited = array();
$maxSize = -1;
$ignore = array('ad', 'ads','gif'); // get rid of ads (check if these contains following)
foreach ($images as $image) {
$pic = $image->getAttribute('src');
# if source is empty, skip to another image
if ( empty( $pic ) )
continue;
# get image absolute url
$absUrl = url_to_absolute($pic);
# ignore already seen images (skip to another), add new images
if ( in_array( $absUrl, $visited ) )
continue;
$visited[] = $absUrl;
# remove ads
$ignoring = false;
foreach($ignore as $item)
if ( stripos( $absUrl,$item ) !== false ){
$ignoring=true;
break;
}
if ( $ignoring )
continue;
$imageSize = @getimagesize($absUrl);
if ( ( $imageSize[0] * $imageSize[1] ) > $maxSize) {
$maxSize = $imageSize[0] * $imageSize[1];
if ($minImgWidth < $imageSize[0] && $minImgHeight < $imageSize[1])
$biggestImage = $absUrl;
}
}
return $biggestImage;
}
private function getImagesFromDom( $url ) {
ini_set('default_socket_timeout', 4);
$dom = new DOMDocument();
@$dom->loadHTMLFile( $url );
$dom->preserveWhiteSpace = false;
# Get images from DOM
return $dom->getElementsByTagName('img');
}