I have created a function to parse the "rawOutput" because the information provided by this function is quite useless.
function parseIdentify($info) {
$lines = explode("\n", $info);
$outputs = [];
$output = [];
$keys = [];
$currSpaces = 0;
$raw = false;
foreach($lines as $line) {
$trimLine = trim($line);
if(empty($trimLine)) continue;
if($raw) {
preg_match('/^[0-9]+:\s/', $trimLine, $match);
if(!empty($match)) {
$regex = '/([\d]+):';
$regex .= '\s(\([\d|\s]{1,3},[\d|\s]{1,3},[\d|\s]{1,3},[\d|\s]{1,3}\))';
$regex .= '\s(#\w+)';
$regex .= '\s(srgba\([\d|\s]{1,3},[\d|\s]{1,3},[\d|\s]{1,3},[\d|\s|.]+\)|\w+)/';
preg_match($regex, $trimLine, $matches);
array_shift($matches);
$output['Image'][$raw][] = $matches;
continue;
}
else {
$raw = false;
array_pop($keys);
}
}
preg_match('/^\s+/', $line, $match);
$spaces = isset($match[0]) ? strlen($match[0]) : $spaces = 0;
$parts = preg_split('/:\s/', $trimLine, 2);
$_key = ucwords($parts[0]);
$_key = str_replace(' ', '', $_key);
$_val = isset($parts[1]) ? $parts[1] : [];
if($_key == 'Image') {
if(!empty($output)) {
$outputs[] = $output['Image'];
$output = [];
}
$_val = [];
}
if($spaces < $currSpaces) {
for($i = 0; $i < ($currSpaces - $spaces) / 2; $i++) {
array_pop($keys);
}
}
if(is_array($_val)) {
$_key = rtrim($_key, ':');
$keys[] = $_key;
if($_key == 'Histogram' || $_key == 'Colormap') {
$raw = $_key;
}
}
$currSpaces = $spaces;
$arr = &$output;
foreach($keys as $key) {
if(!isset($arr[$key])) {
$arr[$key] = $_val;
}
$arr = &$arr[$key];
}
if(!is_array($_val)) {
$arr[$_key] = $_val;
}
}
$outputs[] = $output['Image'];
return count($outputs) > 1 ? $outputs : $outputs[0];
}
Usage example:
$img = new Imagick('example.png');
$identify = parseIdentify($img->identifyImage(true)['rawOutput']);
But the "rawOutput" that this function returns only contains the first frame if it is a GIF. Alternatively you can use the command "identify" to get the data of all the frames:
$identify = parseIdentify(shell_exec('identify -verbose example.gif'));