Илья777
Новичок
Здравствуйте, Уважаемые!
Задача довольно специфическая. Делаю карту для браузерной игры, состоящую из квадратиков со сторонами 100x100 пикселов.
В случаях, если изображение статическое - прекрасно работает скрипт,использующий GD:
Но, в моём случае, мне необходимо сделать то-же самое - но с большой анимированной картинкой.
Попробовал реализовать сходный функционал с помощью Imagick:
Получается полная ахинея....

Уважаемые, подскажите, пожалуйста, что я сделал не так?
Задача довольно специфическая. Делаю карту для браузерной игры, состоящую из квадратиков со сторонами 100x100 пикселов.
В случаях, если изображение статическое - прекрасно работает скрипт,использующий GD:
PHP:
$i = 0;
//- Путь к файлу карты
$im = imagecreatefromjpeg("125.jpeg");
for ($x=0;$x<58;$x++) // количество клеток вертикаль
for ($y=0;$y<58;$y++){ // количество клеток горизонталь
//- Тут и ниже измени путь куда сохранять будешь, если файла не будет существовать - будет создание нового)
if (!file_exists($_SERVER["DOCUMENT_ROOT"]."/map2/day2/".($x)."_".($y).".jpg"))
{
$id = imagecreatetruecolor(100,100);
imagecopy($id,$im,0,0,100*$x,$y*100,100,100);
Imagejpeg($id,$_SERVER["DOCUMENT_ROOT"]."/images/map2/day2/".($x)."_".($y).".jpg",100);
}
$i++;
}
//- тест
echo $i;
Но, в моём случае, мне необходимо сделать то-же самое - но с большой анимированной картинкой.
Попробовал реализовать сходный функционал с помощью Imagick:
PHP:
<?php
set_time_limit(0);
ini_set("memory_limit", "24G");
$i = 0;
//- Путь к файлу карты
$imagick = new Imagick('source.gif');
for ($x=0;$x<28;$x++) // количество клеток вертикаль
for ($y=0;$y<51;$y++){ // количество клеток горизонталь
//- Тут и ниже измени путь куда сохранять будешь, если файла не будет существовать - будет создание нового)
// Разбить gif анимацию на изображение
$imagick = $imagick->coalesceImages();
if (!file_exists("".($x)."_".($y).".gif"))
{
// Обрезка изображений одно за другим
do {
// Первые две пары-это ширина и высота урожая, а третья и четвертая-начальные точки
// Например, если последние два параметра равны 0,0, это означает, что обрезка начнется с верхнего левого угла
$imagick->cropImage(100,100,$x,$y);
// После обрезки на изображении остается некоторое пустое пространство, так как холст изображения остался того же размера
// Эта функция изменяет размер холста изображения и таким образом устраняет пустое пространство
$imagick->setImagePage(100,100,$x,$y);
} while ($imagick->nextImage());
// Собираем анимацию заново
$imagick = $imagick->deconstructImages();
$imagick->writeImage("gif:".($x)."_".($y).".gif");
}
$i++;
}
//- тест
echo $i;
?>

Уважаемые, подскажите, пожалуйста, что я сделал не так?