如何从 .ico 文件中获取更大的图像?

How to get bigger image from .ico file?

我正在尝试使用 php 从网站下载并保存网站图标 (.ICO)。我想把这个ico文件转成png格式。

如果我理解正确的话,单个 .ICO 文件可以存储不同的图像分辨率,例如 16x16 和 32x32(google's 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.

内看不到

有什么想法吗?

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

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

如果您在某个目录中有这些 .ico 文件,请使用 php scandir 函数遍历每个图像,使用 getimagesize 函数获取图标尺寸。

经过多次我找到了你的答案;)
您可以使用此 class: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 单独将在输出中:
对于第二张图像 32x32 单独将在输出中:

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

<?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);
?>

单张图片输出完美:

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

此示例提取维基百科的 32 像素 PNG 图标:

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

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

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

https://github.com/lordelph/icofileloader 在 PHP 中比 Nabi 的回答PHP类 link 中提供更多 up-to-date 对处理 .ico 文件的支持

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

$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);
}