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 相关文章推荐
smarty 原来也不过如此~~呵呵
Nov 25 PHP
如何写php程序?
Dec 08 PHP
php网页后退不再出现过期
Mar 08 PHP
php获取mysql数据库中的所有表名的代码
Apr 23 PHP
php中长文章分页显示实现代码
Sep 29 PHP
ThinkPHP之N方法实例详解
Jun 20 PHP
php遍历解析xml字符串的方法
May 05 PHP
探究Laravel使用env函数读取环境变量为null的问题
Dec 06 PHP
Laravel下生成验证码的类
Nov 15 PHP
PHP CURL实现模拟登陆并上传文件操作示例
Jan 02 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 PHP
Laravel中获取IP的真实地理位置
Apr 01 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的可变变量名的使用方法分享
2012/02/05 PHP
PHP 类相关函数的使用详解
2013/05/10 PHP
PHP图像处理类库及演示分享
2015/05/17 PHP
Cygwin中安装PHP方法步骤
2015/07/04 PHP
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
2017/05/02 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
laravel手动创建数组分页的实现代码
2018/06/07 PHP
PHP项目多语言配置平台实现过程解析
2020/05/18 PHP
escape、encodeURI、encodeURIComponent等方法的区别比较
2006/12/27 Javascript
js判断是否为数组的函数: isArray()
2011/10/30 Javascript
jQuery事件绑定和委托实例
2014/11/25 Javascript
jQuery中的基本选择器用法学习教程
2016/04/14 Javascript
jQuery基于排序功能实现上移、下移的方法
2016/11/26 Javascript
新闻上下滚动jquery 超简洁(必看篇)
2017/01/21 Javascript
vue.js系列中的vue-fontawesome使用
2018/02/10 Javascript
javascript实现文本框标签验证的实例代码
2018/10/14 Javascript
JS原生瀑布流效果实现
2019/04/26 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
pandas的object对象转时间对象的方法
2018/04/11 Python
numpy中的delete删除数组整行和整列的实例
2018/05/09 Python
创建pycharm的自定义python模板方法
2018/05/23 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
2018/10/22 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
Python基础之函数的定义与使用示例
2019/03/23 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
html5 拖拽上传图片实例演示
2013/04/01 HTML / CSS
HTML5地理定位实例
2014/10/15 HTML / CSS
英国皇家邮政海外旗舰店:Royal Mail
2018/02/21 全球购物
介绍一下Make? 为什么使用make
2013/12/08 面试题
成龙霸王洗发水广告词
2014/03/14 职场文书
出国英文推荐信
2014/05/10 职场文书
保护环境建议书300字
2014/05/13 职场文书
感谢信范文大全
2015/01/23 职场文书
学习杨善洲同志先进事迹心得体会
2016/01/23 职场文书