我有一个PHP网页,它从数据库中获取BLOB并将其作为图像输出。当用户上传此图片时,我将文件大小(例如 491099 )存储到数据库中。
通过我的网页请求图片时,我添加了水印,设置HTTP HEADERS
并通过imagejpeg($img)
输出图像。现在的问题是,当我的图像完全加载(几乎没有时间)时,我的浏览器似乎仍然“忙”(加载指示器旋转)。通过异步调用请求此页面时,即使图像实际上在很短的时间内被加载,也会使加载时间变长。
当我只删除Content-length
标题时,图像就像之前一样加载,但现在浏览器在加载时停止,因此处理时间非常快。
所以看起来浏览器认为(由于我的Content-length
标题)它应该仍然在加载某些内容而实际上并非......
删除Content-length
标题是没有选择的,因为在我读过的许多浏览器中都需要这样做。
// set the header for the image
header("Content-length: " . $image->imageSize); //would be 491099 in my example
header("Content-type: " . $image->imageType);
header('Content-Disposition: inline; filename=" '. $image->imageName . '"');
$watermark = imagecreatefrompng('../images/watermark.png');
$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
$dest_x = ($image->imageWidth - $watermark_width) / 2;
$dest_y = $image->height - $watermark_height - 5;
$img = imagecreatefromstring($image->image);
imagecopymerge($img, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 55);
imagejpeg($img);
(请注意$image
是我创建的自定义图像类的对象,它包含有关图像的所有信息。)
任何人都知道我为什么会这样做?
谢谢!
答案 0 :(得分:3)
尝试改为:
ob_start();
imagejpeg($img);
// this should be the real image size
$size = ob_get_length();
header("Content-length: " . $size);
// send it
ob_flush();
答案 1 :(得分:1)
在未更改的图像上添加水印会创建一个新图像,几乎肯定会有不同的文件大小,特别是如果它是jpeg(有损压缩)。事实上,即使你没有做任何修改,一些图像程序和库也会重新压缩jpg,从而产生不同的文件内容(虽然可能不是一个明显不同的图像)。
One Trick Pony的答案将为您提供新图像的正确文件大小,同时对性能影响最小。
另一个选项是在将blob保存到数据库之前添加水印,但是你将无法渲染原始数据。