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 相关文章推荐
PHP日期时间函数的高级应用技巧
May 16 PHP
PHP 上传文件大小限制
Jul 05 PHP
smarty中先strip_tags过滤html标签后truncate截取文章运用
Oct 25 PHP
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
Jun 24 PHP
php查看请求头信息获取远程图片大小的方法分享
Dec 25 PHP
详谈PHP文件目录基础操作
Nov 11 PHP
php实现字符串首字母大写和单词首字母大写的方法
Mar 14 PHP
php微信公众平台开发(四)回复功能开发
Dec 06 PHP
PHP基于DOMDocument解析和生成xml的方法分析
Jul 17 PHP
PHP实现字符串大小写转函数的功能实例
Feb 06 PHP
PHP 数组黑名单/白名单实例代码详解
Jun 04 PHP
Yii框架核心组件类实例详解
Aug 06 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 5.0对象模型深度探索之绑定
2006/09/05 PHP
PHP实现XML与数据格式进行转换类实例
2015/07/29 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
2017/07/04 PHP
PHP实现动态删除XML数据的方法示例
2018/03/30 PHP
JavaScript数据绑定实现一个简单的 MVVM 库
2016/04/08 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
jQuery实现侧浮窗与中浮窗切换效果的方法
2016/09/05 Javascript
获取jqGrid中选择的行的数据
2016/11/30 Javascript
基于vue.js的分页插件详解
2017/11/27 Javascript
jQuery实现轮播图及其原理详解
2020/04/12 jQuery
说说Vue.js中的functional函数化组件的使用
2019/02/12 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
2019/06/10 Javascript
vue的keep-alive用法技巧
2019/08/15 Javascript
vue循环数组改变点击文字的颜色
2019/10/14 Javascript
js实现圆形菜单选择器
2020/12/03 Javascript
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
Python中http请求方法库汇总
2016/01/06 Python
Python利用递归和walk()遍历目录文件的方法示例
2017/07/14 Python
详解Python给照片换底色(蓝底换红底)
2019/03/22 Python
Pytorch 使用CNN图像分类的实现
2020/06/16 Python
详解如何在css中引入自定义字体(font-face)
2018/05/17 HTML / CSS
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
英国皇家邮政海外旗舰店:Royal Mail
2018/02/21 全球购物
Waterford英国官方网站:世界上最受欢迎的优质水晶品牌
2019/08/17 全球购物
乌克兰巴士票购买网站:inBus
2021/03/12 全球购物
高中生职业生涯规划书
2014/02/24 职场文书
矿泉水广告词
2014/03/20 职场文书
局火灾防控工作方案
2014/05/25 职场文书
住房租房协议书
2014/08/20 职场文书
村主任个人对照检查材料
2014/10/01 职场文书
美丽心灵观后感
2015/06/01 职场文书
太行山上观后感
2015/06/05 职场文书
党员电教片《信仰》心得体会
2016/01/15 职场文书
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers