note 14466 deleted from function.getimagesize by jimw
| From: | jimw@php.net | Date: | Mon, 10 Dec 2001 23:32:32 +0000 |
| Subject: | note 14466 deleted from function.getimagesize by jimw | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-22473@lists.php.net to get a copy of this message | ||
<P>
As was mentioned before, GetImageSize() has trouble with certain images, specifically jpeg's
generated by digital cameras. I have one of the problematic cameras, and was building an image
display script in php when I ran into this problem.
<p>
So I wrote a work around. Here's ReallyGetImageSize() which should be a drop in replacement
for GetImageSize().
<p>
here it is:
function ReallyGetImageSize($filename)
{
// First see if GetImageSize can process the file
$size = GetImageSize($filename);
if($size[0] == 0 && $size[1] == 0){
// If that failed, try the hard way
// make sure it's a jpeg
$extension = explode(".",$filename);
$extension = $extension[sizeof($extension)-1];
$extension = strtolower($extension);
if(($extension != "jpg") && ($extension != "jpeg")){
// not a jpeg, give up
return array(0, 0, 0, "");·
}
$stream = @fopen($filename, "rb");
if(!$stream){
echo ("error opening $filename");
return array(0, 0, 0, "");·
}
$bytes = fread($stream, 2);
$bytes = unpack("Cchar1/Cchar2", $bytes);
if($bytes["char1"] != 0xff || $bytes["char2"] != 0xd8){
echo ("wrong file magic in $filename");
return array(0, 0, 0, "");·
}
while (1){
$length = 4;
$segheader = fread($stream, $length);
# Extract the segment header.
$seginfo = unpack("Cmarker/Ccode/nlength", $segheader);
printf("Marker = %02x, Code = %02x, Length = %d\n",
$seginfo["marker"], $seginfo["code"],
$seginfo["length"]);
# Verify that it's a valid segment.
if ($seginfo["marker"] != 0xFF){
# Was it there?
echo "JPEG marker not found";
break;
} else if (($seginfo["code"]>=0xC0) &&
($seginfo["code"]<0xC4)){
# Segments that contain size info
$length = 5;
$header = fread($stream, $length);
$sizeinfo = unpack("Cfoo/nheight/nwidth", $header);
$size[0] = $sizeinfo["width"];
$size[1] = $sizeinfo["height"];
$size[2] = 2;
break;
} else {
# Dummy read to skip over data
$length = $seginfo["length"] - 2;
fseek($stream, $length, SEEK_CUR);
}
}
}
return array($size[0], $size[1], $size[2],·
"width=\"$size[0]\" height=\"$size[1]\"");
}