我正在尝试构建一个脚本,从外部链接中检索缩略图图像列表,就像Facebook在共享链接时所做的那样,并且可以选择与该帖子关联的缩略图图像。
我的脚本目前的工作方式如下:
file_get_contents
preg_match_all
以匹配内容中的任何<img src=""
getimagesize
来查找宽度和高度fread
和imagecreatefromstring
来查找宽度和高度(速度) <img src="'.$image[0].'" width="'.$image[1].'" height="'.$image[2].'"><br><br>
目前这种方法很好,但我可能会遇到很多问题:
getimagesize
或fread
&amp; imagecreatefromstring
会将整个图像存储在内存中,页面上的任何大图像都会占用服务器的内存并终止我的脚本(和服务器)我发现的一个解决方案是能够从图像的标题中检索图像的宽度和高度而无需下载整个图像,尽管我只找到了一些代码来为JPG执行此操作(它需要支持GIF和PNG)。
任何人都可以提出任何建议来帮助我解决上面提到的任何一个问题,或者你可以建议另一种做法,我愿意接受这些想法......谢谢!
**编辑:以下代码:
// Example images array
$images = array('http://blah.com/1.jpg', 'http://blah.com/2.jpg');
// Find the image sizes
$image_sizes = $this->image_sizes($images);
// Find the images that meet the minimum size
for ($i = 0; $i < count($image_sizes); $i++) {
if ($image_sizes[$i][0] >= $min || $image_sizes[$i][1] >= $min) {
// Scale down the original image size
$dimensions = $this->resize_dimensions($scale_width, $scale_height, $image_sizes[$i][0], $image_sizes[$i][1]);
$img[] = array($images[$i], $dimensions['width'], $dimensions['height']);
}
}
// Output the images
foreach ($img as $image) echo '<img src="'.$image[0].'" width="'.$image[1].'" height="'.$image[2].'"><br><br>';
/**
* Retrieves the image sizes
* Uses the getimagesize() function or the filesystem for speed increases
*/
public function image_sizes($images) {
$out = array();
if (count($images) < 10) {
foreach ($images as $image) {
list($width, $height) = @getimagesize($image);
if (is_numeric($width) && is_numeric($height)) {
$out[] = array($width, $height);
}
else {
$out[] = array(0, 0);
}
}
}
else {
foreach ($images as $image) {
$handle = @fopen($image, "rb");
$contents = "";
if ($handle) {
while(true) {
$data = fread($handle, 8192);
if (strlen($data) == 0) break;
$contents .= $data;
}
fclose($handle);
$im = @imagecreatefromstring($contents);
if ($im) {
$out[] = array(imagesx($im), imagesy($im));
}
else {
$out[] = array(0, 0);
}
@imagedestroy($im);
}
else {
$out[] = array(0, 0);
}
}
}
return $out;
}
/**
* Calculates restricted dimensions with a maximum of $goal_width by $goal_height
*/
public function resize_dimensions($goal_width, $goal_height, $width, $height) {
$return = array('width' => $width, 'height' => $height);
// If the ratio > goal ratio and the width > goal width resize down to goal width
if ($width/$height > $goal_width/$goal_height && $width > $goal_width) {
$return['width'] = floor($goal_width);
$return['height'] = floor($goal_width/$width * $height);
}
// Otherwise, if the height > goal, resize down to goal height
else if ($height > $goal_height) {
$return['width'] = floor($goal_height/$height * $width);
$return['height'] = floor($goal_height);
}
return $return;
}
答案 0 :(得分:1)
getimagesize只读取标题,但imagecreatefromstring读取整个图像。由GD,ImageMagick或GraphicsMagic读取的图像存储为位图,因此它消耗宽度高度(3或4)字节,并且您无能为力。 您的问题的最佳解决方案是使curl多请求(请参阅http://ru.php.net/manual/en/function.curl-multi-select.php),然后逐个过程接收带有GD或任何其他库的图像。为了降低内存消耗,可以将映像文件存储在磁盘上,而不是存储在内存中。
答案 1 :(得分:0)
对于您当前的方法(令人印象深刻),我想到的唯一想法是检查HTML是否存在现有的宽度和高度属性,如果它们存在则完全跳过文件读取过程。