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);
?>
我会说这与实际图像有关 :-?
【讨论】:
我发现了问题所在。我留下了一个标头,该标头将原始文件大小作为内容长度...:Pheader("Content-Length: " . (string) (strlen($image_body)));
tehee ^^ 我认为标题让你意识到了这个问题?以上是关于imagecopy() 上的 PHP GD 图像损坏的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Imagick 实现 imagecopy (GD) 功能?
在新的、更大的图像中居中图像资源 (PHP/imagecopy)
PHP imagecopy 函数根据主图像的高度和宽度改变图章大小