Skip to content

Instantly share code, notes, and snippets.

@JohnCoates
Last active August 23, 2021 16:54
Show Gist options
  • Save JohnCoates/36c09cee1065ade42238 to your computer and use it in GitHub Desktop.
Save JohnCoates/36c09cee1065ade42238 to your computer and use it in GitHub Desktop.
extract PSIconsHighRes.dat & IconResources.idx - filetype: Photoshop Icon Resource Index 1.0

INSTRUCTIONS:

Put both files in a folder, then create a subfolder named "extracted". Run readPhotoshopIcons.php to extract images then run readPhotoshopIconNames.php to rename files to their correct names.

<?php
$filepath = "/Applications/Adobe Photoshop CC 2014/Adobe Photoshop CC 2014.app/Contents/Resources/IconResources.idx";
$headerMagic = "Photoshop Icon Resource Index 1.0\n";
$fp = fopen($filepath, "r");
$magic = fread($fp, strlen($headerMagic));
if ($magic != $headerMagic) {
exit("error: wrong magic");
}
// low res
$dat = fgets($fp);
echo $dat;
// high res
$dat = fgets($fp);
echo $dat;
$list = array();
while (!feof($fp)) {
$entry = fread ($fp, 208);
if( strlen($entry) != 208) {
break;
}
$name = substr($entry, 0, strpos($entry, "\0"));
$list[] = $name;
$offset = substr($entry, 112, 4);
$hex = bin2hex($offset);
$offset = unpack("V", $offset);
$offset = array_pop($offset);
echo "$name : $offset 0x$hex\n";
if ($offset == 0) {
continue;
}
$original = "./extracted/$offset.png";
if (file_exists($original)) {
rename($original, "./extracted/$name.png");
}
}
?>
<?php
$filepath = "/Applications/Adobe Photoshop CC 2014/Adobe Photoshop CC 2014.app/Contents/Resources/PSIconsHighRes.dat";
$fp = fopen($filepath, "r");
$pngBuffer = "";
$pngHeader = sprintf("%c%c%c%c%c%c%c%c", 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A);
$pngHeaderLength = strlen($pngHeader);
$count = 0;
global $pngOffset;
while (!feof($fp)) {
$char = fread($fp, 1);
// check for start of magic
if ($char != chr(0x89)) {
continue;
}
// backtrack 1
fseek($fp, -1, SEEK_CUR);
printf("checking for full header\n");
// check for full header
$search = fread($fp, $pngHeaderLength);
if ($search == $pngHeader) {
fseek ($fp, 0 - $pngHeaderLength, SEEK_CUR);
$pngFile = readPNGFile($fp);
}
// write out file
$pngfp = @fopen("extracted/$pngOffset.png", "x");
@fwrite($pngfp, $pngFile);
@fclose($pngfp);
$count++;
}
function readPNGFile($fp) {
global $pngHeader, $pngHeaderLength, $pngOffset;
$pos = ftell($fp);
$pngOffset = $pos;
echo "Reading PNG @ $pos\n";
$contents = fread($fp, $pngHeaderLength);
while ( ($chunk = readChunk($fp) ) ) {
$contents .= $chunk['data'];
if ($chunk['name'] == "IEND") {
break;
}
}
return $contents;
}
function readChunk($fp) {
$chunk = "";
// Read length
$length = fread($fp, 4);
$chunk .= $length;
// turn length into int
$length = unpack("N", $length);
$length = array_pop($length);
// Read chunk name
$name = fread($fp, 4);
$chunk .= $name;
printf("reading chunk $name with length %d\n", $length);
if ($length > 0) {
$chunk .= fread($fp, $length);
}
$crc = fread($fp, 4);
$chunk .= $crc;
return array("name" => $name, "data" => $chunk);
}
?>
@iamanojkumar
Copy link

how to run readPhotoshopIcons.php

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment