Новое в версии 1.1: Тонкая настройка загрузки изображений для продвинутых

Тем, кто следит за новинками в версии 1.1, уже известно, что в этой версии значительно переработан механизм работы с изображениями. И даже после выпуска альфа-верси при движении к бете эта работа продолжалась. В этой статье я расскажу о некоторых нововведениях, которые касаются настроек, используемых при загрузке изображений.

На всякий случай реплика для тех, кто старается не трогать руками все эти конфиг-файлы и вообще не очень поймет, о чем будет идти речь в статье: не волнуйтесь, чтобы работать с Alto CMS вовсе нет необходимости все это понимать, и ваши сайты на Альто прекрасно будут работать и без ковыряния с этими настройками.

А теперь подробности. Итак,если вы еще не в курсе, то самое время узнать, что мы постарались загрузку всех изображений (от аватар до фотосетов) реализовать через единый общий модуль Uploader (класс ModuleUploader). И, соответственно, все настройки, которые он использует, вынесены в конфигурации в секцию 'module.uploader'. И вот как выглядит секция конфигурации для загрузки файлов вообще:
$config['module']['uploader']['files']['default'] = array(
    'file_maxsize'    => '5Mb', // максимальный размер загружаемого файла
    'file_extensions' => array( //расширения файлов, которые можно прикреплять к топикам
        'zip','rar','gz','mp3',
        'doc', 'docx', 'xls', 'xlsx', 'pdf','djv','djvu',
        'gif', 'png', 'jpg', 'jpeg',
    ),
);
По-моему, тут все понятно по умолчанию — задается максимальный размер загружаемых файлов и допустимые расширения. А вот секция, которая описывает настройки по умолчанию для загружаемых изображений:
$config['module']['uploader']['images']['default'] = array(
    '$extends$' => '___module.uploader.files.default___',
    'image_extensions' => array('gif', 'png', 'jpg', 'jpeg'),
    'max_width'  => 8000, // максимальная ширина загружаемых изображений в пикселях
    'max_height' => 6000, // максимальная высота загружаемых изображений в пикселях
    'url_maxsize' => '2Mb', // максимальный размер изображения в kB для загрузки по URL
    // параметры сохранения при загрузке
    'transform' => array(
        'max_width'  => 800,        // максимальная ширина сохраняемого изображения
        'max_height' => 600,        // максимальная высота сохраняемого изображения
        'bg_color'  => '#ffffff',   // цвет фона при преобразовании изображений
        'watermark' => array(
            'enable' => false,  // нанесение "водяного знака" по умолчанию запрещено
            'image' => array(   // но его параметры заданы
                'path' => '___path.static.dir___/___path.uploads.root___',
                'file' => 'altocms.png',
                'topleft' => false,
                'position' => '0,0',
            ),
        ),
        '@mime(jpeg)' => array(
            'quality' => 80,
        ),
        '@mime(gif)'  => array(
            'animation' => false,
        ),
        '@mime(png)'  => array(
            //'save_as' => 'jpg',
        ),
    ),
);
В первую очередь обратите внимание на первую строку с ключом '$extends$' — она говорит о том, что содержимое этой секции есть расширение секции 'module.uploader.files.default'. Непонятно? Ок, скажу проще — берем все настройки для файлов по умолчанию (см. предыдущий кусок кода) и на них накатываем то, что у нас описано ниже. Т.е. максимальный размер файла и допустимые расширения у нас тут тоже будут учитываться, но к ним добавляем:
  • image_extensions — список расширений файлов, по которым мы считаем их картинками
  • max_width и max_height — максимально допустимые размеры загружаемых изображений
  • url_maxsize — максимальный размер изображений, загружаемых по URL
Думаю, с этим ясно — это параметры, которые проверяются на входе, т.е. до (или в процессе) загрузки изображения. А вот следующая подсекция — trnsform — она задает параметры, которые используются при сохранении (и при преобразовании) изображений — до каких размеров ужимать изображение, какой должен быть у нее фон по умолчанию, и параметры «водного знака», наносимого на него.

Важный нюанс — все эти параметры не являются обязательными. Например, если значения max_width и max_height в подсекции transform не заданы, то изображения будут сохраняться, как есть, без изменения размеров.

Особо стоит отметить ключи конфигурации вида '@mime(...)'. Полагаю, вы уже догадались, что это особые параметры, которые применяются только для изображений с определенными форматами. Для gif — это разрешение/запрещение анимации, для jpeg — задание уровня качества при сжатии, для png — возможность сохранить в формате jpeg.

Но это еще не все. У нас ведь есть разные категории изображений: аватары юзера и блога, фото юзера, фото в топике и в фотосете — это только те, что используются в стандартной комплектации движка. Но могут быть и другие, задаваемые сторонними плагинами. И для разных категорий могут быть разные требования к настройкам. И этот момент тоже учтен. Проще показать на примере:
// Аватары пользователя
$config['module']['uploader']['images']['profile_avatar'] = array(
    '$extends$' => '___module.uploader.images.default___',
    'transform' => array(
        'max_width'  => 250, // макс. ширина сохраняемой аватары
        'max_height' => 250, // макс. высота сохраняемой аватары
        'aspect_ratio' => '1', // соотношение ширины и высоты
        'watermark' => array(
            'enable' => false, // водяной знак запрещен
        ),
        '@mime(gif)'  => array(
            'animation' => true, // gif анимация разрешена
        ),
    ),
);
// Фотография пользователя
$config['module']['uploader']['images']['profile_photo'] = array(
    '$extends$' => '___module.uploader.images.default___',
    'transform' => array(
        'aspect_ratio' => '2:3', // соотношение ширины и высоты
        '@mime(gif)'  => array(
            'animation' => false, // gif анимация запрещена
        ),
    )
);
// Изображения, загружаемые в топик
$config['module']['uploader']['images']['topic'] = array(
    '$extends$' => '___module.uploader.images.default___',
    'transform' => array( // максимальные размеры не задаются, значит берутся из "расширяемой" секции
        'watermark' => array(
            'enable' => true, // водяной знак разрешен
        ),
    ),
);
Как видите, мы теперь можем задавать параметры для любой категории изображений.

О том, как эти возможности могут использовать разработчики плагинов и о нескольких универсальных методах загрузки файлов/изображений, который значительно упрощают жизнь разработчикам, мы расскажем отдельно.

Похожие статьи

  • Версия 1.1.29 — багфиксы и небольшие доработки
    Ничего революционного версия эта не несет, но помимо мелких багфиксов, есть пара небольших, но полезных доработок: 1) В когфиг добавлены опции для настройки пнели вставки изображений в топик (особенно актуально для...
  • Ошибка загрузки изображения
    Всем привет. Понимаю, что это гадание на кофейной гуще, но всё-таки вдруг кто-то уже сталкивался с подобным и решил проблему...
  • ВАЖНО: Критическое обновление
    В AltoCMS используется библиотека PHPMailer, в которой была обнаружена критическая уязвимость. В версии Альто 1.1.27 эта библиотека обновлена. Настоятельно рекомендуется обновить движок до версии 1.1.27! Или...
  • Про секретную админку, поддомены и прочие тонкости маршрутизации в Alto CMS
    Довольно часто встречаются такие вопросы: А как сделать, чтобы админка работала не по адресу site.com/admin, а по секретному адресу, который знаю только я? Или вопрос из этой же серии: как сделать, чтоб блоги...

94 комментария

0
Еще был бы весьма признателен за добавление такой же настраиваемой функции вывода изображений, особенно с возможность сжатия для web. Я, например, писал отдельный плагин, чтобы на главной странице отображались сжатые копии картинок(кстати, с помощью встроенной функции Img_Copy).
0
Мысль разверните, плиз, не понял, что значит «сжатые копии картинок»?
0
м.б. имеется ввиду сохранение оригинальных изображений до обработки uploader-ом (ресайз и т.п.)…
0
Я, пожалуй, не совсем корректно выразился, извиняюсь.
Имелась ввиду оптимизация изображений для использования на сайтах, например как в этих сервисах.
Пользователь загружает картинку в хорошем качестве, а функция дает возможность выводить «оптимизированное»(сжатое) изображение. При этом оригинал картинки, как вариант, доступен по прямой ссылке.
Наверное, я имею ввиду фактически такой же функционал, описанный в статье, только не для загрузки изображений, а для отрисовки уже загруженных.
0
А, понял. Речь, фактически, о двух параметрах изображения — quality и dpi. Исходное изображение может быть, например, с разрешением 300 dpi, а для вывода на сайте достаточно 72 dpi и можно еще и по качеству немного ужать. А иногда требуется, чтоб оба варианта были доступны, напр., одно вставляется в страницу, а другое можно скачать.

В принципе, оно так и задумывалось, но, честно говоря, не проверял. Проверю.
0
Вот как раз качество лучше оставить 100% :) Это тоже самое что слушать музыку на рваных колонках, лучше тогда не слушать… Так же и о фото. Глаза только режет размытость и не точность.
Отредактирован:
0
dpi это физическое разрешение в проекции к линейному размеру (например когда изображение идет на печать). в случае если физического носителя с заданным размером нет, dpi будет зависеть от того на какм устройстве вы откроете изображение. На 27" мониторе и 4" телефоне dpi будет разным, и можно говорить только о разрешении. движок же отлично нарезает любые разрешения, какие хотите. и оригинал для некоторых типов изображений остается. ну и да, есть еще параметр качества как правильно заметили.
Отредактирован:
0
Поставил в конфиге вот это для аватарок и для фото профиля.
'@mime(gif)'  => array(
 'animation' => true, // gif анимация разрешена

Загружаю анимированную картинку в настройках профиля — сохраняет неподвижную картинку как в аватарке так и в фото профиля. В чем проблема?
0
В том что версия альфа ))
0
Понятно… скорее бы уже 1.1 вышла:)
0
Если Вы считаете, что введением других юзеров в заблуждение Вы помогаете развитию движка, то Вы ошибаетесь
0
Это была шутка. Там и смайлик стоит. Мне кажется коллега меня отлично понял))
0
В текущей версии с гитхаба должно работать. Обновитесь, и попробуйте еще раз. Будут проблемы — пишите, будем разбираться
0
Обновился с гитхаба, все работает, спасибо!
0
Спасибо!

А как будет выглядеть конфиг(ключ) для пользовательского типа контента?

Расскажите в этом конексте еще про TargetType вообще и topic-multi-image-uploader в частности. Ну и вообще про программное использование новых фишек. Например, программное добавление топика с картинками, правильная привязка, удаление и тд.
0
еще, у меня не заработало quality. реально изменить качество сжатия я смог только через:
$config['module']['uploader']['images']['default']['quality'] = 44;

то есть это какбы глобально получается уже…
Отредактирован:
0
А как НЕ заработало?
0
например, через $config['module']['uploader']['images']['topic-multi-image-uploader'] не получилось — хоть в корне, хоть в 'transform.@mime...'. При том что transform.max_width, например, отрабатывает норм.

мне бы идеально задать quality и transform для одного пользовательского типа контента(топика) — это возможно?
0
Насчет параметра quality посмотрю, в чем проблема.

мне бы идеально задать quality и transform для одного пользовательского типа контента(топика) — это возможно?
Чтоб просто одними настройками без коддинга — такого не предусматривалось. А в своем плагине — легко.
0
просто, как будто, напрашивается вариант типа
$config['module']['uploader']['images']['custom-topic-type'] или как то так…

по поводу quality — в функции StoreImage при вызове Save не передается дополнительный параметр конфига, а мог бы — в теле StoreImage есть $aConfig в котором «локальный» quality… а раз оно не передается, то Save использует «глобальные» значения…
Отредактирован:
0
'max_width' => 800, // максимальная ширина сохраняемого изображения
'max_height' => 600, // максимальная высота сохраняемого изображения

Это значание при просмотре или при публикации в топике?
А то хочу загружать фото и сто бы сохранялся оригинал. Как сделать сохранять оригинал и при просмотре что бы открывался оригинал а не сжатое фото.?
+1
Максимальная ширина сохраняемого изображения — это значит при сохранении, т.е. загружаемое изображение будет сохранено с такими параметрами. Если их убрать, то сохраняться будет оригинальное изображение без изменений. Я бы не советовал, конечно, если юзеры заливают фото самостоятельно, т.к. они могут вам ну очень большое фото залить, но решать вам.

Другое дело, что иногда нужно сохранять оригинал, например, для печати. Т.е. заливается картинка в хорошем качестве и все такое, и показывать на сайте надо какого-то внятного размера, но сохранить возможность скачать оригинал. Для этого в конфиге предусмотрены следующие параметры:
$config['module']['uploader']['images']['default'] = array(
    // ...
    'original' => array(
        'save' => false,            // надо ли сохрагять оригинальное изображение
        'suffix' => '-original',    // суффикс оригинального изображения
    ),
    // ...
);
0
Спасибо огромное.
0
Внес в app\config config.local но что то не открывает оригинал
$config['module']['uploader']['images']['default'] = array(
    // ...
    'original' => array(
        'save' => false,            // надо ли сохрагять оригинальное изображение
        'suffix' => '-original',    // суффикс оригинального изображения
    ),
    // ...
);

Я что то не так делаю?
Отредактирован:
0
1) Параметр 'save' => false означает, что оригинал НЕ будет сохраняться. Если нужно, чтоб он сохранялся, то нужно ставить значение true

2) То, что сохраняется оригинал без всякой обработки еще не значит, что именно этот файл будет показываться на страницу сайта. Выше я написал, для чего это может быть использовано, но задача взять и отдать оригинал юзеру ложиться уже на плечи разработчика сайта/плагина.

3) Если нужно, чтоб при клике выводился лайтбокс с увеличенной картинкой, то нет смысла играть параметром 'original', достаточно просто закомментировать параметры 'max_width' и 'max_height'. Тогда у сохраняемого изображения размеры останутся прежние.
-1
что true и false обозначает я знаю. Шла речь для загрузки-сохранения и просмотра оригинального изображения пользователям да и всем кто зашел на сайт. Я считаю если загрузил фото с разрешением 3500 то я и хочу увидеть 3500 при просмотре даннрй фото. Либо сделать параметр выбора при загрузке фото — оставить оригинал и разрешить его просмотр или нет. Я на счет места и мощности сервера не переживаю. Но вот это необходимо и я хочу понять досконально как это реализовать. :)
Отредактирован:
0
И в третий раз отвечаю: уберите параметры 'max_width' и 'max_height' и будет изображение сохраняться в исходном размере.
-1
Спасибо, спасибо, вас понял.))) приду домой и обязательно попробую.
-1
И так и так, и все равно… Загрузил фото 2000 на 726px при просмотре нет возможности просмотр оригинального размера выходит сжатое. Уже и закомментировал 'max_width' и 'max_height' то что вы говорили, пробовал все здесь приведенные примеру… нифига. Видимо я не то и не там наверное делаю? не могу врубится…
0
А в админке нет этих параметров? Их же (вернее только width) для топиков даже для версии 1.0.x туда перенесли…
Отредактирован:
-1
вышло. но дело в том, что я то их-'max_width' и 'max_height', закоментил и внес в app\config config.local но в common/config они включены и почемуто первое откуда берет — это с common/config. Когда уже и там закоментил, только тогда все вышло. И теперь оригенальный размер фото могут просматривать все посетители.
Если бы ее еще могли скачивать ))) А то сохранить фото нельзя. Только сохранить как в виде link и htmp
Отредактирован:
0
Давайте рассуждать логически.))
Параметр есть в /common/config/
В /app/ вы его комментируете

Т.о. с точки зрения движка параметр задан в /common/config, а в /app/ его просто нет. Поэтому оттуда (из первого) и берется значение.

Я подозреваю что в /app/ можно задать просто max_width='' и это сработает.
Отредактирован:
-1
так а смысл выносить тогда в апп. Если он по умолчанию раскоментирован в /common/config, тогда получается, что косле каждого обновления фикса придется вручную опять править в /common/config
0
Вы походу не понимаете как это работает, да?
Еще раз внимательно прочитайте мой пост.
-1
Я прекрасно понял что вы написали ) читайте что аВадим говорил по этому поводу. И то что я написал. )
0
Стало быть вы уже добавили max_width='' в /app и все уже решилось. Ну и славно))
-1
=)))max_width нужно отключить для просмотра оригинального размера изображения
+2
Понятно, Толстого не читал но осуждаю. Вы попробуйте, это не больно.))
Отредактирован:
0
Вот сейчас заново скачал с гита, установил. Снова не работает gif анимация ни в аватаре, ни в фото профиля, ни в топиках ни в фотосетах… Вообще нигде не анимируется:( Вот кусок конфига:
$config['module']['uploader']['files']['default'] = array(
    'file_maxsize'    => '15Mb', // максимальный размер загружаемого файла
    'file_extensions' => array( //расширения файлов, которые можно прикреплять к топикам
        'zip','rar','gz','mp3',
        'doc', 'docx', 'xls', 'xlsx', 'pdf','djv','djvu',
        'gif', 'png', 'jpg', 'jpeg',
    ),
    'upload'          => array( // параметры сохранения при загрузке
        'return_url' => true,   // возвращает URL загруженного файла
    ),
);

$config['module']['uploader']['images']['default'] = array(
    '$extends$' => '___module.uploader.files.default___',
    'image_extensions' => array('gif', 'png', 'jpg', 'jpeg'),
    'max_width'  => 8000, // максимальная ширина загружаемых изображений в пикселях
    'max_height' => 6000, // максимальная высота загружаемых изображений в пикселях
    'url_maxsize' => '12Mb', // максимальный размер изображения для загрузки по URL
    'original' => array(
        'save' => true,            // надо ли сохрагять оригинальное изображение
        'suffix' => '-original',    // суффикс оригинального изображения
    ),
    // параметры сохранения при загрузке
    'transform' => array(
        'max_width'  => 800,        // максимальная ширина сохраняемого изображения
        'max_height' => 600,        // максимальная высота сохраняемого изображения
        'bg_color'  => '#ffffff',   // цвет фона при преобразовании изображений
        'watermark' => array(
            'enable' => false,
            'image' => array(
                'path' => '___path.static.dir___/___path.uploads.root___',
                'file' => 'altocms.png',
                'topleft' => false,
                'position' => '0,0',
            ),
        ),
        '@mime(jpeg)' => array(
            'quality' => 80,
        ),
        '@mime(gif)'  => array(
            'animation' => true,
        ),
        '@mime(png)'  => array(
            //'save_as' => 'jpg',
        ),
    ),
);

$config['module']['uploader']['images']['profile_avatar'] = array(
    '$extends$' => '___module.uploader.images.default___',
    'transform' => array(
        'max_width'  => 250,        // максимальная ширина сохраняемой аватары
        'max_height' => 250,        // максимальная высота сохраняемой аватары
        'aspect_ratio' => '1',      // соотношение ширины и высоты
        'watermark' => array(
            'enable' => false,
        ),
        '@mime(gif)'  => array(
            'animation' => true,
        ),
    ),
);

$config['module']['uploader']['images']['profile_photo'] = array(
    '$extends$' => '___module.uploader.images.default___',
    'transform' => array(
        'aspect_ratio' => '1',      // соотношение ширины и высоты
    
	 '@mime(gif)'  => array(
            'animation' => true,
			),
		)
);

$config['module']['uploader']['images']['topic'] = array(
    '$extends$' => '___module.uploader.images.default___',
    'transform' => array(
        'watermark' => array(
            'enable' => false,
        ),
		 '@mime(gif)'  => array(
            'animation' => true,
			),
    ),
);

$config['module']['uploader']['images']['photoset'] = array(
    '$extends$' => '___module.uploader.images.default___',
    'transform' => array(
        'watermark' => array(
            'enable' => true,
        ),
		 '@mime(gif)'  => array(
            'animation' => true,
			),
    ),
);

$config['module']['uploader']['images']['video'] = array(
    '$extends$' => '___module.uploader.images.default___',
    'transform' => array(
        'max_width'  => 640,        // максимальная ширина фрейма
        'max_height' => 360,        // максимальная высота фрейма
        'aspect_ratio' => '16:9',   // соотношение ширины и высоты фрейма
        'watermark' => array(
            'enable' => false,
        ),
    ),
);


Может я что не так прописал в конфиге? Особых ошибок в логах нет, кроме одной вот этой:
E_WARNING [2] getimagesize(): Filename cannot be empty (/..../youwo.ru/engine/classes/modules/img/entity/Image.entity.class.php on line 216)

Ну это возможно было некорректное имя файла…
0
Вообще насколько мы сталкивались с проблемами анимации на разных движках, gif анимация переставала работать именно после ресайза, оригинальное изображение загруженное через ftp в большинстве случаев работает. Такая же проблема была в ранних версиях dle, сейчас кажется исправили.

Несколько вариантов решения есть здесь livestreet.ru/blog/10252.html
0
Так же интересная статья на хабре по ресайзу анимации средствами php без использования сторонних библиотек habrahabr.ru/post/186084/

Комментарий автора, почему использовать ImageMagick не лучшее решение
во-первых, ImageMagick не включен в стандартную поставку PHP, а от сюда и дополнительные телодвижения с установкой/настройкой или еще хуже просьбой хостеров поставить даный пакет; во-вторых, не настолько прост и очевиден код ресайза анимированных gif изображений; и в в-третьих, у даного программного продукта также существует проблемы с корректным ресайзом даных файлов; (первая и третья причины основные)

Готовый класс github.com/Yuriy-Khomenko/GIF_eXG/blob/master/gif_exg.php
Отредактирован:
0
И тишина:)) Кто нибудь проверял что с анимированными gif? Сегодня еще раз поставил с гита — анимация не фурычит вообще нигде:(
0
Что молчим то? Здесь молчим, на гите по другому вопросу тоже молчим… github.com/altocms/altocms/issues/478
Если я не прав — скажите «Ты не прав — все работает», или «Есть проблема — будем исправлять». Что молчите то? Я ж вроде как стараюсь чтобы релиз ускорить…
+1
А куда торопиться?)) Этот баг закроют, найдется еще с десяток))
+2
Чтоб сказать «ты не прав...» или «есть проблема...», нужно, как минимум, протестировать. Раз молчим, то значит пока эти проблемы еще не тестировались. Да, не все так быстро происходит, как хотелось бы. И кому-то релиз новой версии ускорить хочется, а кто-то возмущается, что в старой версии мелкие ошибки не все еще пофиксили.

А вообще, что касается анимации, какая библиотека установлена? Анимация только с Imagick/Gmagick работает
0
ImageMagick 6.7.7-10 2013-09-01 Q16
0
Проблема имеет место быть, но причины пока непонятны, т.к. есть два хоста, куда положил конфиг один в один, как приведен выше, и на одном работает все без проблем, а на другом анимация не работает. Есть подозрение, что проблема в конкретной версии Imagick, но пока не могу сказать наверняка. Буду разбираться
0
В общем, проблема явно либо в пакете ImageMagick, либо в PHP-библиотеке imagick. Один и тот же код на одном сервере работает, а на другом — нет (просто читаю и записываю анимированный файл). У серверов немного отличаются и версии PHP, и версии пакета ImageMagick. Кстати, последняя версия пакета — 6.9.1-1, но как его аккуратно обновить без танцев с бубнами, я сходу не нашел
0
Да судя по всему Вадим прав. Проверил на одном сервере imagick module version 3.1.2 ImageMagick 6.7.7-10 2014-03-06 Q16 — все работает, на другом imagick module version 3.1.0RC1 ImageMagick 6.7.7-10 2013-09-01 Q16 — не работает. Это я лоханулся… сам не понимаю как и почему модуль 3.1.0RC1 установил… Попробую обновить до свежей стабильной версии.
0
Что то я устал с этим мейджиком:) Поставил последнюю версию ImageMagick 6.9.1-1 и модуль для php 3.1.2 — Не работает и все:( Ставил из исходников версию ImageMagick 6.7.7-10 так как на digitalocean эта версия работает с модулем imagick 3.1.2. Ничего не получается:( На digitalocean все работает, на fastvps — ни в какую:( Я уже не знаю что и думать. Разницы особой то нету, на fastvps — debian, PHP Version 5.4.4-14 На digitalocean — ubuntu, PHP Version 5.5.9-1. Может кто прошаренный в imagemagick посмотрит что за ерунда творится? Два тестовых сайта youwo.ru — не работает анимация, investb.ru — тут все работает. Помогите светлые головы побороть проблему пожалуйста.
0
diff`ом настройки глянь отдельно между сайтами
— config.local.php и
— config.php

еще на всякий случай выключи opcache если используется

вопрос намного в сторону а почему DO и fastvps? не проще на чем-то одном держать?
Отредактирован:
0
Да, была такая мысль, завтра сравню конфиги, может заковыка какая и влияет, хорошо бы если бы так. opcache он вроде как в php 5.5 по умолчанию используется, завтра посмотрю тоже что с ним и можно ли его отключить. А насчет DO и fastvps… Сначала просто решил попробовать что за облако такое за 10$ в месяц, перенес туда сначала один сайт, поставил панель vesta, ну так покрутить посмотреть:) Нормально так вроде все работает. А потом перенес весь шлак с fastvps туда, ну там сайты разные с fastvps под АГС которые. Держу так просто ради интереса, для тестирования чего нибудь и т.п. 10$ в месяц не напрягают ведь. А если будут напрягать — так конечно заброшу. Fastvps — основной конечно.
0
А fastvps какой тариф? Облако конечно удобней, как ни крути. Я вот уже привык к снепшотам, возможности клонировать сервер и прогнать всякие тесты и прочим фишкам.
0
EX-40
0
Ну вот завтра уже наступило:) Короче команда diff config_1.php config_2.php вообще ничего не вывела, файлы абсолютно одинаковые. Да оно и должно так быть. Я даже пытался так вычислить: если манипуляции с imagemagick и imagick ни к чему не приводят, то подумал вдруг все таки в коде движка проблема. Скопировал папки engine и common с DO на сайт на fastvps — черта с два. Естественно config.php абсолютно одинаковые. А сравнение config.local.php выдало разницу в строках
$config['path']['root']['url']

$config['path']['root']['dir']

$config['db']['params']['dbname']

$config['db']['table']['prefix']

Ну и в этих трех:
$config['security']['salt_sess']

$config['security']['salt_pass']

$config['security']['salt_auth']


Насчет opcache, он на DO и там все работает… какой смысл тогда его отключать? На fastvps xcache…

Как ранее говорил Вадим:
Проблема имеет место быть, но причины пока непонятны, т.к. есть два хоста, куда положил конфиг один в один, как приведен выше, и на одном работает все без проблем, а на другом анимация не работает. Есть подозрение, что проблема в конкретной версии Imagick, но пока не могу сказать наверняка. Буду разбираться

Может конечно и Imagick, но я провозился — не смог побороть проблему. Может еще какое то расширение нужно или какие то нюансы с этим Imagick.
0
А он точно к php подцепился этот imagick? php5-imagick стоит?
0
Да как то криво он установлен у меня. Даю команду в консоли
convert -version

Выдает:
Version: ImageMagick 6.7.7-10 2015-04-07 Q16 http://www.imagemagick.org
Copyright: Copyright © 1999-2012 ImageMagick Studio LLC

Страница с функцией phpinfo() выдает такую хрень:
ImageMagick version	ImageMagick 6.9.1-1 Q16 x86_64 2015-04-07 http://www.imagemagick.org

php5-imagick установлен, php -m показывает imagick, страница с phpinfo() тоже
показывает imagick module version 3.1.2
Хрен поймешь что с этим делать…
0
Видимо как-то параллельно встали 2 версии библиотеки. 6.9.1 случайно не через make install устанавливалась?
0
Да я устанавливал из исходников. Раньше пробовал стандартно через apt-get все ставить, но там в стандартном репо валяется пхпешный модуль 3.1.0RC1. Поддержка хостинга мне настоятельно не рекомендовала использовать сторонние репозитории, но я попросил чтобы они сами поставили из стороннего репо. Они и поставили. В итоге ничего не заработало и я потом уже удалил ImageMagick и ставил из исходников версию 6.7.7-10. Пхпешный модуль imagick я не трогал. В общем сейчас я в затуплении:) Че делать ХЗ. Оно особо не критично этот Imagick, но хотелось бы чтобы все работало.
0
Посмотри, я давно не ковырялся там чтобы установить именно как мод php надо выполнить не make install а что-то другое. Судя по всему просто в /usr/lib/php5 не скопировалось, вот и работает в консоли с одной версией, а php с другой
Отредактирован:
0
Повторюсь еще раз, есть готовая реализация через стандартную библиотеку GD habrahabr.ru/post/186084/ зачем эти танцы с Imagick?

Imagick в работе с анимацией работает криво, об этом не раз писалось на хабре. Отдать обработку gif GD и не будет никаких проблем.
0
Я то только ЗА:) Не первый раз геморой с этим imagick причем и на других системах. Но это нужно чтобы разработчики приложились к этому вопросу.
0
Не все так однозначно. Во-первых, Imagick дает, как правило, более качественную обработку изображений, чем GD. И работа с анимацией у него, в отличие от GD, заложена изначально. Но минус в том, что тут два уровня обработки получается — пхпешная библиотека и сам пакет ImageMagick. И баги могут быть на любом из этих уровней.

Про класс, который умеет ресайзить с GD, знаю давно. Но не очень понимаю, как его встроить. Ведь у нас изображения не только ресайзятся, а еще и кропаются, и «водяные знаки» на них наносятся. Ничего этого тот класс не умеет. И как быть? Что делать, если юзер загрузил анимированную гифку и пытается вырезать из нее аватарку? Не делать ничего? Вместо кропа делать ресайз? Я не знаю. Но при любом раскладе прогнозирую однотипные багрепорты — не работает заявленные функционал, или работает не так, как ожидается.
0
Если честно плохо себе представляю кроп анимированной гифки, это все равно что кропать видео в одной точке :) Думаю лучшим решением было бы запретить любые операции с анимированным гиф, кроме ресайза. В любом случае сейчас анимация в аватарах и так не работает и с кропом и без кропа, в топиках работает. Подозреваю, что перестает работать именно после ресайза… Проверялось на двух популярных хостингах — джино, бегет.

К тому же я так подозреваю, что кроп анимации очень ресурсоемкая задача, особенно если учесть, что гифки бывают по нескольку мегабайт… Тоже наверное можно сказать и про водяные знаки на анимации, хотя если такое есть это действительно круто :)
0
Анимация не просто везде работает, она слишком везде работает, так что это создает проблемы.
0
Кое что нарыл на эту тему. Не знаю поможет или нет. Связано с запретом в php таких функций как shell_exec(), exec(), system(). Вот здесь упоминается masterhost.ru/support/faq/technical/imagemagick/
Вот здесь тоже упоминается в контексте cms modx, но там тоже какой то phpthumb тоже не смог нормально работать с imagick, вот что там говорят:
А дело в том, что на моём сервере (и многих других) отключены функции exec, system, shell_exec и passthru, через которые phpThumb пытается выяснить версию установленного ImageMagick, а потом и запустить его на конвертацию.
Я у себя сейчас разрешил эти функции (были запрещены в php.ini) Простое разрешение функций и сброс кеша не решили проблему. Наверное нужно переустановить imagick с учетом разрешенных функций. С другой стороны разрешение этих функций вроде как небезопасно… Я задавал вопрос по поводу какие функции нужно запрещать на LS, но там вопрос проигнорировали:( livestreet.ru/blog/questions/17609.html

Может здесь с этим Imagick заодно и этот вопрос прояснится:)
0
Это немного не та тема. К пакету ImaheMagick можно обращаться из PHP двумя способами: через PHP-библиотеку Imagick и напрямую через командную строку. Для первого варианта должно стоять расширение php5-imagick и взаимодействие с пакетом идете через него. А во втором варианте уже нужны эти функции (exec и проч.), которые позволяют выполнять команды командной строки.

В Альто работа через Imagick идет, поэтому разрешение/запрещение из PHP работать с командной строкой никак не повлияет на проблему.
0
Да… это я не в тему приплел:) Сейчас вот заново скачал поставил, на том сайте, где до этого анимация работала — теперь выдает в красном окошке «System error #1001» при попытке загрузить gif аватар или фото профиля. На том сайте где не работало такой ошибки нет, но и не обрабатывает по прежнему, грузит gif но отображает неподвижную картинку. Я понимаю, что достал уже всех со своей анимацией:) Кстати на вашем демо сайте demo.altocms.ru/new/ тоже или в конфиге отключено gif или не работает, потому что не отображает ни в профиле, ни в топике… Может на демо включите?
0
«System error #1001»
Это значит js-скрипт совсем не понял, что ему пришло в ответ. Чаще всего такое бывает из-за ошибки на сервере, и тогда в логах что-то должно быть
0
Я понимаю, что достал уже всех со своей анимацией
Не-не, все нормально. Самому хочется понять, в чем проблема и как ее можно порешать по-человечески. На демо гиф-анимация не пошла :(
0
Вадим, мне пытается помочь служба поддержки хостинга fastvps, они спрашивают вот что:
Можете ли Вы указать какой командой imagemagick происходит перекодировка Ваших файлов, а также разместить на Вашем сервере исходный файл?
Ну файл я закинул на сайт, а что ответить насчет команд? Ответь пожалуйста здесь я им перешлю:)
0
Они видимо не поняли что ты не командой кодируешь, а через PHP. Проверить будет несколько проблематично…
0
Ну Вадим дал мне такой кусок кода:
<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

$image = new Imagick(__DIR__ . "/i1.gif");
/* Notice writeImages instead of writeImage */
$image->writeImages(__DIR__ . "/i2.gif", true);

?>
<img src="i2.gif">

И сказал при этом:
Он просто читает картинку и сохраняет ее под другим именем, вообще не выполняя никаких преобразований. И на одних сервера анимация сохраняется, на других — ломается. Если быть более точным — сохраняется только один кадр.

Создай папку, поставь права, чтоб php-скрипт мог писать в эту папку и положи туда анимированную гифку под именем i1.gif, и выполни. Напр., /test/test.php — и отобразится картинка, либо с анимацией, либо нет

Я сделал как он сказал, в итоге везде все обрабатывается нормально:

youwo.ru/test/test.php
investb.ru/test/test.php

Жду сейчас сообщения от Вадима, может еще что нибудь проделать нужно…
0
А в php.ini есть отличия?
0
Посмотрел, особых отличий нету…
0
Поддержка обновила ОС и выполнила полное обновление всех пакетов до последних версий. К сожалению проблема с imagick осталась. Жду новостей от Вадима, интересно почему все таки не работает.
0
ну php5-imagick мог и не обновиться при этом
как и imagick
да и вообще не факт что там было обновлено хоть что-то имеющее отношение к теме))
0
Ну php5-imagick уже несколько раз обновляли… Думали может версия php не совсем того:) Нет, обновили до 5.4.39-0. Черта с два:(
0
Что то у меня совсем чудеса какие то…
apt-get remove imagemagick
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
Пакет «imagemagick» не установлен, поэтому не может быть удалён

Хотя везде показывает что установлено… Кто нибудь понимает что за хрень такая у меня?
0
apt-get remove php5-imagick выдает такую же хренотень… что не установлен:( Подскажите кто нибудь как полностью вычистить (убить) все связанное с imagemagick и Imagick? Что то у меня там слишком много всего устанавливалось, что в итоге ничего не установлено:)
0
В общем удалил все, поставил заново. Функции разрешил, проверил — не работает ни фига, даже в топиках gif не работает:( Эта задача мне не по зубам:(
0
Я рекомендую если на серваке ничего ценного нет перустановить систему и от этого отталкиваться. Со стандартной дебиановсой версией imagick в wheezy все должно прекрасно работать. Если это не баг движка.
0
Наверное так со временем и сделаю. inliquid как думаешь наверное есть смысл до php 5.5 обновиться? Посоветуй обновленную конфигурацию пожалуйста если не трудно.
0
Ну я с репозитория dotdeb.org все ставлю, php 5.5 — однозначно стоит.
Отредактирован:
0
Ребята, кто нибудь пытался разобраться с обработкой gif изображений? Так до сих пор нифига не работает анимация… причем везде. В аватарке и фото профиля не работает, в топиках и фотосетах тоже не работает:( О чем этот топик — о тонкой настройке загрузки изображений. На демо сайте demo.altocms.ru/new/ тоже анимация не работает:( demo.altocms.ru/new/25.html
Уже не за горами релиз 1.1 — а воз и ныне там…
+3
Вот здесь пишут, что это ошибка пакета php5-imagick версии 3.1.0RC1, а в версии 3.1.0RC2 якобы исправлено. Но ты, по-моему, писал, что разые версии ставил, и баг все равно проявляется. Видимо, какой-то кочующий баг, который и в более поздних версиях вылезает.

Но там же есть хак для обхода этого бага. На тестовом скрипте этот хак прокатил, попробую это в библиотеку добавить, посмотрю, что получится.
+3
И попутно еще баг вылез — стандартная PHP-функция mime_content_type() не всегда отдает верный тип контента, что тоже может приводить к проблемам.
Отредактирован:
+3
Упорство и труд все перетрут © Русская народная пословица
demo.altocms.com/new/25.html
+1
Браво Вадим! Подтверждаю demo.altocms.com/new/27.html Напиши пожалуйста в чем была причина и что нужно сделать чтобы все заработало? Спасибо тебе огромное за труды.
+2
Как выше писал, ключевая проблема в расширении php5-imagick. Анимированные изображения сохраняются функцией writeImages(), которая как раз и реализуется этим расширением. Но она работала некорректно и сохраняла только один фрейм из серии.

Я не стал пробовать разные версии, чтоб найти, где баг исправлен, а где нет, а стал искать обходные пути, как можно иначе сохранять в файле анимированные гифки (ведь не у всех есть возможность системные библиотеки обновлять), и нашел.

Плюс попутно обнаружился баг, когда MIME-тип картинки неверно определялся системной функцией mime_content_type(). Тут тоже пришлось обходными путями действовать.

Итого, чтоб заработало все корректно, нужно обновить файлы:
engine/libs/PHPixie/Image/Imagick.php
engine/include/functions/File.php
0
Заменил файлы, все отлично работает даже на моем imagick beta 3.3.0RC1, спасибо огромное!
0
Итого, чтоб заработало все корректно, нужно обновить файлы:
engine/libs/PHPixie/Image/Imagick.php
engine/include/functions/File.php


Откуда их обновлять? Если с https://github.com/altocms/altocms, то обновил, но проблема та же... gif не анимирована... а если загрузить gif через ftp и прямую ссылку дать, то все гуд... =( Что делать?

P.S. '@mime(gif)' => array(
'animation' => true,
прописал....
0
Помогите пожалуйста разобраться, почему не воспроизводится анимация:
1. Установил Alto CMS v.1.1.0-beta2 отсюда: github.com/altocms/altocms/releases
2. В файле common/config/config.php в строках 259 и 278 — 'animation' => true,
Что я упустил?
+3
Во-первых, лучше конфигурировать сайт через /app/config/config.local.php, тогда обновления будут проходить более гладко.

Во-вторых, не очень понятно, что же и где было изменено. Чтобы разрешить анимацию во всех загружаемых изображениях, достаточно в /app/config/config.local.php добавить следующее:
$config['module']['uploader']['images']['default'] = array(
    'transform' => array(
        '@mime(gif)'  => array(
            'animation' => true,
        ),
    ),
);
Но важный нюанс: для работы с анимацией на сервере должен быть установлен Imagick
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.