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语法(2)
Oct 09 PHP
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
Aug 21 PHP
在PHP中设置、使用、删除Cookie的解决方法
May 06 PHP
php 批量替换html标签的实例代码
Nov 26 PHP
php 判断服务器操作系统的类型
Feb 17 PHP
ThinkPHP表单自动提交验证实例教程
Jul 18 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
Apr 17 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
Jul 09 PHP
php验证码实现代码(3种)
Sep 07 PHP
PHP合并数组的2种方法小结
Nov 24 PHP
关于Laravel Route重定向的一个注意点
Jan 16 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
Sep 01 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
为了这两部电子管收音机,买了6套全新电子管和10粒刻度盘灯泡
2021/03/02 无线电
Thinkphp中的volist标签用法简介
2014/06/18 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
PHP图像处理类库及演示分享
2015/05/17 PHP
php精确的统计在线人数的方法
2015/10/21 PHP
php求数组全排列,元素所有组合的方法
2016/05/05 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
jquery $.ajax入门应用二
2008/11/19 Javascript
初学Jquery插件制作 在SageCRM的查询屏幕隐藏部分行的功能
2011/12/26 Javascript
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
超漂亮的Bootstrap 富文本编辑器summernote
2016/04/05 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
2016/12/13 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
解决jquery的ajax调取后端数据成功却渲染失败的问题
2018/08/08 jQuery
javascript实现贪吃蛇小练习
2020/07/05 Javascript
js实现全选和全不选
2020/07/28 Javascript
快速了解Python中的装饰器
2018/01/11 Python
python xlsxwriter库生成图表的应用示例
2018/03/16 Python
学习和使用python的13个理由
2019/07/30 Python
基于keras输出中间层结果的2种实现方式
2020/01/24 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
We Fashion荷兰:一家国际时装公司
2018/04/18 全球购物
Bose加拿大官方网站:美国知名音响品牌
2019/03/21 全球购物
幼儿园亲子活动方案
2014/01/29 职场文书
开学季活动策划方案
2014/02/28 职场文书
讲党性心得体会
2014/09/03 职场文书
中层干部考核评语
2015/01/04 职场文书
中国梦党课学习心得体会
2016/01/05 职场文书
微前端qiankun改造日渐庞大的项目教程
2022/06/21 Javascript
LyScript实现绕过反调试保护的示例详解
2022/08/14 Python