1

我正在尝试使用 php 从网站下载和保存 favicon(.ICO)。我想将此 ico 文件转换为 png。

如果我理解正确,单个 .ICO 文件可以存储不同的图像分辨率,例如 16x16 和 32x32(谷歌的 favicon就是一个例子)。我的问题是,有没有办法选择要转换的 ico 文件?

目前我可以下载文件

$image = file_get_contents('http://google.com/favicon.ico');
$saved_file = fopen("favicon.ico", "w");
fwrite($saved_file, $image);
fclose($saved_file);

此代码下载并保存一个名为favicon.ico.

然后当我运行这行代码时

var_dump(getimagesize('favicon.ico'));

我得到这个输出

array(6) {
  [0]=>
  int(16)
  [1]=>
  int(16)
  [2]=>
  int(17)
  [3]=>
  string(22) "width="16" height="16""
  ["bits"]=>
  int(32)
  ["mime"]=>
  string(24) "image/vnd.microsoft.icon"
}

所以我的问题是,我如何以编程方式访问其他图标大小?我可以在我的 Mac 上使用 Preview 清楚地看到它们,但不能在 php 中看到它们。

有任何想法吗?

4

4 回答 4

2

经过多次我找到你的答案;)
你可以使用这个类:http ://www.phpclasses.org/package/2369-PHP-Extract-graphics-from-ico-files-into-PNG-images.html

示例代码:

<?php
include 'class.ico.php';
$ico = new Ico('http://google.com/favicon.ico');

$im = $ico->GetIcon(0); //For get first image
//$im = $ico->GetIcon(1); //For get second image
//$TotalIcons = $ico->TotalIcons(); //for get total numbers of images in icon

header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
?>

输出:
对于第一个图像 16x16 分离将在输出中:png-16x16
对于第二个图像 32x32 分离将在输出中:png-32x32

而且,这个类有一个很好的方法来获取单个图像中的所有图标。看:

<?php
include 'class.icothumb.php';
$ico = new IcoThumb('http://google.com/favicon.ico');
$ico->max_size = 128;
$ico->use_diferent_depths = false;
$ico->GetThumb(4);
?>

输出是完美的单个图像:
所有图标作为单个图像

于 2015-01-06T22:07:48.803 回答
0

您可以使用免费的grabicon.com 服务来检索您请求大小的png 格式的网站图标。它为您处理大小调整,并为没有网站图标的网站创建唯一的默认图标。

此示例提取 Wikipedia 的 32 像素 PNG 图标:

http://api.grabicon.com/icon?domain=wikipedia.org&size=32

这也比自己检索图标快得多,因为它们是从其他用户的请求中缓存的。从头开始拉图标通常需要 4-6 秒来跟踪页面重定向、检查默认位置和元标记等。

完全公开,我是创造者,但我认为这是你需要的,而且是免费的。

于 2015-01-18T16:18:18.127 回答
0

https://github.com/lordelph/icofileloader为在 PHP 中处理 .ico 文件提供了比 Nabi 答案中的 PHPclasses 链接更多的最新支持

这是一个提取图标中所有图像的示例:

$icon = $loader->fromFile('/path/to/icon.ico');
foreach ($icon as $idx=>$image) {
     $im=$loader->renderImage($image);

     $filename=sprintf('img%d-%dx%d.png', $idx, $image->width, $image->height);
     imagepng($im, $filename);

     printf("rendered %s as %s\n", $icon->getDescription(), $filename);
}
于 2017-01-22T10:14:01.187 回答
-1

如何以编程方式访问其他图标大小?

你刚刚回答了你自己的问题。当您使用时,var_dump(getimagesize('favicon.ico')); 您可以获得"width="16" height="16""图像的信息。

如果您.ico在某个目录中有这些文件,请使用 phpscandir函数浏览每个图像,该函数使用getimagesize函数来获取图标大小。

于 2015-01-06T21:06:17.640 回答