使用 GD 时,请确保以下事项
1. 用于操作图像的文件以 ANSI 格式保存,而不是 UTF-8 格式
2. 在打开标签 <?php 前面没有空格
使用 GD 时,请确保以下事项
1. 用于操作图像的文件以 ANSI 格式保存,而不是 UTF-8 格式
2. 在打开标签 <?php 前面没有空格
您好!
我编写了一个函数来创建渐变图像。
描述
gradient(int image_width, int image_height,
int start_red, int start_green, int start_blue,
int end_red, int end_green, int end_blue,
bool vertical)
函数
<?php
function gradient($image_width, $image_height,$c1_r, $c1_g, $c1_b, $c2_r, $c2_g, $c2_b, $vertical=false)
{
// 首先:让我们进行类型转换;
$image_width = (integer)$image_width;
$image_height = (integer)$image_height;
$c1_r = (integer)$c1_r;
$c1_g = (integer)$c1_g;
$c1_b = (integer)$c1_b;
$c2_r = (integer)$c2_r;
$c2_g = (integer)$c2_g;
$c2_b = (integer)$c2_b;
$vertical = (bool)$vertical;
// 创建图像
$image = imagecreatetruecolor($image_width, $image_height);
// 制作渐变
for($i=0; $i<$image_height; $i++)
{
$color_r = floor($i * ($c2_r-$c1_r) / $image_height)+$c1_r;
$color_g = floor($i * ($c2_g-$c1_g) / $image_height)+$c1_g;
$color_b = floor($i * ($c2_b-$c1_b) / $image_height)+$c1_b;
$color = ImageColorAllocate($image, $color_r, $color_g, $color_b);
imageline($image, 0, $i, $image_width, $i, $color);
}
# 输出所有图形和图片,并释放内存
header('Content-type: image/png');
if($vertical){$image = imagerotate($image, 90, 0);}
ImagePNG($image);
imagedestroy($image);
}
?>
您知道,也许这是不言而喻的,但我还是想在这里写一个注释。在开发用于调整图像大小的代码时,最好不要使用 GD。当使用当前的 GD 方法时,您正在读取图像的内容并进行操作。然后将该内容写入一个全新的文件,您会丢失 EXIF 数据。
为了保留 EXIF 数据,建议您编译并使用 PECL Imagick 扩展。它内置了很棒的调整大小方法,并且 EXIF 数据会保留下来。
如果您的脚本在某处使用输出缓冲函数,那么您必须首先清除缓冲区(使用 ob_clear()),然后才能使用像 imagepng() 这样的函数输出图像。
并且您应该确保在输出图像后,不会发送任何缓冲区,方法是使用 ob_end_flush() 函数。
此外,您应该检查缓冲区是否已在某处被清除。这可以使用 headers_sent() 函数来完成。
以下是完整的解决方案
<?php
if(headers_sent()){
die('Headers have been send somewhere within my script');
}
ob_clean(); // 清除缓冲区
header('Content-type: image/png');
imagepng($img, NULL, 0, NULL);
ob_end_flush(); // 现在我们发送头信息和图像,并确保从现在开始(包括可能的关闭函数和 __destruct() 方法)到页面执行结束,不会再发送任何内容
?>
我一直想将 GD 的输出发送到文本字符串,而无需通过文件或浏览器代理。
我想出了一个解决方案。
此代码将 ob_start() 和 ob_end() 函数之间的输出缓冲到 ob_get_contents() 中
请查看以下示例
<?php
// 为此示例创建一个测试源图像
$im = imagecreatetruecolor(300, 50);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);
// 开始缓冲
ob_start();
// 输出 jpeg(或任何其他选择的)格式和质量
imagejpeg($im, NULL, 85);
// 将输出捕获到字符串
$contents = ob_get_contents();
// 结束捕获
ob_end_clean();
// 保持整洁;释放内存
imagedestroy($im);
// 最后(用于示例)我们将字符串写入文件
$fh = fopen("./temp/img.jpg", "a+" );
fwrite( $fh, $contents );
fclose( $fh );
?>
享受!
阿什利
### 注意
为了在 Web 浏览器中预览由 PHP 文件格式中的 GD 库创建的图像,您应该注意以下两点
1_ 确保 PHP.INI 中启用了 GD
2_ 确保 PHP 文件的编码为 ANSI/ASCII,或者您应该在使用 header() 函数更改头信息之前使用 ob_clean() 函数