2

我有一个 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是我创建的自定义图像类的一个对象,它包含有关图像的所有信息。)

有人知道我为什么会有这种行为吗?

谢谢!

4

2 回答 2

3

请尝试:

ob_start();
imagejpeg($img);

// this should be the real image size
$size = ob_get_length();

header("Content-length: " . $size); 

// send it
ob_flush();
于 2013-02-17T18:17:01.067 回答
1

在未更改的图像上添加水印会创建一个新图像,该图像几乎肯定会有不同的文件大小,特别是如果它是 jpeg(有损压缩)。事实上,即使您不进行任何修改,某些图像程序和库也会重新压缩 jpg,从而产生不同的文件内容(尽管可能不是明显不同的图像)。

One Trick Pony 的答案将为您提供正确的新图像文件大小,并且对性能的影响最小。

另一种选择是在将 blob 保存到数据库之前添加水印,但随后您将失去呈现原始图像的能力。

于 2013-02-20T18:21:00.143 回答