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中将ip地址转成十进制数的两种实用方法
Aug 15 PHP
PHP的PSR规范中文版
Sep 28 PHP
PHP中的插件机制原理和实例
Jul 08 PHP
php中把美国时间转为北京时间的自定义函数分享
Jul 28 PHP
简单解决新浪SAE无法上传文件的问题
May 13 PHP
使用ltrace工具跟踪PHP库函数调用的方法
Apr 25 PHP
浅谈PHP eval()函数定义和用法
Jun 21 PHP
简单谈谈PHP中的Reload操作
Dec 12 PHP
PHP实现Redis单据锁以及防止并发重复写入
Apr 10 PHP
laravel 之 Eloquent 模型修改器和序列化示例
Oct 17 PHP
Laravel 前端资源配置教程
Oct 18 PHP
详细分析PHP7与PHP5区别
Jun 26 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
利用PHP制作简单的内容采集器的代码
2007/11/28 PHP
php header Content-Type类型小结
2011/07/03 PHP
php 邮件发送问题解决
2014/03/22 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
php实现的替换敏感字符串类实例
2014/09/22 PHP
php源码 fsockopen获取网页内容实例详解
2016/09/24 PHP
JavaScript修改css样式style
2008/04/15 Javascript
jQuery 操作下拉列表框实现代码
2010/02/22 Javascript
this和执行上下文实现代码
2010/07/01 Javascript
关于js new Date() 出现NaN 的分析
2012/10/23 Javascript
JS打开层/关闭层/移动层动画效果的实例代码
2013/05/11 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
javascript实现动态侧边栏代码
2014/02/19 Javascript
谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法
2015/12/03 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
微信小程序按钮点击动画效果的实现
2019/09/04 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
JS JQuery获取data-*属性值方法解析
2020/09/01 jQuery
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
2017/09/08 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
python write无法写入文件的解决方法
2019/01/23 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
介绍一下JNDI的基本概念
2013/07/26 面试题
西北政法大学自主招生自荐信
2014/01/29 职场文书
工会换届选举方案
2014/05/21 职场文书
运动会加油口号
2014/06/07 职场文书
中学生思想品德评语
2014/12/31 职场文书
小学运动会入场词
2015/07/18 职场文书