仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 691|回复: 18
打印 上一主题 下一主题

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

[复制链接]
变相怪杰 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:58:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
看看西,人家这个编论坛,那个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手册。
爱飞 该用户已被删除
5#
发表于 2015-3-4 10:02:31 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
小魔女 该用户已被删除
6#
发表于 2015-3-10 16:01:37 | 只看该作者
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
admin 该用户已被删除
7#
发表于 2015-3-17 08:10:32 | 只看该作者
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
小女巫 该用户已被删除
8#
发表于 2015-3-20 15:21:44 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
乐观 该用户已被删除
9#
发表于 2015-3-27 04:10:48 | 只看该作者
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
只想知道 该用户已被删除
10#
发表于 2015-4-1 13:11:41 | 只看该作者
当然这种网站的会员费就几十块钱。
愤怒的大鸟 该用户已被删除
11#
发表于 2015-4-1 18:09:15 | 只看该作者
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
第二个灵魂 该用户已被删除
12#
发表于 2015-4-1 23:10:45 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
深爱那片海 该用户已被删除
13#
发表于 2015-4-2 20:54:57 | 只看该作者
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
小妖女 该用户已被删除
14#
发表于 2015-4-10 16:24:29 | 只看该作者
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
活着的死人 该用户已被删除
15#
发表于 2015-4-11 02:10:29 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
因胸联盟 该用户已被删除
16#
发表于 2015-4-11 10:19:44 | 只看该作者
基础有没有对学习php没有太大区别,关键是兴趣。
透明 该用户已被删除
17#
发表于 2015-4-15 05:07:14 | 只看该作者
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
分手快乐 该用户已被删除
18#
发表于 2015-4-26 00:10:15 | 只看该作者
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
再见西城 该用户已被删除
19#
发表于 2015-5-1 03:08:55 | 只看该作者
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:55

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表