免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1239 | 回复: 0
打印 上一主题 下一主题

[GD]生成bmp格式的图片(imagebmp) [复制链接]

论坛徽章:
2
丑牛
日期:2013-09-29 09:47:222015七夕节徽章
日期:2015-08-21 11:06:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-15 15:17 |只看该作者 |倒序浏览

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 = 0; $j --)
            {
                $i = 0;
                while ($i = $limit; $k -= $bit)
                    {
                        $index = imagecolorat($im, $i, $j);
                        $bin |= $index = 0; $j --)
            {
                $last_index = "\0";
                $same_num   = 0;
                for ($i = 0; $i  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 > 3) > 3) > 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文件格式分析 (出处没有找到…)


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/4206/showart_537936.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP