Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Капризная картинка #3

Open
MasterShredder opened this issue Oct 1, 2013 · 19 comments
Open

Капризная картинка #3

MasterShredder opened this issue Oct 1, 2013 · 19 comments

Comments

@MasterShredder
Copy link

Данная картинка пока единственная из всего моего набора тестовых картинок, которая создаётся с глюком

Оригинал:
shaft

После ресайза (см. в левом верхнем углу):
2

@Yuriy-Khomenko
Copy link
Owner

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

@MasterShredder
Copy link
Author

Я сам бился над этим вопросом не одну неделю. Но не хватает знаний в области работы с изображениями, чтобы довести до ума это "почти нереализуемое" дело. Вся надежда теперь на вас)

Спасибо за ответ) Буду ждать

@Yuriy-Khomenko
Copy link
Owner

здравствуйте
я все еще в командировке но выпала свободная минута чтобы отписать.
"Похоже, это из-за того, что изображения создаются в 256 цветах, а не в true color"..........и так сперва немного теории: формат gif априори не поддерживает true color, только 256 битная палитра, но и ее хватает за глаза. разработчики библиотеки GD советуют использовать для данного типа вместо функции imagecreatetruecolor обычную imagecreate как ту что "дружит" с палитровыми изображениями. Мои эксперименты показали что и imagecreatetruecolor годится если работает в паре с функцией imagecopyresized, или imagecreate с imagecopyresampled.......результат будет один и то и без глюков, но если встречаются imagecopyresampled и imagecreatetruecolor то тут не без сюрпризов (мы говорим сейчас только о палитровых изображениях к которым относится и gif).
к чему это я все говорю........а вот к чему, ресайз основан на библиотеке GD, как и в предыдущих попытках отресайзить анимированные gif картинки я изменяю единичный фрейм именно с помощью этой библиотеки, а платформу готовит и снаряды подносит мой скрипт, мой скрипт отличается от предыдущих попыток тем, что я всю эту подготовку делаю непосредственно руками не прибегая к библиотеке GD которая как выяснилось является ОЧЕНЬ сырым и нестабильным продуктом хотя и входит в стандартный набор PHP, там где было без библиотеки не обойтись приходилось использовать ее, но я также понимал что она (библиотека GD) из за своей кривости ограничивала меня своими рамками.........если бы я реализовал тот функционал GD который я использовал, это то же самое что написать свою полновесную графическую библиотеку правда на PHP (а из этого следует возможная тормознутость), хотя у меня там и так парочка хаков дабы выровнять кривые руки GD.
еще раз ..........к чему это .........а к тому что все возможные глюки это наследие библиотеки GD, за логику работы скрипта я ручаюсь, с первого релиза 1,02 все последующие версии логика вообще не поменялась, а только увеличивалась всеядность скрипта (файлы с грубыми ошибками, файлы не соответствовавшие стандарту и тд), и докотилось до того что скрипт приводит внутреннюю структуру файла к минимальным требованиям стандарта.
теперь к вашему случаю...........по скриншотах я могу предположить что вы не использоваль флаг ресемплирования/интерполяции в моем примере который я дал в коментах скрипта
require_once "gif_exg.php";
$nGif = new GIF_eXG("../image/src.gif",1);
$nGif->resize("../image/dst1.gif",180,180,1,0);
$nGif->resize("../image/dst2.gif",150,150,0,0);

он передается последним параметром, и на примере отключен.........просто установите его, примерно так.....

$nGif->resize("../image/dst1.gif",180,180,1,1);
$nGif->resize("../image/dst2.gif",150,150,0,1);

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

@MasterShredder
Copy link
Author

Ресемплинг использовал, качество улучшается, но к сожалению, половину картинок это приводит в негодный вид, начинаются эффекты а-ля "испорченный телевизор". Другими словами: одно лечит, другое калечит, и искалеченных картинок в этом случае оказывается чуть ли не половина

Использовал, к примеру, Gifresizer от Taha Paksu: http://www.phpclasses.org/package/7353-PHP-Resize-animations-in-files-of-the-GIF-format.html
Недостатки:

  1. Тяжёл (в плане нагрузки на сервер).
  2. Качество получающихся картинок аналогично плохое
  3. Некоторые анимации почему-то теряли у меня синхронизацию кадров (даже в примере самого автора с котом, слушающим музыку - изображение прыгает вверх и вниз, в оригинале этого нет)
  4. Кажется, там ещё и проблемы с палитрой в некоторых случаях...
  5. При всём при этом - скрипт довольно объёмен. Т.е. объёма много, а результата почти нет (неудовлетворительный результат)

Из других способов:

  • комбинация gifencoder/gifdecoder (про этот способ вы тоже писали в своей статье - http://habrahabr.ru/post/186084/ )
  • Image Workshop
    и т.д.

Есть ещё некая библиотека под названием Imagine, и из их обсуждений следует, что там добавлена поддержка ресайза анимаций: php-imagine/Imagine#213
Но я эту библиотеку вообще не смог запустить, к тому же из их обсуждений я так наверняка и не понял, была ли добавлена поддержка для GD или только Imagemacick опять. Скорее всего, второе

Все сейчас уже не вспомню, потому что было это в начале лета, и я искал все возможные библиотеки для ресайза через GD, которые смог через гугл найти, как по английским ключевым словам, так и по русским. Но у всех у них примерно те же недостатки в различных комбинациях. И ни в одном случае мне так и не удалось сделать imagecreatetruecolor вместо imagecreate, потому что с imagecreate получаются довольно низкокачественные копии по сравнению с оригиналом, а если использовать imagecreatetruecolor, то начинаются жуткие баги с палитрой, прозрачностью и вообще с графикой во многих изображениях. Недавно сохранил себе некоторые статьи по этим вопросам, но пока так и не проверял:
http://stackoverflow.com/questions/11912077/why-is-a-gif-image-losing-its-transparency-with-imagegif-even-when-i-set-the-a
http://www.sitepoint.com/forums/showthread.php?437800-Counter-PHP-GD-transparent-gif-copy
http://xpoint.ru/forums/programming/PHP/thread/26846.xhtml#256444
Предполагаю, что ничего нового это всё равно не даст, что всё упрётся, как вы сказали, в непреодолимые ограничения глючной библиотеки GD, и в итоге придётся выбирать между говнокачеством и битыми файлами... Хотя конечно бы не хотелось. Пока остаётся надежда, что чудо ещё возможно.

Пример этой же картинки с ресемплингом:
2

@vpArth
Copy link

vpArth commented Oct 18, 2013

Почему бы не отказаться от "кривой" GD в пользу, скажем ImageMagick?

@Yuriy-Khomenko
Copy link
Owner

почему не ImageMagick, потому что было поставлено условие ресайзить стандартными средствами отказавшись от внешних модулей, если вы без проблем можете подключить ImageMagick то вот ссылка на класс ресайза через ImageMagick https://gist.github.com/makoni/1080919

19.10.2013, 03:55, "vpArth" notifications@github.com:

Почему бы не отказаться от "кривой" GD в пользу, скажем ImageMagick?


Reply to this email directly or view it on GitHub.

@MasterShredder
Copy link
Author

Насколько я знаю, для ImageMagick вообще не нужны классы, т.к. ресайз gif-анимаций там работает по умолчанию.

@Yuriy-Khomenko
Copy link
Owner

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

19.10.2013, 13:47, "MasterShredder" notifications@github.com:

Насколько я знаю, для ImageMagick вообще не нужны классы, т.к. ресайз gif-анимаций там работает по умолчанию.


Reply to this email directly or view it on GitHub.

@MasterShredder
Copy link
Author

К сожалению, более половины картинок разрушаются из моего тестового набора. Приложил весь набор в архиве. Потестируйте сами, если будет возможность.
http://www.phpbb-work.ru/resources/file/69

@Yuriy-Khomenko
Copy link
Owner

все оттестил все нормально работает, используйте последнюю версию класса а также посмотрите на связку php + gd (версия, коректность настройки/установки)

14.12.2013, 11:06, "MasterShredder" notifications@github.com:

К сожалению, более половины картинок разрушаются из моего тестового набора. Приложил весь набор в архиве. Потестируйте сами, если будет возможность.
http://www.phpbb-work.ru/resources/file/69


Reply to this email directly or view it on GitHub.

@MasterShredder
Copy link
Author

Версия последняя - 1.07. Уже по-всякому пробовал - рубит половину картинок при ресемплинге... Настройки и информация о php+gd ниже. Что ещё можете посоветовать?

PHP Version 5.4.4-14+deb7u7

GD Support enabled
GD Version 2.0
FreeType Support enabled
FreeType Linkage with freetype
FreeType Version 2.4.9
GIF Read Support enabled
GIF Create Support enabled
JPEG Support enabled
libJPEG Version unknown
PNG Support enabled
libPNG Version 1.2.49
WBMP Support enabled

gd.jpeg_ignore_warning 0 0

@MasterShredder
Copy link
Author

Так, проверил на другом сервере, ресемплинг работает корректно (по крайней мере, без искажений палитры). Параметры сервера ниже. Что можете сказать по предыдущим параметрам (см. предыдущий пост), почему там искажается палитра?

PHP Version 5.2.10

GD Support enabled
GD Version bundled (2.0.34 compatible)
FreeType Support enabled
FreeType Linkage with freetype
FreeType Version 2.2.1
GIF Read Support enabled
GIF Create Support enabled
JPG Support enabled
PNG Support enabled
WBMP Support enabled
XBM Support enabled

@Yuriy-Khomenko
Copy link
Owner

тут можно только догадываться, но изначальная разработка была под библиотеку GD версии 2.0.34, что собственно и написано в паспорте класса, с последующим тестом под версию 2.1.0............. та том сервере где рубит картинки в GD версия 2.0 (если вы точно указали), возможно в этом проблема, другой проблемы лично я не вижу, но я в этом (настройки всей связки PHP) не эксперт

15.12.2013, 11:46, "MasterShredder" notifications@github.com:

Так, проверил на другом сервере, ресемплинг работает корректно (по крайней мере, без искажений палитры). Параметры сервера ниже. Что можете сказать по предыдущим параметрам (см. предыдущий пост), почему там искажается палитра?

PHP Version 5.2.10

GD Support enabled
GD Version bundled (2.0.34 compatible)
FreeType Support enabled
FreeType Linkage with freetype
FreeType Version 2.2.1
GIF Read Support enabled
GIF Create Support enabled
JPG Support enabled
PNG Support enabled
WBMP Support enabled
XBM Support enabled


Reply to this email directly or view it on GitHub.

@MasterShredder
Copy link
Author

Проверил ещё на одном сервере с версией GD 2.0.34 - норм. Да, похоже что дело в этом.

По поводу проблемной картинки (shaft.gif): это реально побороть?
Также заметил небольшое искажение в другой картинке - s.gif, на обоих серверах. Особенно это заметно по контуру картинки

@Yuriy-Khomenko
Copy link
Owner

  1. Сервера потихоньку переезжают на GD 2.1 где вы нашли такой сервер на котором стоит настолько старая библиотека GD ума не приложу.
  2. Проблемы с shaft.gif проверял на ImageMagick а также на онлайн сервисах по ресайзу анимированных gif файлов (вероятно и там ImageMagick стоит), и всюду один и тот же результат, один в один с ресайзом через мой клас. Причина здесь в разном округлении отдельных фреймов, одни в меньшую сторону другие в большую так как пиксели это целое число, особо это заметно на сильно оптимизированных картинках. Аналогично обстоят дела и с s.gif. Уже хотел отписать что тут ничего нельзя сделать, только мирится и терпеть, но решил проверить в специализированной программе Ulead Gif Animator (кстати немногие программы для работы с gif файлами дают возможность изменять размеры анимированным картинкам) и о чудо, как я не издевался с тестовыми образцами (симметрия, не симметрия, размер и тд) всюду был корректный результат. Другими словами можно, нет пределу совершенству. Ну что же, надо будет выделить когда то свободное время и изучить этот вопрос, но когда тут я не могу сказать, но займусь этим обязательно.
  3. А я вижу вы перфекционист )))) так держать.

@MasterShredder
Copy link
Author

  1. Как ни странно, она стоит на сервере моего хостера. Спрошу у него, откуда, т.к. другое ПО там всё новое
  2. Проверяю на ImageMagick и у меня всё в порядке - картинка уменьшается идеально. Может, тоже от версии зависит? Надо тоже на разных серверах посмотреть. Картинку, уменьшенную через Imagemagick и скрин с настройками модуля (версия 3.0.1) приложил

clip_20
shaft

@Yuriy-Khomenko
Copy link
Owner

проанализировал вашу "идеальную" картинку, что сказать ImageMagick убил всю оптимизацию, теперь это набор сплошных фреймов (увсех один размер), ваша картинка занимает 220 кб, аналогичная из Ulead Gif Animator занимает 100, через мой класс 120 (с не включенным ресемплингом, с включенным будет немного больше но все же не 220), другими словами ровняться буду на Ulead Gif Animator, уже есть некоторые варианты как обойти данный косяк

04.01.2014, 04:22, "MasterShredder" notifications@github.com:

  • Как ни странно, она стоит на сервере моего хостера. Спрошу у него, откуда, т.к. другое ПО там всё новое
  • Проверяю на ImageMagick и у меня всё в порядке - картинка уменьшается идеально. Может, тоже от версии зависит? Надо тоже на разных серверах посмотреть. Картинку, уменьшенную через Imagemagick и скрин с настройками модуля (версия 3.0.1) приложил


Reply to this email directly or view it on GitHub.

@Yuriy-Khomenko
Copy link
Owner

посмотрите внимательно (я не эксперт в ImageMagick, просто догадка), может вы не те настройки выставили в ImageMagick, что он такие объемные файлы формирует

@MasterShredder
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants