PHP处理bmp格式图片的方法分析


Posted in PHP onJuly 04, 2017

本文分析了PHP处理bmp格式图片的方法。分享给大家供大家参考,具体如下:

白天QA提出项目上传图片有问题,具体为:上传成功,预览失败。我去了之后,又上传了几张其他的图片可以上传,然后仔细问了下他上传的是哪张图片,看了后使用getimagesize函数打印了下。

Array
(
  [0] => 494
  [1] => 260
  [2] => 6
  [3] => width="494" height="260"
  [bits] => 24
  [mime] => image/x-ms-bmp
)

仔细看下,上面打印的数组,mime为image/x-ms-bmp,也就是bmp格式的,印象中php的gd库没有处理这个函数,后来我便在配置文件中,只要mime为这种的便不能上传。

晚上回来后,我便在网上查找php处理bmp相关方法,后来终于在stackoverflow中找到了,帖子里说进入官网的有关imagecreate的函数评论,有个ImageCreateFromBMP方法,先把bmp格式的文件给此函数调用,再用imagejpeg保存就行,后来试了下,发现imagepng也行,下面贴出代码。

<?php
function ImageCreateFromBMP($filename) {
  //Ouverture du fichier en mode binaire
  if (!$f1 = fopen($filename, "rb"))
    return FALSE;
  //1 : Chargement des ent�tes FICHIER
  $FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1, 14));
  if ($FILE['file_type'] != 19778)
    return FALSE;
  //2 : Chargement des ent�tes BMP
  $BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel' .
      '/Vcompression/Vsize_bitmap/Vhoriz_resolution' .
      '/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1, 40));
  $BMP['colors'] = pow(2, $BMP['bits_per_pixel']);
  if ($BMP['size_bitmap'] == 0)
    $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset'];
  $BMP['bytes_per_pixel'] = $BMP['bits_per_pixel'] / 8;
  $BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']);
  $BMP['decal'] = ($BMP['width'] * $BMP['bytes_per_pixel'] / 4);
  $BMP['decal'] -= floor($BMP['width'] * $BMP['bytes_per_pixel'] / 4);
  $BMP['decal'] = 4 - (4 * $BMP['decal']);
  if ($BMP['decal'] == 4)
    $BMP['decal'] = 0;
  //3 : Chargement des couleurs de la palette
  $PALETTE = array();
  if ($BMP['colors'] < 16777216) {
    $PALETTE = unpack('V' . $BMP['colors'], fread($f1, $BMP['colors'] * 4));
  }
  //4 : Cr�ation de l'image
  $IMG = fread($f1, $BMP['size_bitmap']);
  $VIDE = chr(0);
  $res = imagecreatetruecolor($BMP['width'], $BMP['height']);
  $P = 0;
  $Y = $BMP['height'] - 1;
  while ($Y >= 0) {
    $X = 0;
    while ($X < $BMP['width']) {
      if ($BMP['bits_per_pixel'] == 24)
        $COLOR = unpack("V", substr($IMG, $P, 3) . $VIDE);
      elseif ($BMP['bits_per_pixel'] == 16) {
        $COLOR = unpack("n", substr($IMG, $P, 2));
        $COLOR[1] = $PALETTE[$COLOR[1] + 1];
      } elseif ($BMP['bits_per_pixel'] == 8) {
        $COLOR = unpack("n", $VIDE . substr($IMG, $P, 1));
        $COLOR[1] = $PALETTE[$COLOR[1] + 1];
      } elseif ($BMP['bits_per_pixel'] == 4) {
        $COLOR = unpack("n", $VIDE . substr($IMG, floor($P), 1));
        if (($P * 2) % 2 == 0)
          $COLOR[1] = ($COLOR[1] >> 4);
        else
          $COLOR[1] = ($COLOR[1] & 0x0F);
        $COLOR[1] = $PALETTE[$COLOR[1] + 1];
      }
      elseif ($BMP['bits_per_pixel'] == 1) {
        $COLOR = unpack("n", $VIDE . substr($IMG, floor($P), 1));
        if (($P * 8) % 8 == 0)
          $COLOR[1] = $COLOR[1] >> 7;
        elseif (($P * 8) % 8 == 1)
          $COLOR[1] = ($COLOR[1] & 0x40) >> 6;
        elseif (($P * 8) % 8 == 2)
          $COLOR[1] = ($COLOR[1] & 0x20) >> 5;
        elseif (($P * 8) % 8 == 3)
          $COLOR[1] = ($COLOR[1] & 0x10) >> 4;
        elseif (($P * 8) % 8 == 4)
          $COLOR[1] = ($COLOR[1] & 0x8) >> 3;
        elseif (($P * 8) % 8 == 5)
          $COLOR[1] = ($COLOR[1] & 0x4) >> 2;
        elseif (($P * 8) % 8 == 6)
          $COLOR[1] = ($COLOR[1] & 0x2) >> 1;
        elseif (($P * 8) % 8 == 7)
          $COLOR[1] = ($COLOR[1] & 0x1);
        $COLOR[1] = $PALETTE[$COLOR[1] + 1];
      } else
        return FALSE;
      imagesetpixel($res, $X, $Y, $COLOR[1]);
      $X++;
      $P += $BMP['bytes_per_pixel'];
    }
    $Y--;
    $P+=$BMP['decal'];
  }
  //Fermeture du fichier
  fclose($f1);
  return $res;
}
$pic = '2.bmp';
$res = ImageCreateFromBMP($pic);
imagepng($res, '1.png');
imagejpeg($res, '1.jpeg');

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
phpMyAdmin 安装教程全攻略
Mar 19 PHP
php str_replace的替换漏洞
Mar 15 PHP
php htmlentities和htmlspecialchars 的区别
Aug 18 PHP
PHP中函数内引用全局变量的方法
Oct 20 PHP
PHP下一个非常全面获取图象信息的函数
Nov 20 PHP
第三章 php操作符与控制结构代码
Dec 30 PHP
php使用sql数据库 获取字段问题介绍
Aug 12 PHP
ThinkPHP验证码和分页实例教程
Aug 22 PHP
PHP按指定键值对二维数组进行排序的方法
Dec 22 PHP
PHP中抽象类和抽象方法概念与用法分析
May 24 PHP
PHP7创建销毁session的实例方法
Feb 03 PHP
php与阿里云短信接口接入操作案例分析
May 27 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
Jul 04 #PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
Jul 03 #PHP
PHP错误处理函数register_shutdown_function使用示例
Jul 03 #PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
Jul 03 #PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
Jul 03 #PHP
thinkPHP多表查询及分页功能实现方法示例
Jul 03 #PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
Jul 03 #PHP
You might like
php中$this-&amp;gt;含义分析
2009/11/29 PHP
linux下使用ThinkPHP需要注意大小写导致的问题
2011/08/02 PHP
制作个性化的WordPress登陆界面的实例教程
2016/05/21 PHP
javascript 播放器 控制
2007/01/22 Javascript
javascript 图片裁剪技巧解读
2012/11/15 Javascript
JS实现随机数生成算法示例代码
2013/08/08 Javascript
JS 有趣的eval优化输入验证实例代码
2013/09/22 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
JavaScript中Math对象方法使用概述
2014/01/02 Javascript
javascript实现带下拉子菜单的导航菜单效果
2015/05/14 Javascript
js兼容火狐获取图片宽和高的方法
2015/05/21 Javascript
jQuery 移动端artEditor富文本编辑器
2016/01/11 Javascript
Spring MVC中Ajax实现二级联动的简单实例
2016/07/06 Javascript
js实现各种复制到剪贴板的方法(分享)
2016/10/27 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
javascript闭包功能与用法实例分析
2017/04/06 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
jQuery UI实现动画效果代码分享
2018/08/19 jQuery
小程序实现展开/收起的效果示例
2018/09/22 Javascript
浅谈Node框架接入ELK实践总结
2019/02/22 Javascript
ES6 Class中实现私有属性的一些方法总结
2019/07/08 Javascript
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
Python实现将n个点均匀地分布在球面上的方法
2015/03/12 Python
基于python select.select模块通信的实例讲解
2017/09/21 Python
Python基于socket实现简单的即时通讯功能示例
2018/01/16 Python
详解python--模拟轮盘抽奖游戏
2019/04/12 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
浅析python内置模块collections
2019/11/15 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
THE OUTNET美国官网:国际设计师品牌折扣网站
2017/03/07 全球购物
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
构建高效课堂实施方案
2014/03/13 职场文书
《开国大典》教学反思
2014/04/19 职场文书
2014年维修工作总结
2014/11/22 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书