note 14466 deleted from function.getimagesize by jimw

From: 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]\""); }

« previous php.notes (#22473) next »