PHP imagecreatefrombmp 从BMP文件或URL新建一图像

所属分类: 网络编程 / PHP编程 阅读数: 595
收藏 0 赞 0 分享
大家都知道php GD库可方便的从URL新建一图像, GD中有imagecreatefromjpeg(),imagecreatefromPNG()....等之类的FUNCTION 可有时从URL中读取的切BMP图像而 可恨的是 GD2中切偏偏没有imageCreateFromBMP() 虽然有imagecreatefromWBMP() 但还是相差还是很远!
用下面FUNCTION可以方便解决
复制代码 代码如下:

function imagecreatefrombmp($file)
{
global $CurrentBit, $echoMode;
$f=fopen($file,"r");
$Header=fread($f,2);
if($Header=="BM")
{
$Size=freaddword($f);
$Reserved1=freadword($f);
$Reserved2=freadword($f);
$FirstByteOfImage=freaddword($f);
$SizeBITMAPINFOHEADER=freaddword($f);
$Width=freaddword($f);
$Height=freaddword($f);
$biPlanes=freadword($f);
$biBitCount=freadword($f);
$RLECompression=freaddword($f);
$WidthxHeight=freaddword($f);
$biXPelsPerMeter=freaddword($f);
$biYPelsPerMeter=freaddword($f);
$NumberOfPalettesUsed=freaddword($f);
$NumberOfImportantColors=freaddword($f);
if($biBitCount<24)
{
$img=imagecreate($Width,$Height);
$Colors=pow(2,$biBitCount);
for($p=0;$p<$Colors;$p++)
{
$B=freadbyte($f);
$G=freadbyte($f);
$R=freadbyte($f);
$Reserved=freadbyte($f);
$Palette[]=imagecolorallocate($img,$R,$G,$B);
}
if($RLECompression==0)
{
$Zbytek=(4-ceil(($Width/(8/$biBitCount)))%4)%4;
for($y=$Height-1;$y>=0;$y--)
{
$CurrentBit=0;
for($x=0;$x<$Width;$x++)
{
$C=freadbits($f,$biBitCount);
imagesetpixel($img,$x,$y,$Palette[$C]);
}
if($CurrentBit!=0) {freadbyte($f);}
for($g=0;$g<$Zbytek;$g++)
freadbyte($f);
}
}
}
if($RLECompression==1) //$BI_RLE8
{
$y=$Height;
$pocetb=0;
while(true)
{
$y--;
$prefix=freadbyte($f);
$suffix=freadbyte($f);
$pocetb+=2;
$echoit=false;
if($echoit)echo "Prefix: $prefix Suffix: $suffix<BR>";
if(($prefix==0)and($suffix==1)) break;
if(feof($f)) break;
while(!(($prefix==0)and($suffix==0)))
{
if($prefix==0)
{
$pocet=$suffix;
$Data.=fread($f,$pocet);
$pocetb+=$pocet;
if($pocetb%2==1) {freadbyte($f); $pocetb++;}
}
if($prefix>0)
{
$pocet=$prefix;
for($r=0;$r<$pocet;$r++)
$Data.=chr($suffix);
}
$prefix=freadbyte($f);
$suffix=freadbyte($f);
$pocetb+=2;
if($echoit) echo "Prefix: $prefix Suffix: $suffix<BR>";
}
for($x=0;$x<strlen($Data);$x++)
{
imagesetpixel($img,$x,$y,$Palette[ord($Data[$x])]);
}
$Data="";
}
}
if($RLECompression==2) //$BI_RLE4
{
$y=$Height;
$pocetb=0;
/*while(!feof($f))
echo freadbyte($f)."_".freadbyte($f)."<BR>";*/
while(true)
{
//break;
$y--;
$prefix=freadbyte($f);
$suffix=freadbyte($f);
$pocetb+=2;
$echoit=false;
if($echoit)echo "Prefix: $prefix Suffix: $suffix<BR>";
if(($prefix==0)and($suffix==1)) break;
if(feof($f)) break;
while(!(($prefix==0)and($suffix==0)))
{
if($prefix==0)
{
$pocet=$suffix;
$CurrentBit=0;
for($h=0;$h<$pocet;$h++)
$Data.=chr(freadbits($f,4));
if($CurrentBit!=0) freadbits($f,4);
$pocetb+=ceil(($pocet/2));
if($pocetb%2==1) {freadbyte($f); $pocetb++;}
}
if($prefix>0)
{
$pocet=$prefix;
$i=0;
for($r=0;$r<$pocet;$r++)
{
if($i%2==0)
{
$Data.=chr($suffix%16);
}
else
{
$Data.=chr(floor($suffix/16));
}
$i++;
}
}
$prefix=freadbyte($f);
$suffix=freadbyte($f);
$pocetb+=2;
if($echoit) echo "Prefix: $prefix Suffix: $suffix<BR>";
}
for($x=0;$x<strlen($Data);$x++)
{
imagesetpixel($img,$x,$y,$Palette[ord($Data[$x])]);
}
$Data="";
}
}
if($biBitCount==24)
{
$img=imagecreatetruecolor($Width,$Height);
$Zbytek=$Width%4;
for($y=$Height-1;$y>=0;$y--)
{
for($x=0;$x<$Width;$x++)
{
$B=freadbyte($f);
$G=freadbyte($f);
$R=freadbyte($f);
$color=imagecolorexact($img,$R,$G,$B);
if($color==-1) $color=imagecolorallocate($img,$R,$G,$B);
imagesetpixel($img,$x,$y,$color);
}
for($z=0;$z<$Zbytek;$z++)
freadbyte($f);
}
}
return $img;
}
fclose($f);
}
function freadbyte($f)
{
return ord(fread($f,1));
}
function freadword($f)
{
$b1=freadbyte($f);
$b2=freadbyte($f);
return $b2*256+$b1;
}
function freaddword($f)
{
$b1=freadword($f);
$b2=freadword($f);
return $b2*65536+$b1;
}
更多精彩内容其他人还在看

php链式操作的实现方式分析

这篇文章主要介绍了php链式操作的实现方式,结合实例形式对比分析了常规调用与链式调用操作的相关实现技巧与操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

php的优点总结 php有哪些优点

在本篇文章里小编给各位整理了关于php的优点的总结内容以及相关知识点整理,需要的朋友们学习下。
收藏 0 赞 0 分享

详解PHP 7.4 中数组延展操作符语法知识点

在本篇文章里小编给各位整理的是关于PHP 7.4 中数组延展操作符语法知识点内容,需要的朋友们参考学习下。
收藏 0 赞 0 分享

Smarty模板配置实例简析

这篇文章主要介绍了Smarty模板配置,结合实例形式简单分析了Smarty模板的功能、基本配置方法与相关操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

Smarty模板变量与调节器实例详解

这篇文章主要介绍了Smarty模板变量与调节器,结合实例形式详细分析了Smarty模板变量与调节器基本概念、分类、使用方法及相关操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

Smarty模板语法详解

这篇文章主要介绍了Smarty模板语法,结合实例形式详细分析了Smarty模板的注释、变量、引号、函数等基本语法与使用技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

PHP使用PDO、mysqli扩展实现与数据库交互操作详解

这篇文章主要介绍了PHP使用PDO、mysqli扩展实现与数据库交互操作,结合实例形式分析了PHP基于pdo和mysqli操作数据的相关使用技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

PHP抽象类和接口用法实例详解

这篇文章主要介绍了PHP抽象类和接口用法,结合实例形式详细分析了PHP面向对象程序设计中抽象类与接口的相关概念、原理、区别及使用技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

php实现 master-worker 守护多进程模式的实例代码

这篇文章主要介绍了php实现 master-worker 守护多进程模式的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
收藏 0 赞 0 分享

PHP defined()函数的使用图文详解

在本篇文章里小编给各位分享的是关于PHP defined()函数的使用图文内容,有需要的朋友们参考学习下。
收藏 0 赞 0 分享
查看更多