我正在使用水印系统来保护我页面上的所有照片:
<?php
$imagesource = $_SERVER['DOCUMENT_ROOT']."**path**".$_GET['path'];
if (!file_exists($imagesource)) die();
$filetype = strtolower(substr($imagesource,strlen($imagesource)-4,4));
if($filetype == ".gif") $image = @imagecreatefromgif($imagesource);
if($filetype == ".jpg") $image = @imagecreatefromjpeg($imagesource);
if($filetype == ".png") $image = @imagecreatefrompng($imagesource);
if (empty($image)) die();
$watermark = @imagecreatefrompng('watermark_'.(imagesx($image) <= 1100 ? "port" : "lans").'.png');
$imagewidth = imagesx($image);
$imageheight = imagesy($image);
$watermarkwidth = imagesx($watermark);
$watermarkheight = imagesy($watermark);
$startwidth = (($imagewidth - $watermarkwidth)/2);
$startheight = (($imageheight - $watermarkheight)/2);
imagecopy($image, $watermark, $startwidth, $startheight, 0, 0, $watermarkwidth, $watermarkheight);
header("Content-type: image/jpeg");
imagejpeg($image);
imagedestroy($image);
imagedestroy($watermark);
?>
这样可以正常使用,但是当我在Google Chrome中加载此页面时,图片会预先加载并显示,但一旦呈现Chrome就会显示“无法加载资源”。这很奇怪,因为如果你没有加载它,为什么要显示呢?
无论如何,我无法在任何其他浏览器上复制此问题。这又是奇怪的,这告诉我脚本没有任何问题。
我注意到我的图像越小,显示的图像就越正确,但加载的图片中有2张有什么好处!
现在,当我正常显示图像时(即没有水印脚本。通过“&lt;”img“&gt;&lt;”/ img“&gt;”标签)
但是在另一个网站上我没有水印脚本,但它们仍然没有加载。
我的另一个问题是;
我必须对原始文件使用版权和.htaccess保护,因为管理我的网站合同的法律......无论如何,用户无法直接访问图像源文件。这些错误可能是由此造成的吗?但是,为什么会有一些显示而其他人没有显示,并且同样地,为什么只有谷歌Chrome才有这个问题呢?
你的想法很有用。
P.S。这是我的浏览器信息:
Google Chrome 19.0.1084.56 (Official Build 140965) m
OS Windows
WebKit 536.5 (@119244)
JavaScript V8 3.9.24.29
Flash 11,3,300,257
User Agent Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5
视觉示例:
答案 0 :(得分:1)
似乎是Chrome中的错误。让我疯狂的最终想出了一个使用base64的“修复”。保持水印脚本完全相同,然后进入输出图像的脚本。
function base64_encode_image ($imagefile) {
$filename=htmlentities($imagefile);
$filetype = pathinfo($filename, PATHINFO_EXTENSION);
$imgbinary = file_get_contents($filename);
return 'data:image/' . $filetype . ';base64,' . base64_encode($imgbinary);
}
$string=base64_encode_image("http://www.domain.com.au/watermark.php?imagesrc=image1.jpg");
$imgList.="<img src=\"$string\" title=\"\">";
答案 1 :(得分:0)
问题可能是因为你没有回馈Content-Length。你必须用以下代码替换行imagejpeg($image);
:
imagejpeg($image, 'php://memory/temp.jpeg');
header("Content-Length: " . filesize('php://memory/temp.jpeg'));
$fp = fopen("php://temp/temp.jpeg", 'r');
echo stream_get_contents($fp);