我有一个下载favicon并将其转换为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
变量中的数据,然后{{1在那上面。
我检查了方法$im->writeImage('favicon.png')
,但是当我尝试时,我收到了这个错误:
getImageBlob
有什么想法吗?
答案 0 :(得分:2)
在阅读blob之前,您需要调用Imagick::setFormat。
<?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));
}