0

0

PHP仿GD生成BMP图片

php中文网

php中文网

发布时间:2016-07-25 09:02:10

|

1388人浏览过

|

来源于php中文网

原创

PHP仿GD生成BMP图片
  1. function imagebmp(&$im, $filename = '', $bit = 8, $compression = 0)
  2. {
  3. if (!in_array($bit, array(1, 4, 8, 16, 24, 32)))
  4. {
  5. $bit = 8;
  6. }
  7. else if ($bit == 32) // todo:32 bit
  8. {
  9. $bit = 24;
  10. }
  11. $bits = pow(2, $bit);
  12. // 调整调色板
  13. imagetruecolortopalette($im, true, $bits);
  14. $width = imagesx($im);
  15. $height = imagesy($im);
  16. $colors_num = imagecolorstotal($im);
  17. if ($bit {
  18. // 颜色索引
  19. $rgb_quad = '';
  20. for ($i = 0; $i {
  21. $colors = imagecolorsforindex($im, $i);
  22. $rgb_quad .= chr($colors['blue']) . chr($colors['green']) . chr($colors['red']) . "\0";
  23. }
  24. // 位图数据
  25. $bmp_data = '';
  26. // 非压缩
  27. if ($compression == 0 || $bit {
  28. if (!in_array($bit, array(1, 4, 8)))
  29. {
  30. $bit = 8;
  31. }
  32. $compression = 0;
  33. // 每行字节数必须为4的倍数,补齐。
  34. $extra = '';
  35. $padding = 4 - ceil($width / (8 / $bit)) % 4;
  36. if ($padding % 4 != 0)
  37. {
  38. $extra = str_repeat("\0", $padding);
  39. }
  40. for ($j = $height - 1; $j >= 0; $j --)
  41. {
  42. $i = 0;
  43. while ($i {
  44. $bin = 0;
  45. $limit = $width - $i
  46. for ($k = 8 - $bit; $k >= $limit; $k -= $bit)
  47. {
  48. $index = imagecolorat($im, $i, $j);
  49. $bin |= $index $i ++;
  50. }
  51. $bmp_data .= chr($bin);
  52. }
  53. $bmp_data .= $extra;
  54. }
  55. }
  56. // RLE8 压缩
  57. else if ($compression == 1 && $bit == 8)
  58. {
  59. for ($j = $height - 1; $j >= 0; $j --)
  60. {
  61. $last_index = "\0";
  62. $same_num = 0;
  63. for ($i = 0; $i {
  64. $index = imagecolorat($im, $i, $j);
  65. if ($index !== $last_index || $same_num > 255)
  66. {
  67. if ($same_num != 0)
  68. {
  69. $bmp_data .= chr($same_num) . chr($last_index);
  70. }
  71. $last_index = $index;
  72. $same_num = 1;
  73. }
  74. else
  75. {
  76. $same_num ++;
  77. }
  78. }
  79. $bmp_data .= "\0\0";
  80. }
  81. $bmp_data .= "\0\1";
  82. }
  83. $size_quad = strlen($rgb_quad);
  84. $size_data = strlen($bmp_data);
  85. }
  86. else
  87. {
  88. // 每行字节数必须为4的倍数,补齐。
  89. $extra = '';
  90. $padding = 4 - ($width * ($bit / 8)) % 4;
  91. if ($padding % 4 != 0)
  92. {
  93. $extra = str_repeat("\0", $padding);
  94. }
  95. // 位图数据
  96. $bmp_data = '';
  97. for ($j = $height - 1; $j >= 0; $j --)
  98. {
  99. for ($i = 0; $i {
  100. $index = imagecolorat($im, $i, $j);
  101. $colors = imagecolorsforindex($im, $index);
  102. if ($bit == 16)
  103. {
  104. $bin = 0
  105. $bin |= ($colors['red'] >> 3) $bin |= ($colors['green'] >> 3) $bin |= $colors['blue'] >> 3;
  106. $bmp_data .= pack("v", $bin);
  107. }
  108. else
  109. {
  110. $bmp_data .= pack("c*", $colors['blue'], $colors['green'], $colors['red']);
  111. }
  112. // todo: 32bit;
  113. }
  114. $bmp_data .= $extra;
  115. }
  116. $size_quad = 0;
  117. $size_data = strlen($bmp_data);
  118. $colors_num = 0;
  119. }
  120. // 位图文件头
  121. $file_header = "BM" . pack("V3", 54 + $size_quad + $size_data, 0, 54 + $size_quad);
  122. // 位图信息头
  123. $info_header = pack("V3v2V*", 0x28, $width, $height, 1, $bit, $compression, $size_data, 0, 0, $colors_num, 0);
  124. // 写入文件
  125. if ($filename != '')
  126. {
  127. $fp = fopen($filename, "wb");
  128. fwrite($fp, $file_header);
  129. fwrite($fp, $info_header);
  130. fwrite($fp, $rgb_quad);
  131. fwrite($fp, $bmp_data);
  132. fclose($fp);
  133. return true;
  134. }
  135. // 浏览器输出
  136. header("Content-Type: image/bmp");
  137. echo $file_header . $info_header;
  138. echo $rgb_quad;
  139. echo $bmp_data;
  140. return true;
  141. }
复制代码


相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

1

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

15

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

4

2026.01.13

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
极致CMS零基础建站教学视频
极致CMS零基础建站教学视频

共62课时 | 5.3万人学习

PHP水印与缩略图最新视频教程
PHP水印与缩略图最新视频教程

共10课时 | 1.7万人学习

PHP开发水印与缩略图教程
PHP开发水印与缩略图教程

共10课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号