PHP package for reading and converting .ico files, particularly website favicons
This package provides a means to load and convert .ico files in a PHP application. It has no dependencies apart from gd for rendering.
The package has unit tests which verify support for 1bit, 4bit, 8bit, 24bit and 32bit .ico files, and the newer form of .ico files which can included embedded PNG files.
IcoFileLoader is available via Composer:
composer require lordelph/icofileloader
The IcoFileService class provides a one-shot method
extractIcon
. This should suit most use-cases where you simply want to get one
image out of a .ico file.
It returns an image resource, which you can further manipulate with GD functions, e.g. save it to a file with imagepng
For example, here’s how you extract a 32x32 transparent image from an ico file:
$loader = new Elphin\IcoFileLoader\IcoFileService;
$im = $loader->extractIcon('/path/to/icon.ico', 32, 32);
//$im is a GD image resource, so we could, for example, save this as a PNG
imagepng($im, '/path/to/output.png');
Instead of retaining the alpha channel from the icon, you can render with a background color instead - pass the required color as a renderer option as follows:
$im = $loader->extractIcon('/path/to/icon.ico', 32, 32, ['background'=>'#FFFFFF']);
The extractIcon
method will try find an image in the icon which is the exact
size you request at highest color depth it can find. If it can’t, it will resize the
best quality image in the icon. So, you can request any size you require…
$im = $loader->extractIcon('/path/to/icon.ico', 100, 100);
As long you have the PHP fopen wrappers
installed, you can pass a URL to extractIcon
$im = $loader->extractIcon('https://assets-cdn.github.com/favicon.ico', 16, 16);
If you already have an ico file held as a binary string, extractIcon
will cope
with that just fine too:
php
$data = file_get_contents('/path/to/icon.ico');
$im = $loader->extractIcon($data, 16, 16);
If you want to do more than just extract a single image from an icon, you can use lower level methods of IcoFileService to inspect an .ico file and perform multiple renderings.
The fromFile
, fromString
and from
methods will parse an ico
file and return
an Icon instance representing an icon and the images
it contains.
You can iterate the images in icon, examine them, and render them with renderImage
For example, here’s how you could extract all the images in an icon and save them as individual files.
$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", $image->getDescription(), $filename);
}
The service is composed of a parser and a renderer, which can be injected into the service at runtime if you wanted to override them.
The current GdRenderer works by drawing individual pixels for BMP based icon images. This isn’t going to be terribly fast. PHP 7.2 will have support for BMP images, and I’ll add a renderer which takes advantage of that when it is released.
$ composer test
Please see CONTRIBUTING for details.
Thanks also to the PHP League’s skeleton project from which this project’s structure was derived.
The MIT License (MIT). Please see License File for more information.
Note: this was based on some classes originally written in 2005 by Diogo Resende. While these were originally provided on the PHPClasses site under a GPL license, Diogo kindly agreed to allow them to be licensed under an MIT license.