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


Posted in PHP onJuly 16, 2012

大家都知道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&amp;mysql(二)
Oct 09 PHP
PHP实现多服务器session共享之NFS共享的方法
Mar 16 PHP
PHP 数组排序方法总结 推荐收藏
Jun 30 PHP
php学习笔记 数组遍历实现代码
Jun 09 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
Jul 22 PHP
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
Jun 03 PHP
php模板引擎技术简单实现
Mar 15 PHP
CI框架中数据库操作函数$this-&gt;db-&gt;where()相关用法总结
May 17 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
Laravel学习基础之migrate的使用教程
Oct 11 PHP
PHP分页显示的方法分析【附PHP通用分页类】
May 10 PHP
PHP面向对象程序设计之对象的遍历操作示例
Jun 12 PHP
php生成略缩图代码
Jul 16 #PHP
ThinkPHP 连接Oracle数据库的详细教程[全]
Jul 16 #PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
Jul 15 #PHP
在项目中寻找代码的坏命名
Jul 14 #PHP
注册页面之前先验证用户名是否存在的php代码
Jul 14 #PHP
php学习之function的用法
Jul 14 #PHP
php 操作调试的方法
Jul 12 #PHP
You might like
丧钟首部独立剧集《丧钟:骑士与龙》北美正式开播,场面血腥
2020/04/09 欧美动漫
php pack与unpack 摸板字符字符含义
2009/10/29 PHP
PHP STRING 陷阱原理说明
2010/07/24 PHP
百万级别知乎用户数据抓取与分析之PHP开发
2015/09/28 PHP
PHP实现递归无限级分类
2015/10/22 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
多广告投放代码 推荐
2006/11/13 Javascript
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
Enter回车切换输入焦点实现思路与代码兼容各大浏览器
2014/09/01 Javascript
jquery特效 点击展示与隐藏全文
2015/12/09 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
2016/11/21 Javascript
详解获取jq ul第一个li定位的四种解决方案
2016/11/23 Javascript
vue防止花括号{{}}闪烁v-text和v-html、v-cloak用法示例
2019/03/13 Javascript
vue滑动吸顶及锚点定位的示例代码
2020/05/10 Javascript
Python下的常用下载安装工具pip的安装方法
2015/11/13 Python
Python检测网站链接是否已存在
2016/04/07 Python
python实现的正则表达式功能入门教程【经典】
2017/06/05 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
2018/05/24 Python
Python分割指定页数的pdf文件方法
2018/10/26 Python
python实现K近邻回归,采用等权重和不等权重的方法
2019/01/23 Python
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
在Python中预先初始化列表内容和长度的实现
2019/11/28 Python
python爬虫容易学吗
2020/06/02 Python
Python request中文乱码问题解决方案
2020/09/17 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
预备党员的自我评价
2014/03/12 职场文书
最美家庭活动方案
2014/08/31 职场文书
2014年教师节国旗下讲话稿
2014/09/10 职场文书
防汛通知
2015/04/25 职场文书
城南旧事电影观后感
2015/06/16 职场文书
六年级语文教学反思
2016/03/03 职场文书
Android实现获取短信验证码并自动填充
2023/05/21 Java/Android