服务报价 | 域名主机 | 网络营销 | 软件工具| [加入收藏]
 热线电话: #
当前位置: 主页 > php教程 > php教程 >

php转换图片为.bin文件(2)

时间:2016-01-15 17:45来源:未知 作者:最模板 点击:
这段就是php_function的代码,刚实现了把bmp所有的数据读出来,并且输出到了浏览器中。这时候脑子一抽筋,就去翻看了一下php中其他图片格式的代码转换成

这段就是php_function的代码,刚实现了把bmp所有的数据读出来,并且输出到了浏览器中。这时候脑子一抽筋,就去翻看了一下php中其他图片格式的代码转换成bmp的代码:

  /*
  int imagebmp ( resource image [, string filename [, int $bit [, int compression]]] )

  $im: 图像资源
  $filename: 如果要另存为文件,请指定文件名,为空则直接在浏览器输出
  $bit: 图像质量(1、4、8、16、24、32位)
  $compression: 压缩方式,0为不压缩,1使用RLE8压缩算法进行压缩
  注意:这个函数仍然需要GD库的支持。
  Demo:
  $filename="9.jpg";
  $extension=get_extension($filename);
  exit;
  switch(extension){
      case 'jpg':
          $im = imagecreatefromjpeg($filename);
          echo "jpeg";
          break;
      case 'png':
          $im = imagecreatefrompng($filename);
          echo "png";
          break;
      default:
          echo "只能上传jpg和png图片!";
          end;
          break;
  }
  $im = imagecreatefrompng('3.png');
  //$im=imagecreatefromjpeg("1417743927755.jpg");
  ImageToBlackAndWhite($im);
  imagebmp($im,"9.bmp",'8');
  imagedestroy($im);
  Source:
  echo "<img src='9.bmp' />";
  */

  /**

  * 取图片后缀
  */
  function get_extension($file)
  {
      return @end(explode('.', $file));
  }


  /**

  * 将图片转换成黑白色
  * @author:pchangl,Amed(stack overflow)
  * @link:http://tingm.cc
  * @version: 0.1
  * @param resource $im       图像资源
  */
  function ImageToBlackAndWhite($im,$level) {

      for ($x = imagesx($im); $x--;) {
          for ($y = imagesy($im); $y--;) {
              $rgb = imagecolorat($im, $x, $y);
              $r = ($rgb >> 16) & 0xFF;
              $g = ($rgb >> 8 ) & 0xFF;
              $b = $rgb & 0xFF;
              $gray = ($r + $g + $b)/ $level;
              if ($gray < 0xFF) {

                  imagesetpixel($im, $x, $y, 0xFFFFFF);
              }else
                  imagesetpixel($im, $x, $y, 0x000000);
          }
      }

      imagefilter($im, IMG_FILTER_NEGATE);

  }

  /**

  * 创建bmp格式图片
  *

  * @author: legend(legendsky@hotmail.com)
  * @link: http://www.ugia.cn/?p=96
  * @description: create Bitmap-File with GD library
  * @version: 0.1
  *

  * @param resource $im          图像资源
  * @param string   $filename    如果要另存为文件,请指定文件名,为空则直接在浏览器输出
  * @param integer  $bit         图像质量(1、4、8、16、24、32位)
  * @param integer  $compression 压缩方式,0为不压缩,1使用RLE8压缩算法进行压缩
  *

  * @return integer
  */
  function imagebmp(&$im, $filename = '', $bit = 8, $compression = 0)
  {
      if (!in_array($bit, array(1, 4, 8, 16, 24, 32)))
      {
          $bit = 8;
      }
      else if ($bit == 32) // todo:32 bit
      {
          $bit = 24;
      }
      $bits = pow(2, $bit);

      // 调整调色板
      imagetruecolortopalette($im, true, $bits);
      $width  = imagesx($im);
      $height = imagesy($im);
      $colors_num = imagecolorstotal($im);

      if ($bit <= 8)
      {
          // 颜色索引
          $rgb_quad = '';
          for ($i = 0; $i < $colors_num; $i ++)
          {
              $colors = imagecolorsforindex($im, $i);
              $rgb_quad .= chr($colors['blue']) . chr($colors['green']) . chr($colors['red']) . "\0";
          }

          // 位图数据
          $bmp_data = '';

          // 非压缩
          if ($compression == 0 || $bit < 8)
          {
              if (!in_array($bit, array(1, 4, 8)))
              {
              $bit = 8;
              }
              $compression = 0;

              // 每行字节数必须为4的倍数,补齐。
              $extra = '';
              $padding = 4 - ceil($width / (8 / $bit)) % 4;
              if ($padding % 4 != 0)
              {
              $extra = str_repeat("\0", $padding);
              }

              for ($j = $height - 1; $j >= 0; $j --)
              {
                  $i = 0;
                  while ($i < $width)
                  {
                      $bin = 0;
                      $limit = $width - $i < 8 / $bit ? (8 / $bit - $width + $i) * $bit : 0;

                      for ($k = 8 - $bit; $k >= $limit; $k -= $bit)
                      {
                          $index = imagecolorat($im, $i, $j);
                          $bin |= $index << $k;
                          $i ++;
                      }

                      $bmp_data .= chr($bin);
                  }

                  $bmp_data .= $extra;
              }
          }
          // RLE8 压缩
          else if ($compression == 1 && $bit == 8)
          {
              for ($j = $height - 1; $j >= 0; $j --)
              {
                  $last_index = "\0";
                  $same_num   = 0;
                  for ($i = 0; $i <= $width; $i ++)
                  {
                      $index = imagecolorat($im, $i, $j);
                      if ($index !== $last_index || $same_num > 255)
                      {
                          if ($same_num != 0)
                          {
                              $bmp_data .= chr($same_num) . chr($last_index);
                          }

                          $last_index = $index;
                          $same_num = 1;
                      }
                      else
                      {
                      $same_num ++;
                      }
                  }

                  $bmp_data .= "\0\0";
              }

              $bmp_data .= "\0\1";
          }
          $size_quad = strlen($rgb_quad);
          $size_data = strlen($bmp_data);
      }
      else
      {
      // 每行字节数必须为4的倍数,补齐。
          $extra = '';
          $padding = 4 - ($width * ($bit / 8)) % 4;
          if ($padding % 4 != 0)
          {
              $extra = str_repeat("\0", $padding);
          }
          // 位图数据
          $bmp_data = '';
          for ($j = $height - 1; $j >= 0; $j --)
          {
              for ($i = 0; $i < $width; $i ++)
              {
                  $index  = imagecolorat($im, $i, $j);
                  $colors = imagecolorsforindex($im, $index);
                  if ($bit == 16)
                  {
                      $bin = 0 << $bit;

                      $bin |= ($colors['red'] >> 3) << 10;
                      $bin |= ($colors['green'] >> 3) << 5;
                      $bin |= $colors['blue'] >> 3;

                      $bmp_data .= pack("v", $bin);
                  }
                  else
                  {
                      $bmp_data .= pack("c*", $colors['blue'], $colors['green'], $colors['red']);
                  }

                  // todo: 32bit;
              }
              $bmp_data .= $extra;
          }
          $size_quad = 0;
          $size_data = strlen($bmp_data);
          $colors_num = 0;
      }

      // 位图文件头
      $file_header = "BM" . pack("V3", 54 + $size_quad + $size_data, 0, 54 + $size_quad);

      // 位图信息头
      $info_header = pack("V3v2V*", 0x28, $width, $height, 1, $bit, $compression, $size_data, 0, 0, $colors_num, 0);

      // 写入文件
      if ($filename != '')
      {
          $fp = fopen($filename, "wb");
          fwrite($fp, $file_header);
          fwrite($fp, $info_header);
          fwrite($fp, $rgb_quad);
          fwrite($fp, $bmp_data);
          fclose($fp);
          return true;
      }

      // 浏览器输出
      header("Content-Type: image/bmp");
      echo $file_header . $info_header;
      echo $rgb_quad;
      echo $bmp_data;
      return true;
  }

这个时候才想到,其实我已经拿到了bmp图片的数据,为什么还要去用c来解码bmp尼?真是脑子抽筋了,发现在这个代码了,其实已经拿到了数据了,于是在写到文件这部分稍微修改下,把bmp的信息保存到文件中就好了:

  $fp=fopen($filename,"wb");
  fwrite($fp,"ICONTOP");
  fwrite($fp,$pack("v1",$height));
  fwrite($fp,$pack("v1",(int)(($width+31)/32)*4));
  fwrite($fp,$bmp_data);
  fwrite($fp,"ICONEND");

这个函数的调用是这样的:

  imagebmp($im,$filename.".bin",'1');

到这里就好了,把生成的bin文件拿到打印机那边去测试,发现完美打印:

php转换图片为.bin文件


接下来就是把打印机交互的接口完善了就好了。

(责任编辑:最模板)
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
热点内容