2024年PHP日本大会

图像处理和GD

添加注释

用户贡献的注释 5 条注释

mail at ecross dot nl
14 年前
你好!
我创建了一个生成渐变图像的函数。

描述
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);
}
?>
kurdtpage at gmail dot com
13 年前
使用 GD 时,请确保以下几点:

1. 用于处理图像的文件应保存为 ANSI 格式,而不是 UTF-8 格式。
2. 开始标签 <?php 前面没有空格。
Thomas
15 年前
可能不用说,但我还是想在这里留个笔记。在开发调整图像大小的代码时,最好不要使用 GD。使用当前的 GD 方法时,您正在读取图像内容并对其进行操作。然后将该内容写入全新文件时,您会丢失 EXIF 数据。

如果您想保留 EXIF 数据,建议您编译并使用 PECL Imagick 扩展。它内置了强大的调整大小方法,并且会保留 EXIF 数据。
herbert dot walde at googlemail dot com
12 年前
如果您的脚本在某处使用了输出缓冲函数,则必须首先清除缓冲区(使用 ob_clear()),然后才能使用 imagepng() 等函数输出图像。

您应该确保在输出图像后不会发送任何缓冲区,方法是使用 ob_end_flush() 函数。

此外,您应该检查缓冲区是否已在其他地方刷新。可以使用 headers_sent() 函数来完成此操作。

这是完整的解决方案:

<?php
if(headers_sent()){
die(
'我的脚本中某个地方已经发送了标头');
}

ob_clean(); // 清除缓冲区

header('Content-type: image/png');
imagepng($img, NULL, 0, NULL);

ob_end_flush(); // 现在我们发送标头和图像,并且我们确保从现在开始(包括可能的关闭函数和 __destruct() 方法)到页面执行结束都不会发送任何内容
?>
code at ashleyhunt dot co dot uk
16 年前
我一直想将 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 );
?>

享受!
Ashley
To Top