imagecopy() 上的 PHP GD 图像损坏

Posted

技术标签:

【中文标题】imagecopy() 上的 PHP GD 图像损坏【英文标题】:PHP GD Image Corruption On imagecopy() 【发布时间】:2011-04-02 04:11:10 【问题描述】:

我在使用 php 5.3.3 时遇到了一些奇怪的问题,我正在尝试向图像添加水印。

$body = @imagecreatefromstring($image_data['body']);
imagejpeg($body, null, 85);

返回:http://i.stack.imgur.com/KJjDi.jpg

$body   = @imagecreatefromstring($image_data['body']);
$logo   = @imagecreatefrompng(APP_ROOT . self::WATERMARK_PATH);

$body_width     = (int) @imagesx($body);
$body_height    = (int) @imagesy($body);

$logo_width     = (int) @imagesx($logo);
$logo_height    = (int) @imagesy($logo);

$image = imagecreatetruecolor($body_width + 4, $body_height + $logo_height);

imagecopy(
    $image, $logo, 
    intval($body_width / 2) - ceil($logo_width / 2), $body_height, 
    0, 0, $logo_width, $logo_height
);

imagejpeg($image, null, 85);

返回:http://i.stack.imgur.com/nwtqZ.jpg

buuuuuuuuut......如果我将身体(猫)添加到图像......

$body   = @imagecreatefromstring($image_data['body']);
$logo   = @imagecreatefrompng(APP_ROOT . self::WATERMARK_PATH);

$body_width     = (int) @imagesx($body);
$body_height    = (int) @imagesy($body);

$logo_width     = (int) @imagesx($logo);
$logo_height    = (int) @imagesy($logo);

$image = imagecreatetruecolor($body_width + 4, $body_height + $logo_height);

imagecopy(
    $image, $body, 
    1, 1, 
    0, 0, $body_width, $body_height
);

imagecopy(
    $image, $logo, 
    intval($body_width / 2) - ceil($logo_width / 2), $body_height, 
    0, 0, $logo_width, $logo_height
);

imagejpeg($image, null, 85);

结果:http://i.stack.imgur.com/Xeb73.jpg

正如你在最后一个中看到的那样,图像的底部已损坏或其他什么...... wtf发生了?

【问题讨论】:

你能告诉我没有第二个 imagecopy() 的结果吗? P.S.通过@进行的许多错误抑制非常非常非常非常昂贵,实际上如果您没有将 set_time_limit 设置得足够高,它们可能是罪魁祸首o.o 都是本地执行,加载时间不到一秒。 如果没有第二个 imagecopy(),我还能得到结果吗? 这里:i.imgur.com/4HxlS.jpg 我刚刚删除了@的..没有效果。 【参考方案1】:

尝试这段代码,我发现绝对没有错误:

<?php
$body   = imagecreatefromjpeg('http://i.stack.imgur.com/KJjDi.jpg');
$logo   = imagecreatefromjpeg('http://b.vimeocdn.com/ps/161/161028_300.jpg');
$body_width     = (int) imagesx($body);
$body_height    = (int) imagesy($body);
$logo_width     = (int) imagesx($logo);
$logo_height    = (int) imagesy($logo);
$image = imagecreatetruecolor($body_width + 4, $body_height + $logo_height);
imagecopy(
    $image, $body, 
    1, 1, 
    0, 0, $body_width, $body_height
);
imagecopy(
    $image, $logo, 
    intval($body_width / 2) - ceil($logo_width / 2), $body_height, 
    0, 0, $logo_width, $logo_height
);
header('Content-Type: image/jpeg');
imagejpeg($image, null, 85);
?>

我会说这与实际图像有关 :-?

【讨论】:

我发现了问题所在。我留下了一个标头,该标头将原始文件大小作为内容长度...:P header("Content-Length: " . (string) (strlen($image_body))); tehee ^^ 我认为标题让你意识到了这个问题?

以上是关于imagecopy() 上的 PHP GD 图像损坏的主要内容,如果未能解决你的问题,请参考以下文章

PHP GD 库中的图像透明度

如何通过 Imagick 实现 imagecopy (GD) 功能?

在新的、更大的图像中居中图像资源 (PHP/imagecopy)

PHP imagecopy 函数根据主图像的高度和宽度改变图章大小

在 PHP 中使用 imagecopy 时如何使任何“额外空间”变白

图像上的php gd文本中断