Попытаюсь объяснить буквально на пальцах, не прибегая к основному фрагменту кода. Есть скрипт, который читает в массив текстовый файл с записями иконок (тот что из клиента пв) и на основе этого должен разрезать файл с иконками на отдельные иконки, т.е. резалка. С использованием GD скрипт отлично выводит весть текстовый файл в массив, прогоняет по циклу и в итоге получаю отдельные иконки. В общем, решил заменить GD на imagemagick и... теперь скрипт срабатывает, но режет только первую иконку в массиве и все... Т.е. как только в цикле выполняется строчка: PHP: $image->cropImage($gtxt[0],$gtxt[1],$y,$x); Работа цикла прерывается, обрезается лишь первая иконка. В чем дело? Ведь с использованием GD массив через цикл весь проходит, а вот при imagemagick цикл обрабатывает лишь первый элемент массив и отрубается. Почему использование imagemagick стопорит цикл? Кстати в качестве цикла использую этот метод: PHP: foreach($listen as $index => $val) Ну и скриншоты с резкльтатами: GD - как видно массив нормально проходит через цикл ImageMagick - как только первый объект массива обработан, цикл прерывается... Довольное странно...
Тоже не удержался и нажал кнопку жалоба на пост. Может я бы и закрыл глаза на этот пост, но если бы его делал человек не из группы "программист". Но такой как вы позор для мморга. Суть вопроса не в том, чтоб понять что одна технология хуже другой, а совсем в другом, почему функции GD не влияют на процесс прохода массива через цикл, тогда как функции imagemagick влияют.
Друг мой, меньше агрессии, я специально написал OFFTOP, а не прямой ответ или оскорбление. (это Вам на будущее) Topic>Смотрите на цельность массива (если массив всё-же рабочий, то пробуйте вручную вырезать картинки (что бы узнать, работает ли сам имейджмейджик)). BONUS: Лучше прикладывать код, а не отдельные куски (а идеально было бы ДО и ПОСЛЕ), вместо того, что бы клепать картинки как БЫЛО и как ЕСТЬ.
массив рабочий и имейджик рабочий, он ведь вырезает первую иконку. Ну я думаю так, если человек имеет большой опыт, то он по идее уже знает о данном моменте и особенностях методов в GD и Imagemagick. Мои же попытки найти в гугле оказались напрасными, подобного метода использования имайджмагик никто не обсуждал (чтоб на основе массива текстового файла в цикле можно было делать операции по обрезки)
Мало что он выдает одну картинку, я говорю, попробуйте имитировать действия. Гениально конечно, и предыдущие данные я получу из названий переменных, верно?
Хорошо, вот два варианта кода, отличаются лишь тем что в одном изображениями манипулирует GD а во втором имайджмагик. --- добавлено: 25 окт 2014 в 13:04 --- для меня не столько принципиально заставить этот код работать с имаджмагик, столько хотелось бы понять, почему он отрубает процесс цикличности при обработке массива.
А что ты хотел? Выведи все ошибки и увидишь ошибку: Can not process empty Imagick object. И это логично ты же удалил объект Imagick в 20 строке.
для меня не столько принципиально заставить этот код работа Ты насчет этого? PHP: $image->destroy(); Без него то же самое, обрыв цикла на первом объекте массива...
дело в том, что файл с иконками весит около 8 мб и к посту не смогу его приложить (полетел тапок в сторону администрации форума =)) )) Но сам скрипт резалки можно скачать тут: http://mmorpg-devs.ru/threads/pw-iiset-Инструмент-для-обработки-иконок-игрового-клиента.17223/ скрипт резалки в папке iis там он у меня выполнен по GD методу, но ты легко сможешь изучить скрины с кодом что я выше давал и привести код к такому же виду с использованием имайджмагик. Файл с иконками и его тектстовик можно взять из клиента пв (распаковав соответствующий архив клиента)
Ну ты молодец. 1)У меня нет клиента. 2)Я прекрасно знаю как режутся эти иконки и нет желания еще что-то писать. P.S. Какой путь до файла указываешь? У меня с относительным не работает он.
файл с иконками и его текстовик в той же папке что и скрипт обработки. PHP: $fname = "iconlist_ivtrm"; $ficons="{$fname}.png"; $gtxt = file("{$fname}.txt"); $image = new Imagick($ficons); $s = 1; $listen = array_slice($gtxt, 4); for($i=0; $i<count($listen); $i++) { $str= substr($listen[$i], 0 , strrpos($listen[$i], ".")); ++$ii; ++$si; if($si > $gtxt[3]) {$s++; $si = 1;} $str_to = mb_convert_encoding($str, 'utf-8', 'gb2312'); $y = $s*$gtxt[0]-$gtxt[0]; $x = $si*$gtxt[1]-$gtxt[1];$image->cropImage($gtxt[0],$gtxt[1],$y,$x);$image->writeImage("result/{$str_to}.png");echo"{$ii}. {$str_to}.png<br>"; }?> Вот собственно код над которым я завис )) Правда в этом варианте я цикл теперь использую FOR, что увы не повлияло на результат.
PHP: <?php$fname = 'iconlist_ivtrf';$ficons = $fname.'.png';$gtxt = file($fname.'.txt');$s = 1;$listen = array_slice($gtxt, 4);$image = new Imagick();for($i=0; $i<count($listen); $i++){ $image->readImage($ficons); $str= substr($listen[$i], 0 , strrpos($listen[$i], ".")); ++$ii; ++$si; if($si > $gtxt[3]) {$s++; $si = 1;} $str_to = mb_convert_encoding($str, 'utf-8', 'gb2312'); $y = $s*$gtxt[0]-$gtxt[0]; $x = $si*$gtxt[1]-$gtxt[1]; $image->cropImage($gtxt[0], $gtxt[1], $x, $y); $image->writeImage($str_to.'.png'); echo $ii, '.', $str_to, '.png', '</br>';}
Просто нет слов. Включи ты уже вывод ошибок и посмотри на что ругается. http://img.quissa.ru/2014-10-25-15-28-00.jpg Я бы тебе не кинул не проверив на работоспособность.
увы, директива не работает 代码: error_reporting(E_ALL); --- добавлено: 25 окт 2014 в 16:38 --- заработал, но при запуске в консоли сервера --- добавлено: 25 окт 2014 в 16:47 --- ладно, для консоли собственно и задумывалось... но теория моя не подтвердилась, увы и на имайджмагик скрипт разрезки тоже работает не так быстро как хотелось бы... --- добавлено: 25 окт 2014 в 16:48 --- благодарю за помощь =)