从ImageMagick for PHP中的二进制字符串解码图像对象

时间:2015-01-07 14:48:00

标签: php imagemagick

我有一个下载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

有什么想法吗?

1 个答案:

答案 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));
}