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

grey109

Новичок
Здравствуйте!

Собственно вопросы:
1. Пользователь загружает файл на сервер. Как проверить что файл является именно графическим файлом? Делаю $image = new Imagick('no_image.jpg') получаю "Fatal error: Uncaught exception 'ImagickException' with message 'NoDecodeDelegateForThisImageFormat...". По идее должна быть распространенная проблема, но гугл не смог помочь с решением.

2. Печатаю текст на изображение с помощью annotation. Как с помощью этой функции напечатать спецсимволы типа © ° и т.д. Она так и выводит эти символы. Тоже искал и тоже не смог найти решение.

Спасибо.
 

WMix

герр M:)ller
Партнер клуба
1. try, catch
2. html-entities никакого отношения к картинкам не имеют, пиши в utf8
 

grey109

Новичок
Спасибо за ответы - помогли.

Еще один вопрос: как получить количество кадров в анимированном gif-файле?
Нашел в сети код "$frames = $image->getImageProperty('scenes');", но он что-то не работает.
 

WMix

герр M:)ller
Партнер клуба
на голом php можно так
PHP:
$fh = fopen($filename, 'rb');
$count = 0;
while(!feof($fh) && $count < 2) {
        $chunk = fread($fh, 1024 * 100); //read 100kb at a time
        $count += preg_match_all('#\x00\x21\xF9\x04.{4}\x00(\x2C|\x21)#s', $chunk, $matches);
}
fclose($fh);
echo $count;
на магике сразу бери и считай
PHP:
$image = new Imagick($filename);
$count = 0;
foreach ($image as $frame) {
    $count++;
}
echo $count;
 

grey109

Новичок
Еще вопрос: во многих примерах в конце использования Imagemagick идет две функции:
$im->clear();
$im->destroy();

Зачем нужно делать clear, если действие destroy уже включает в себя clear?
 

WMix

герр M:)ller
Партнер клуба
если делаешь destroy, clear делать не обязательно.
 

Dimanoss

Новичок
Вот с чем столкнулся: При попытке задать шрифт (setFont) - всё работает. При попытке сменить начертание на курсив (setFontStyle) - всё работает. Как только пробую одновременно и шрифт, и начертание поменять - курсив не работает. Баг, мулечка или кривые руки?
 

AnrDaemon

Продвинутый новичок
Может, всё проще - отсутствие нужного начертания в шрифте?
 

Dimanoss

Новичок
отсутствие нужного начертания в шрифте?
но я подгружаю шрифт по имени файла, а не по имени шрифта, а в файле мы имеем одно лишь начертание... Ошибаюсь?

Кстати, так и не понял, как можно подгружать шрифт по имени... вот, положим, у меня линуксовый сервер, в какой-то папке есть шрифты. Как мейджик въезжает, какой ему шрифт использовать, если я ему только имя шрифта указываю? Это же не винды, там шрифт в системе не регистрируется...
 

Dimanoss

Новичок
просто у меня задачка такая. Шрифт загружается в админке. А в клиентской части к шрифтам должны быть применяемы эффекты (курсив, полужирный, подчёркнутый, перечёркнутый) и выравнивание (лево, право, центр). Проект раньше под виндами работал, там ребята попросту шрифты в общую папку кидали... Под линуксом такая шара не проходит...
 

Dimanoss

Новичок
сервер на несколько домейнов/проектов, пользовать можно только стандартные LAMP-овые схемы. Поэтому шрифтами могу оперировать только как файлами. Ну, или чего-то многого не знаю...
 

AnrDaemon

Продвинутый новичок
Я вам адрес дал, там поспрашивайте. Уверен, всё решаемо.
Вероятно, со шрифтом надо проделать некоторые действия, чтобы библиотеки его корректно видели в системе.
 

grey109

Новичок
Столкнулся с одной необъяснимой вещью: иногда imagemageck неправильно определяет высоту и ширину анимированного gif'а.
Т.е. размеры картинки допустим 200х200 пикселей, а getImageWidth/getImageHeight возвращается 6х5. Проверил на двух серверах - эффект воспроизводится. Поискал в интернете - как бы такой проблемы и не существует.

Никто не сталкивался? Могу дать картинки, на которых наблюдается такой глюк.
 

MiksIr

miksir@home:~$
Столкнулся с одной необъяснимой вещью: иногда imagemageck неправильно определяет высоту и ширину анимированного gif'а.
Т.е. размеры картинки допустим 200х200 пикселей, а getImageWidth/getImageHeight возвращается 6х5. Проверил на двух серверах - эффект воспроизводится. Поискал в интернете - как бы такой проблемы и не существует.

Никто не сталкивался? Могу дать картинки, на которых наблюдается такой глюк.
Они дают размер последнего фрейма скорее всего. Обычно в гифке первый фрейм равен размеру всей гифки, т.е. $imagick->setIteratorIndex(0) перед получением размера скажи.
 

grey109

Новичок
Спасибо за ответ, помогло.
Посмотрел - все фреймы одинакового размера, так что больше похоже на глюк.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Спасибо за ответ, помогло.
Посмотрел - все фреймы одинакового размера, так что больше похоже на глюк.
Они могут не быть одинакового, но быть такими в раскадровке, если софт - умный. гиф вообще технически очень хитрый формат, может хранить ключевые кадры + фреймы изменений в них.
 
Сверху