变相怪杰 发表于 2015-2-3 23:58:35

PHP网页编程之[GD]生成bmp格局的图片(imagebmp)

看看西,人家这个编论坛,那个CMS,还有那啥CRM,我啥时候写一个呢?   GD库里没有生成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:
$im = imagecreatefrompng("test.png");
imagebmp($im);
imagedestroy($im);
Source:
/**
* 创立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("test.bmp", "wb");

      fwrite($fp, $file_header);
      fwrite($fp, $info_header);
      fwrite($fp, $rgb_quad);
      fwrite($fp, $bmp_data);
      fclose($fp);

      return 1;
    }
   
    // 阅读器输入
    header("Content-Type: image/bmp");
    echo $file_header . $info_header;
    echo $rgb_quad;
    echo $bmp_data;
   
    return 1;
}
参考材料:BMP文件格局剖析 (出处没有找到…)
原创文章,转载请注明出处。
出处:http://www.ugia.cn/?p=96
怎么配置呢 ,问最好的老实百度,问啥都有答案。所以用好搜索引擎是学好的令1个关键,程序会出各样的问题,没有1个人可能会碰到所有的问题,所有就可以问百度这个大家精华的集合了。

金色的骷髅 发表于 2015-2-4 07:50:07

对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。

海妖 发表于 2015-2-9 19:06:39

Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81

莫相离 发表于 2015-2-14 20:01:23

环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。

爱飞 发表于 2015-3-4 10:02:31

,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。

小魔女 发表于 2015-3-10 16:01:37

首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。

admin 发表于 2015-3-17 08:10:32

最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。

小女巫 发表于 2015-3-20 15:21:44

不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。

乐观 发表于 2015-3-27 04:10:48

要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。

只想知道 发表于 2015-4-1 13:11:41

当然这种网站的会员费就几十块钱。

愤怒的大鸟 发表于 2015-4-1 18:09:15

当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,

第二个灵魂 发表于 2015-4-1 23:10:45

php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)

深爱那片海 发表于 2015-4-2 20:54:57

最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。

小妖女 发表于 2015-4-10 16:24:29

在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、

活着的死人 发表于 2015-4-11 02:10:29

写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。

因胸联盟 发表于 2015-4-11 10:19:44

基础有没有对学习php没有太大区别,关键是兴趣。

透明 发表于 2015-4-15 05:07:14

多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。

分手快乐 发表于 2015-4-26 00:10:15

当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,

再见西城 发表于 2015-5-1 03:08:55

最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
页: [1]
查看完整版本: PHP网页编程之[GD]生成bmp格局的图片(imagebmp)