当前位置: 代码迷 >> PHP >> 有没针对 fopen 打开的图片文件获取信息的函数解决方案
  详细解决方案

有没针对 fopen 打开的图片文件获取信息的函数解决方案

热度:563   发布时间:2012-04-22 18:34:46.0
有没针对 fopen 打开的图片文件获取信息的函数
getimagesize() 的传参是图片文件路劲
如果我只知道 tmpfile() 或 fopen() 返回的文件句柄怎么办呢
难道非要临时保存一下到硬盘上?



------解决方案--------------------
最好保存一下,如果不使用GD函数的话,那就复杂了,要自己解析图片二进制数据来得到他的原数据了。
比如这个解析png图片的。

/************************* png ****************************/

function _parsepng($file) 

//Extract info from a PNG file 
$f=fopen($file,'rb'); 
if(!$f) 
$this->Error('Can\'t open image file: '.$file); 
//Check signature 
if(fread($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) 
$this->Error('Not a PNG file: '.$file); 
//Read header chunk 
fread($f,4); 
if(fread($f,4)!='IHDR') 
$this->Error('Incorrect PNG file: '.$file); 
$w=$this->_freadint($f); 
$h=$this->_freadint($f); 
$bpc=ord(fread($f,1)); 
if($bpc>8) 
$this->Error('16-bit depth not supported: '.$file); 
$ct=ord(fread($f,1)); 
if($ct==0) 
$colspace='DeviceGray'; 
elseif($ct==2) 
$colspace='DeviceRGB'; 
elseif($ct==3) 
$colspace='Indexed'; 
else 
$this->Error('Alpha channel not supported: '.$file); 
if(ord(fread($f,1))!=0) 
$this->Error('Unknown compression method: '.$file); 
if(ord(fread($f,1))!=0) 
$this->Error('Unknown filter method: '.$file); 
if(ord(fread($f,1))!=0) 
$this->Error('Interlacing not supported: '.$file); 
fread($f,4); 
$parms='/DecodeParms <</Predictor 15 /Colors '.($ct==2 ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w.'>>'; 
//Scan chunks looking for palette, transparency and image data 
$pal=''; 
$trns=''; 
$data=''; 
do 

$n=$this->_freadint($f); 
$type=fread($f,4); 
if($type=='PLTE') 

//Read palette 
$pal=fread($f,$n); 
fread($f,4); 

elseif($type=='tRNS') 

//Read transparency info 
$t=fread($f,$n); 
if($ct==0) 
$trns=array(ord(substr($t,1,1))); 
elseif($ct==2) 
$trns=array(ord(substr($t,1,1)),ord(substr($t,3,1)),ord(substr($t,5,1))); 
else 

$pos=strpos($t,chr(0)); 
if($pos!==false) 
$trns=array($pos); 

fread($f,4); 

elseif($type=='IDAT') 

//Read image data block 
$data.=fread($f,$n); 
fread($f,4); 

elseif($type=='IEND') 
break; 
else 
fread($f,$n+4); 

while($n); 
if($colspace=='Indexed' && empty($pal)) 
$this->Error('Missing palette in '.$file); 
fclose($f); 
return array('w'=>$w,'h'=>$h,'cs'=>$colspace,'bpc'=>$bpc,'f'=>'FlateDecode','parms'=>$parms,'pal'=>$pal,'trns'=>$trns,'data'=>$data); 
}
  相关解决方案