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 相关文章推荐
Oracle 常见问题解答
Oct 09 PHP
一个用于网络的工具函数库
Oct 09 PHP
php.ini中date.timezone设置分析
Jul 29 PHP
PHP人民币金额数字转中文大写的函数代码
Feb 27 PHP
PHP zip扩展Linux下安装过程分享
May 05 PHP
destoon调用自定义模板及样式的公告栏
Jun 21 PHP
PHP实现文件下载断点续传详解
Oct 15 PHP
PHP中文编码小技巧
Dec 25 PHP
php通过排列组合实现1到9数字相加都等于20的方法
Aug 03 PHP
PHP编辑器PhpStrom运行缓慢问题
Feb 21 PHP
PHP实现的支付宝支付功能示例
Mar 26 PHP
php输出形式实例整理
May 05 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
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
php导出CSV抽象类实例
2014/09/24 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
2015/04/20 PHP
Symfony2框架创建项目与模板设置实例详解
2016/03/17 PHP
PHP针对字符串开头和结尾的判断方法
2016/07/11 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
PHP递归实现快速排序的方法示例
2017/12/18 PHP
JS中剪贴板兼容性、判断复制成功或失败
2021/03/09 Javascript
Nigma vs Alliance BO5 第五场2.14
2021/03/10 DOTA
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
js保留两位小数使用toFixed实现
2013/07/29 Javascript
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
JavaScript必知必会(九)function 说起 闭包问题
2016/06/08 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
微信小程序模板template简单用法示例
2018/12/04 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
2020/04/08 Javascript
手写Vue源码之数据劫持示例详解
2021/01/04 Vue.js
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python模拟事件触发机制详解
2018/01/19 Python
python基于物品协同过滤算法实现代码
2018/05/31 Python
python生成多个只含0,1元素的随机数组或列表的实例
2018/11/12 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
用python的turtle模块实现给女票画个小心心
2019/11/23 Python
numpy 声明空数组详解
2019/12/05 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
2020/06/18 Python
Dyson加拿大官方网站:购买戴森吸尘器,风扇,冷热器及配件
2016/10/26 全球购物
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
自荐信格式技巧有哪些呢
2013/11/19 职场文书
小学课改工作总结
2015/08/13 职场文书
高中议论文(范文2篇)
2019/08/19 职场文书
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js
Centos系统通过Docker安装并搭建MongoDB数据库
2022/04/12 MongoDB