Created
October 25, 2017 09:54
-
-
Save thomasstr/fd5dc9c1a4b5a3d9b6fc2e6de3b9947a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
function splitapng($data) { | |
$parts = array(); | |
// Save the PNG signature | |
$signature = substr($data, 0, 8); | |
$offset = 8; | |
$size = strlen($data); | |
while ($offset < $size) { | |
// Read the chunk length | |
$length = substr($data, $offset, 4); | |
$offset += 4; | |
// Read the chunk type | |
$type = substr($data, $offset, 4); | |
$offset += 4; | |
// Unpack the length and read the chunk data including 4 byte CRC | |
$ilength = unpack('Nlength', $length); | |
$ilength = $ilength['length']; | |
$chunk = substr($data, $offset, $ilength+4); | |
$offset += $ilength+4; | |
if ($type == 'IHDR') | |
$header = $length . $type . $chunk; // save the header chunk | |
else if ($type == 'IEND') | |
$end = $length . $type . $chunk; // save the end chunk | |
else if ($type == 'IDAT') | |
$parts[] = $length . $type . $chunk; // save the first frame | |
else if ($type == 'fdAT') { | |
// Animation frames need a bit of tweaking. | |
// We need to drop the first 4 bytes and set the correct type. | |
$length = pack('N', $ilength-4); | |
$type = 'IDAT'; | |
$chunk = substr($chunk,4); | |
$parts[] = $length . $type . $chunk; | |
} | |
} | |
// Now we just add the signature, header, and end chunks to every part. | |
for ($i = 0; $i < count($parts); $i++) { | |
$parts[$i] = $signature . $header . $parts[$i] . $end; | |
} | |
return $parts; | |
} | |
$filename = 'example.png'; | |
$handle = fopen($filename, 'rb'); | |
$filesize = filesize($filename); | |
$data = fread($handle, $filesize); | |
fclose($handle); | |
$parts = splitapng($data); | |
for ($i = 0; $i < count($parts); $i++) { | |
$handle = fopen("part-$i.png",'wb'); | |
fwrite($handle,$parts[$i]); | |
fclose($handle); | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment