php bmp图片下载,[gd]生成bmp格式的图片(imagebmp)_php技巧
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技巧相关推荐
- C# 淘宝数据包下载,生成csv格式。可直接通过淘宝助理上传到淘宝店铺
核心代码: #region 打包下载/// <summary>/// 淘宝数据包下载,生成csv格式.可直接通过淘宝助理上传到淘宝店铺/// </summary>/// < ...
- 使用SVG.Net生成svg格式文字图片
由于项目需要,需生成svg格式文字图片,网上的文档较少,在一番查阅之后成功实现.现记录下来,方便以后自己查阅,以及需要的人也可当做参考,水平不高,少喷. 主要运用到GitHub开源项目: svg.ne ...
- 【mmdetection小目标检测教程】三、使用sahi库切分高分辨率图片,一键生成coco格式数据集
[mmdetection小目标检测教程]三.使用sahi库切分高分辨率图片,一键生成coco格式数据集 1.确认是否需要切分图像 2.子图切分 (1)安装sahi库 (2)基于sahi切图 本文我们将 ...
- vue使用qrcodejs2生成带log的二维码图片,vue生成二维码图片中间带log,自定义log
安装插件 npm install qrcodejs2 --save 在页面中引入 import QRcode from 'qrcodejs2' 普通的二维码 此处的id就是页面中要展示二维码容器的id ...
- php 生成bmp图片,[GD]生成bmp格式的图片(imagebmp)
GD库里没有生成bmp图片的函数,所以自己写了一个,这个函数尚有一个压缩算法没有写,不过已经够用了.需要的同学可以看看. int imagebmp ( resource image [, string ...
- 图片如何生成pdf格式?图片怎么生成pdf格式文件?
图片如何生成pdf格式?平时的工作中我们在处理pdf文件的时候,难免会遇到各种各样的问题.有时候我们需要把图片生成pdf.可能还有些小伙伴不知道该怎么做,图片生成pdf其实很简单,下面给大家分享一个图 ...
- php生成gif动态图片_动态生成gif格式的图像要注意?
动态生成gif格式的图像要注意? 更新时间:2006年10月09日 00:00:00 作者: 如果你用 int imagecreatefromgif(string filename); 来取出一张 ...
- vue项目,把图片文件流转为base64格式以图片形式展示在前端
问题描述 前台需要展示图片,期望后台直接返回图片地址,但是后台给的是的文件流而不是一个图片地址,需要把文件流转为base64的格式展示出来. 请求后台接口时,返回图片内容如下: 上图不是base64格 ...
- 图片下载(包含了download打开图片无法下载的方法)
利用a标签的download属性实现图片下载 代码 <img src="../download/img/test.jpg" alt=""><a ...
- java gif图片_java 如何生成动态的gif图片
网上找了很多资料都没有生成gif图片的例子.但是生成水印的文件到不少,如果我们把gif图片合成水印后,图片就不动了,所以我写了个小例子供大家参考.(如果你想在某个图片上打印个动感图标,这个类就能很好地 ...
最新文章
- 2019.7.9 校内测试题 史密斯数
- ae这样设置导出比较快 480p比较适合快速看看demo的样子,注意tradeoff
- ROS-Kinetic 中使用XSENS MTI 1 姿态传感器
- 请问这博客能有几种方便写法?
- 字节流复制视频比拼效率
- 【BZOJ3566】—概率充电器(树形+概率dp)
- 谷歌离线地图开发API
- 一文带你彻底了解电子灌封(灌胶)工艺技术
- 正三角java_Java中的的画正三角方法
- 字体反爬-起点网月票榜案例
- Java面试题笔试题汇总
- H3C服务器带外默认账号和密码,H3C产品的默认密码是多少?
- 会议信息 | BigBrain研讨会 September 21-23, CEST, 线上
- 【Tkinter】终于把StringVar讲明白了
- 【mac安装开发工具】
- 算法进阶指南每日一题(碎碎念念)
- 护卫神支持java_护卫神·PHP套件(支持Win2003/Win2008/Win2012)
- php Warning phpinfo It is not safe to rely on the system
- 靶场笔记-covfefe
- iOS的音讯通知有两种方式,Badge Notification和Alert Notification