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文件格式分析 (出处没有找到…)

原创文章,转载请注明出处。

php bmp图片下载,[gd]生成bmp格式的图片(imagebmp)_php技巧相关推荐

  1. C# 淘宝数据包下载,生成csv格式。可直接通过淘宝助理上传到淘宝店铺

    核心代码: #region 打包下载/// <summary>/// 淘宝数据包下载,生成csv格式.可直接通过淘宝助理上传到淘宝店铺/// </summary>/// < ...

  2. 使用SVG.Net生成svg格式文字图片

    由于项目需要,需生成svg格式文字图片,网上的文档较少,在一番查阅之后成功实现.现记录下来,方便以后自己查阅,以及需要的人也可当做参考,水平不高,少喷. 主要运用到GitHub开源项目: svg.ne ...

  3. 【mmdetection小目标检测教程】三、使用sahi库切分高分辨率图片,一键生成coco格式数据集

    [mmdetection小目标检测教程]三.使用sahi库切分高分辨率图片,一键生成coco格式数据集 1.确认是否需要切分图像 2.子图切分 (1)安装sahi库 (2)基于sahi切图 本文我们将 ...

  4. vue使用qrcodejs2生成带log的二维码图片,vue生成二维码图片中间带log,自定义log

    安装插件 npm install qrcodejs2 --save 在页面中引入 import QRcode from 'qrcodejs2' 普通的二维码 此处的id就是页面中要展示二维码容器的id ...

  5. php 生成bmp图片,[GD]生成bmp格式的图片(imagebmp)

    GD库里没有生成bmp图片的函数,所以自己写了一个,这个函数尚有一个压缩算法没有写,不过已经够用了.需要的同学可以看看. int imagebmp ( resource image [, string ...

  6. 图片如何生成pdf格式?图片怎么生成pdf格式文件?

    图片如何生成pdf格式?平时的工作中我们在处理pdf文件的时候,难免会遇到各种各样的问题.有时候我们需要把图片生成pdf.可能还有些小伙伴不知道该怎么做,图片生成pdf其实很简单,下面给大家分享一个图 ...

  7. php生成gif动态图片_动态生成gif格式的图像要注意?

    动态生成gif格式的图像要注意? 更新时间:2006年10月09日 00:00:00   作者: 如果你用 int imagecreatefromgif(string filename); 来取出一张 ...

  8. vue项目,把图片文件流转为base64格式以图片形式展示在前端

    问题描述 前台需要展示图片,期望后台直接返回图片地址,但是后台给的是的文件流而不是一个图片地址,需要把文件流转为base64的格式展示出来. 请求后台接口时,返回图片内容如下: 上图不是base64格 ...

  9. 图片下载(包含了download打开图片无法下载的方法)

    利用a标签的download属性实现图片下载 代码 <img src="../download/img/test.jpg" alt=""><a ...

  10. java gif图片_java 如何生成动态的gif图片

    网上找了很多资料都没有生成gif图片的例子.但是生成水印的文件到不少,如果我们把gif图片合成水印后,图片就不动了,所以我写了个小例子供大家参考.(如果你想在某个图片上打印个动感图标,这个类就能很好地 ...

最新文章

  1. 2019.7.9 校内测试题 史密斯数
  2. ae这样设置导出比较快 480p比较适合快速看看demo的样子,注意tradeoff
  3. ROS-Kinetic 中使用XSENS MTI 1 姿态传感器
  4. 请问这博客能有几种方便写法?
  5. 字节流复制视频比拼效率
  6. 【BZOJ3566】—概率充电器(树形+概率dp)
  7. 谷歌离线地图开发API
  8. 一文带你彻底了解电子灌封(灌胶)工艺技术
  9. 正三角java_Java中的的画正三角方法
  10. 字体反爬-起点网月票榜案例
  11. Java面试题笔试题汇总
  12. H3C服务器带外默认账号和密码,H3C产品的默认密码是多少?
  13. 会议信息 | BigBrain研讨会 September 21-23, CEST, 线上
  14. 【Tkinter】终于把StringVar讲明白了
  15. 【mac安装开发工具】
  16. 算法进阶指南每日一题(碎碎念念)
  17. 护卫神支持java_护卫神·PHP套件(支持Win2003/Win2008/Win2012)
  18. php Warning phpinfo It is not safe to rely on the system
  19. 靶场笔记-covfefe
  20. iOS的音讯通知有两种方式,Badge Notification和Alert Notification

热门文章

  1. js利用CLodop实现打印功能
  2. [KALI] 开启ssh远程连接
  3. java里的文件显示繁体_java保存繁体网页打开后出现乱码
  4. 数字锁相环:二阶环的FPGA实现(基于quartus+matlab)
  5. 交换机vlan配置实训心得_交换机系统配置实验心得
  6. DSP2812之中断系统
  7. 电子邮件工作原理简介(个人整理)
  8. mysql 显示 乱码_MySQL 中文显示乱码
  9. MAC上编写汇编程序
  10. workstation服务丢失 共享打不开 0x80070035