Декодировать объект изображения из двоичной строки в ImageMagick для PHP

0

У меня есть скрипт, который загружает значки и превращает их в 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

Есть идеи?

Теги:
imagemagick

1 ответ

2
Лучший ответ

Вам нужно будет вызвать 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));
}
  • 0
    Отлично! Теперь моя проблема в том, что flattenImages уничтожает значок, если в значке есть несколько размеров. Есть идеи?
  • 0
    Звучит правильно. Если вы только пытаетесь извлечь изображение, используйте один из многих методов итератора. Я обновлю свой ответ на примере.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню