У меня есть скрипт, который загружает значки и превращает их в PNG.
Для обработки преобразования я использую ImageMagick. Мой текущий подход включает загрузку данных, запись их в файл, преобразование файла, а затем удаление первоначально загруженного файла. Вот что я имею в виду:
$source = 'http://google.com/favicon.ico';
$image = file_get_contents($source);
// I'd like to skip these lines
$favicon = fopen('favicon.ico', 'w');
fwrite($favicon, $image);
fclose($favicon);
$im = new Imagick();
$im->readimage('favicon.ico');
$im = $im->flattenImages();
$im->setImageFormat('png');
$im->writeImage('favicon.png');
unlink('favicon.ico');
Это работает, но в идеале я мог бы сделать это, не записывая переменную $image
в файл favicon.ico
и вместо этого я мог бы просто преобразовать данные в переменную $image
а затем $im->writeImage('favicon.png')
на этом,
Я проверил метод getImageBlob
но когда я попробовал, я получил эту ошибку:
PHP Fatal error: Uncaught exception 'ImagickException' with message 'no decode delegate for this image format '' @ error/blob.c/BlobToImage/364' in /home/vagrant/test/test_image.php:73
Stack trace:
#0 /home/vagrant/test/test_image.php(73): Imagick->readimageblob('\x00\x00\x01\x00\x02\x00\x10\x10\x00\x00\x01\x00 \x00h...')
#1 {main}
thrown in /home/vagrant/test/test_image.php on line 73
Есть идеи?
Вам нужно будет вызвать Imagick :: setFormat перед чтением blob.
<?php
$source = 'http://google.com/favicon.ico';
$image = file_get_contents($source);
$im = new Imagick();
$im->setFormat('ICO');
$im->readImageBlob($image);
$im = $im->flattenImages();
$im->setImageFormat('PNG');
$im->writeImage('favicon.png');
Обновить
Сглаживание изображения.ico может иметь негативные последствия для файлов, содержащих более одного изображения. Самое простое решение - перебрать все изображения и определить, какой суб-образ использовать.
$im = new Imagick();
$im->setFormat('ICO');
$im->readImageBlob($image);
for( $idx = 0, $len = $im->getNumberImages(); $idx < $len; $idx++ ) {
// If this is the sub-image you want, do the following, else skip
$im->setImageFormat('png');
$im->setImageIndex($idx);
$im->writeImage(sprintf('favicon_%d.png', $idx));
}