Несколько вопросов по imagemagick

grey109

Новичок
Они могут не быть одинакового, но быть такими в раскадровке,
Да похоже так и есть :( А какой софт может показать истинные размеры кадров - не подскажите? Смотрю adobe imageready cs2 - все одинаковые.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
А это разве принципиально? Как тут верно заметили, 0й кадр всегда ключевой и полный.
 

grey109

Новичок
0й кадр всегда ключевой и полный.
Увы, не всегда. Вот пример:


Изображение имеет размер 125х70, а код:

$image->setIteratorIndex(0);
$width = $image->getImageWidth();
$height = $image->getImageHeight();

возвращает 112х57.
 

grey109

Новичок
Сейчас посмотрел в фотошопе: если взять первый кадр и обрезать пустое место по сторонам, то как раз получается 112х57.
 

hell0w0rd

Продвинутый новичок
Welcome, а как цвет влияет на размер? Прозрачность - просто дополнительный канал, байт на пиксель.
 

grey109

Новичок
Так и есть: перебрал все кадры - нет ни одного с размерами сторон 125 или 70. Максимальные размеры 122 и 68 причем в разных кадрах.
Во засада...
 

grey109

Новичок
Без setIteratorIndex(0) - размер последнего кадра, с ним соответственно первого. Ни то ни другое не является действительным размером изображения.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Можно попробовать применять к гифке -coalesce и мерять потом, топорно, но должно работать.
 

grey109

Новичок
Да, так работает правильно. Но для верности сделал через coalesceImages:

if ($image->getImageIterations()==1) // если анимированный гиф
{
$image->setFirstIterator();
$image = $image->coalesceImages();

$width = $image->getImageWidth();
$height = $image->getImageHeight();
}

Пока не нашел изображений, которые скрипт не верно определил. Так что вопрос исчерпан. Всем спасибо.
 

grey109

Новичок
Еще вопрос назрел. Необходимо взять первый кадр из анимированного гифа и заменить прозрачный фон на белый цвет.
Делаю:

foreach ($image as $frame) break; // в $frame по идее должен лежать только первый кадр
$frame->setImageBackgroundColor('white');
$frame = $frame->flattenImages(); // объединяю фон и первый кадр
$frame->writeImage('test.gif");

В итоге получаю картинку, у которые наложены все кадры один на один. Почему так получается? Почему $frame содержит тоже самое что и $image?
 

AnrDaemon

Продвинутый новичок
Не надо использовать трюки в продакшн коде. Никто не гарантирует, что они будут работать в следующей версии так же.
 

fixxxer

К.О.
Партнер клуба
С нетривиальным использованием imagemagick без трюков не обойтись. И надо зафиксировать версию либы, угу - там постоянно все ломается.
 

AnrDaemon

Продвинутый новичок
Как минимум включить код обработки фрейма в тело foreach было бы более корректно.
 
Сверху