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 相关文章推荐
Drupal7 form表单二次开发要点与实例
Mar 02 PHP
Yii框架关联查询with用法分析
Dec 02 PHP
利用PHP将部分内容用星号替换
Apr 21 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
Aug 31 PHP
10个值得深思的PHP面试题
Nov 14 PHP
PHP实现的登录,注册及密码修改功能分析
Nov 25 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
Jan 07 PHP
PHP基于自定义函数实现的汉字转拼音功能实例
Sep 30 PHP
PHP 断点续传实例详解
Nov 11 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
Sep 03 PHP
laravel框架的安装与路由实例分析
Oct 11 PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 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 GD 图像处理组件的常用函数总结
2010/04/28 PHP
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
jquery实现树形二级菜单实例代码
2013/11/20 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
JS版元素周期表实现方法
2015/08/05 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
2016/03/11 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
2016/08/17 Javascript
Web前端开发之水印、图片验证码
2016/11/27 Javascript
javascript 中关于array的常用方法详解
2017/05/05 Javascript
实战node静态文件服务器的示例代码
2018/03/08 Javascript
python实现的用于搜索文件并进行内容替换的类实例
2015/06/28 Python
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
python tkinter窗口最大化的实现
2019/07/15 Python
pycharm新建一个python工程步骤
2019/07/16 Python
Django models.py应用实现过程详解
2019/07/29 Python
python调用c++返回带成员指针的类指针实例
2019/12/12 Python
python数据类型可变不可变知识点总结
2020/03/06 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
Python计算矩阵的和积的实例详解
2020/09/10 Python
Python实现石头剪刀布游戏
2021/01/20 Python
土耳其新趋势女装购物网站:Addax
2020/01/07 全球购物
建筑专业自荐信范文
2014/01/05 职场文书
小型女装店的创业计划书
2014/01/09 职场文书
班级安全教育实施方案
2014/02/23 职场文书
导游个人求职信
2014/04/25 职场文书
论文指导教师评语
2014/04/28 职场文书
我的中国梦演讲稿500字
2014/08/19 职场文书
党的群众路线教育实践活动个人整改方案
2014/09/21 职场文书
公司财务人员岗位职责
2015/04/14 职场文书
幼儿园庆六一主持词
2015/06/30 职场文书
跳高加油稿
2015/07/21 职场文书
golang中实现给gif、png、jpeg图片添加文字水印
2021/04/26 Golang
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB
详解python的异常捕获
2022/03/03 Python