Have a look at this skin template http://www.minecraftwiki.net/images/5/54/Skintemplate.png
Based on that the regions should be:
head x8 y8 w8 h8
body front x20 y20 w8 h12
arm front x44 y20 w4 h12
leg front x4 y20 w4 h12
You may need to flip the arm and leg sections in order to get the left and right to be mirrored.
header('Content-Type: image/png');
$scale = $size / 16;
$canvas = imagecreatetruecolor(16*$scale, 32*$scale);
$image = imagecreatefrompng($this->custom_skin($username));
imagealphablending($canvas, false);
imagesavealpha($canvas,true);
$transparent = imagecolorallocatealpha($canvas, 255, 255, 255, 127);
imagefilledrectangle($canvas, 0, 0, 16*$scale, 32*$scale, $transparent);
imagecopyresized($canvas, $image, 4*$scale, 0*$scale, 8, 8, 8*$scale, 8*$scale, 8, 8); //head
imagecopyresized($canvas, $image, 4*$scale, 8*$scale, 20, 20, 8*$scale, 12*$scale, 8, 12); //body
imagecopyresized($canvas, $image, 0*$scale, 8*$scale, 44, 20, 4*$scale, 12*$scale, 4, 12); //arm left
imagecopyresampled($canvas, $image, 12*$scale, 8*$scale, 47, 20, 4*$scale, 12*$scale, -4, 12); //arm right (flipped)
imagecopyresized($canvas, $image, 4*$scale, 20*$scale, 4, 20, 4*$scale, 12*$scale, 4, 12); //leg left
imagecopyresampled($canvas, $image, 8*$scale, 20*$scale, 7, 20, 4*$scale, 12*$scale, -4, 12); //leg right (flipped)
return imagepng($canvas);
The above is just from memory but it should point you in the right direction. You shouldn't use imagecopyresampled when upscaling since in this case you want to avoid interpolation.