例如,在一组产品(电子商务)中添加一种新的图像尺寸,该产品集合包含数十万、甚至数百万个产品。假设我有一份原始图像的副本,它的尺寸为300x350或其他尺寸,并在客户端将其调整为200x250。我为每个页面上的20个产品都这样做。
那么,为了使客户端受益,值得花费服务器端的工作和解决问题来适应这种新尺寸吗?
如果不是,那么判断何时应预处理某个尺寸会更好呢?
如果是,那么是否存在服务器端处理和缓存可能过度的情况(例如,存储8张110x220、120x230、150x190等尺寸的图像)?
imagecache
)。
它在上传图像时不会创建缩略图。相反,它使用.htaccess和mod_rewrite功能在请求时间创建它们。它检查所请求的文件是否不存在,如果不存在,则将请求重定向到小型且轻量级的PHP脚本,该脚本将创建缩略图,将其写入文件系统,然后输出到客户端。
因此,下一个访问者将已经获得先前创建的缩略图。
因此,您可以实现延迟/懒惰的图像调整大小,这将使负载更加平滑(在时间上拉伸)。
<img width="150" height="100">
中呈现250x200。 是的,它的质量不会很好。 但它足够小,以至于质量并不那么重要。(当然我指的不是200x250,而是250x200) - Alexey Kamenskiy我决定先在页面上的单个图像上进行测试,并进行了一些乘法运算来预测多个图像。需要注意的是:
宽度
和高度
始终适合我调整大小的原始图像的纵横比。我得到了一个大约为450x450的图像,并决定将其缩小到200x200(本答案中的所有测量单位均为像素),在客户端进行缩放。尽管缩放超过了图像总大小的一半,但我发现CPU的负载很小。
在所有现代浏览器(Chrome、Opera、Firefox和IE)中,图像的质量也非常好,显示得清晰明了,就像是在Photoshop或GD中完成的一样。
在IE7上,我没有注意到太多的CPU负载,并且只要根据图像大小的限制使用百分比缩放,质量就很好。
总的来说,即使是将这种大小的缓存服务器端进行存储、计算和编码所需的额外工作,似乎也不如可以应用于用户端的功能强大。
话虽如此,如果我要开始做这种类型的多次调整大小(比如我的问题中的20次),我可能会遇到问题。
经过一些调整,我发现如果原始图像的宽度或高度小于1000像素,则在原始图像大小的1/3以下提供的任何内容似乎对CPU和计算机性能都是微不足道的。
使用我正在使用的附加功能,我从客户端调整大小得到了与服务器端相同的良好质量。我使用的特定函数(对于感兴趣的人)是:
function pseudoResize($maxWidth = 0, $maxHeight = 0){
$width = $this->org_width;
$height = $this->org_height;
$maxWidth = intval($maxWidth);
$maxHeight = intval($maxHeight);
$newWidth = $width;
$newHeight = $height;
// Ripped from the phpthumb library in GdThumb.php under the resize() function
if ($maxWidth > 0)
{
$newWidthPercentage = (100 * $maxWidth) / $width;
$newHeight = ($height * $newWidthPercentage) / 100;
$newWidth = intval($maxWidth);
$newHeight = intval($newHeight);
if ($maxHeight > 0 && $newHeight > $maxHeight)
{
$newHeightPercentage = (100 * $maxHeight) / $newHeight;
$newWidth = intval(($newWidth * $newHeightPercentage) / 100);
$newHeight = ceil($maxHeight);
}
}
if ($maxHeight > 0)
{
$newHeightPercentage = (100 * $maxHeight) / $height;
$newWidth = ($width * $newHeightPercentage) / 100;
$newWidth = ceil($newWidth);
$newHeight = ceil($maxHeight);
if ($maxWidth > 0 && $newWidth > $maxWidth)
{
$newWidthPercentage = (100 * $maxWidth) / $newWidth;
$newHeight = intval(($newHeight * $newWidthPercentage) / 100);
$newWidth = intval($maxWidth);
}
}
return array(
'width' => $newWidth,
'height' => $newHeight
);
}
从我的测试结果来看,似乎将您要使用的每个图像的每个尺寸都存储起来是有些过度的。正如我在问题中所问:
如果是这样,那么是否会有时候服务器端处理和缓存可能会变得过度(即存储110x220、120x230、150x190等8张图片)?
在现代计算机中,这似乎是过度的,相反,如果您打算使用许多不同大小的图像,则应选择接近的测量值。
然而,我发现,如果您有一组标准尺寸并且它们很小,则实际上优势在于服务器端调整大小和存储所有尺寸,因为强制客户端调整大小将始终使其计算机变慢,但在原始大小的1/3以下进行缩放似乎不会产生太大的影响。
因此,我认为像FB、Google和Youtube这样的网站不太担心存储所有图像的精确尺寸,是因为“接近测量”的缩放可以更加高效。