缘起
开发"微信推广海报"的时, 背景图片未覆盖的地方默认会被黑色填充. 而我希望改成白色背景, 以对用户更友好一些. 但是无论设置成什么颜色, 图片的背景颜色一直都是黑色, 无法改变. 当时的代码如下:
$target = imagecreatetruecolor(640, 1008);
$background = imagecolorallocate($target, 255, 255, 255); //计划改成白色背景, 但是没有奏效
解决
修改背景颜色有 2 种方法:
- 如果希望生成的图片是全彩色的, 使用
imagecreatetruecolor()
函数, 配合设置颜色的imagecolorallocate()
函数, 以及填充颜色的imagefill()
函数; - 如果允许生成的图片是 256 色的, 可以使用
imagecreate()
函数, 配合imagecolorallocate()
函数;
00. 基础
首先, 在图像中使用的任何颜色都必须用 imagecolorallocate()
函数来生成:
imagecolorallocate ( $image , $red , $green , $blue )
01. 全彩色的 imagecreatetruecolor 方案
如果使用 imagecreatetruecolor()
函数, 除了设置颜色的 imagecolorallocate()
, 还需要配合 imagefill()
函数:
imagecreatetruecolor ( $width , $height )
imagefill ( $image , $x , $y , $color )
比如, 设置"白色"的背景图 (RGB 值是 "255, 255, 255"):
$image = imagecreatetruecolor(640, 1008);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image,0,0,$white); //这里的 "0, 0"是指坐标, 使用体验就类似 Windows 系统"画图"软件的"颜料桶", 点一下之后, 在整个封闭区间内填充颜色
02. 非全彩色的 imagecreate 方案
如果对图片的颜色要求不高, 可以接受 256 色, 则可以使用这个方案.
imagecreate ( $width , $height )
使用 imagecreate()
函数时, 用 imagecolorallocate()
函数设置的第 1 个颜色将默认成为背景颜色.
比如, 设置"灰色"的背景图:
$image = imagecreate(640, 1008);
$gray = imagecolorallocate($image, 235, 235, 235); //用 imagecolorallocate 函数设置的第 1 个颜色将自动成为背景颜色
再次提醒:
基于 imagecreate()
生成的图片是 256 色, 并不是全彩色, 也就是说颜色会失真, 所以推荐使用上面的第一种方案 -- 全彩色的 imagecreatetruecolor()
方案.
题外 -- 用 GD 库创建图片的基本步骤
//第 1 步: 创建画布
$image = imagecreatetruecolor(640, 1008); //指定画布尺寸
//第 2 步: 创建颜色
$white = imagecolorallocate($image, 255, 255, 255); //创建颜色
$black = imagecolorallocate($image, 0, 0, 0); //创建颜色
imagefill($image,0,0,$white); //自定义画布的背景颜色
//第 3 步: 绘制图形
imagefilledrectangle($image, 50, 50, 150, 150, $black);
//第 4 步: 输出图片
header("Content-Type: image/png"); //需要将图片发送到浏览器
imagepng($image, $path); //输出图片到 $path 的位置. $path 包括图片的名称
imagedestroy($image); //释放内存
参考文章
- php图像函数 imagecreatetruecolor()和imagecreate()的区别
- Kevin Tatroe 等. PHP 编程: 第 3 版. 北京:电子工业出版社. 2015.3
- 解决php gd函数 ImageCreatetruecolor 做背景颜色只显示黑色的问题 (注意, 这篇文章建议直接用 imagecreate 替代 imagecreatetruecolor, 但是忘记提醒 imagecreate 的颜色失真问题)
文章历史
- 2017/05/24 (第一次发布)
- 2017/06/03 修改
- 2017/06/13 修改; 增加 imagedestroy
如果我的文章对你有用, 希望给些改进的建议, 或者打个"喜欢" _