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 相关文章推荐
pdo中使用参数化查询sql
Aug 11 PHP
php+iframe实现隐藏无刷新上传文件
Feb 10 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
Jun 27 PHP
部署PHP项目应该注意的几点事项分享
Dec 20 PHP
PHP进程同步代码实例
Feb 12 PHP
PHP 获取指定地区的天气实例代码
Feb 08 PHP
php查找字符串中第一个非0的位置截取
Feb 27 PHP
laravel 中如何使用ajax和vue总结
Aug 16 PHP
PHP设计模式之工厂模式详解
Oct 24 PHP
php格式文件打开的四种方法
Feb 24 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
Feb 20 PHP
Laravel框架实现的使用smtp发送邮件功能示例
Mar 12 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中的字符串函数
2006/10/09 PHP
E路文章系统PHP
2006/12/11 PHP
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
解析zend studio中直接导入svn中的项目的方法步骤
2013/06/21 PHP
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
基于php的微信公众平台开发入门实例
2015/04/15 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
淘宝搜索框效果实现分析
2011/03/05 Javascript
js登录弹出层特效
2014/03/07 Javascript
调用jQuery滑出效果时闪烁的解决方法
2014/03/27 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
canvas 绘制圆形时钟
2017/02/22 Javascript
JS判断时间段的实现代码
2017/06/14 Javascript
Vue侧滑菜单组件——DrawerLayout
2017/12/18 Javascript
angular2 组件之间通过service互相传递的实例
2018/09/30 Javascript
JS实现提示效果弹出及延迟隐藏的功能
2019/08/26 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
vue3实现v-model原理详解
2019/10/09 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
Python中使用Inotify监控文件实例
2015/02/14 Python
python递归查询菜单并转换成json实例
2017/03/27 Python
Python基于Faker假数据构造库
2020/11/30 Python
AmazeUi Tree(树形结构) 应用小结
2020/08/17 HTML / CSS
HTML5中input输入框默认提示文字向左向右移动的示例代码
2020/09/10 HTML / CSS
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
澳大利亚最早和最古老的巨型游戏专家:Yardgames
2020/02/20 全球购物
Servlet如何得到客户端机器的信息
2014/10/17 面试题
安全资金保障制度
2014/01/23 职场文书
明星员工获奖感言
2014/08/14 职场文书
支部书记四风问题自我剖析材料
2014/09/29 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
浅谈PostgreSQL表分区的三种方式
2021/06/29 PostgreSQL
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers