【问题标题】:JavaScript image resize slownessJavaScript图像调整大小缓慢
【发布时间】:2012-10-03 13:13:37
【问题描述】:

我正在处理的一个网站有很多从数据库中提取的图像。图像的尺寸不一致,我试图将它们显示在统一大小的框(div)中。我不知道任何图像的尺寸,但我可以通过以下方式检索它们:

document.getElementById( myImage ).width
document.getElementById( myImage ).height

在此之后,我进行了测试以了解如何调整图像大小以适合统一框。最后我设置了效果:

document.getElementById( myImage ).width = theNewWidth
document.getElementById( myImage ).height = theNewHeight

通过在 img 标签中使用onload="resizingFunction( imgId );",每个图像只调用一次此函数。数据库中的每个图像完成此功能大约需要 1-2 秒,并且该功能永远不会再为任何这些图像运行。尽管从未再次运行,但如果我使用此功能,该站点的运行速度会明显变慢。谷歌搜索后,我尝试添加:

document.getElementById( myImage ).removeAttribute("width")
document.getElementById( myImage ).removeAttribute("height")

在设置新的宽度和高度之前。这确实提高了速度,但它仍然比我没有调整图像大小时要慢。同样,为了澄清起见,每张图片在加载后都会调整一次大小,但由于某种原因,这仍然会降低网站的速度。

图像是通过 PHP 回显到 JavaScript 中创建的。这是必要的,因为它们需要来自数据库 (PHP) 的信息,而 JavaScript 将它们放置在正确的框 (div) 中。下面是图片的创建代码:

echo "\t\t\tdocument.getElementById('gBox".$i."').innerHTML = '<img onload=\"image_applyToGrid(".$i.");\" id=\"img".$i."\" style=\"left:0; top:0;\" src=\"'+gBoxes[".$i."].imgPath+'\"/>';\n";

这是图像加载后调用的图像大小调整函数:

function image_applyToGrid(inId) {
inIdImage = document.getElementById("img"+inId);
var imgW = inIdImage.width;
var imgH = inIdImage.height;
if (imgW > imgH) {
    var proportions = imgW/imgH;
    imgH = gridUnit;
    imgW = gridUnit*proportions;
    inIdImage.style.left = -((imgW-gridUnit)>>1)+"px";
}
else {
    var proportions = imgH/imgW;
    imgW = gridUnit;
    imgH = gridUnit*proportions;
    inIdImage.style.top = -((imgH-gridUnit)>>1)+"px";
}
inIdImage.removeAttribute("width");
inIdImage.removeAttribute("height");
inIdImage.width = imgW;
inIdImage.height = imgH;
}

【问题讨论】:

  • 为什么不在服务器端调整图像大小?加载许多大图像会影响性能。您说该函数不再运行图像,但它看起来总是在页面加载时运行,并且您似乎没有更改图像的实际大小并将其存储在某个地方。
  • 您尝试过 CSS 解决方案吗?有一个包装图像的容器将它们设置为 css max-widthmax-height 属性?
  • 您可以通过 PHP 提供图像,并在 URL 中包含一个额外的尺寸参数。如果存在该尺寸的图像,请提供它。如果没有,请加载原始图像,调整大小并存储调整后的版本。这应该不会太复杂......
  • 我发现了问题,它是 PHP 回显将信息写入 JavaScript 并且使用 JavaScript 编写 innerHTML 显然比仅将其编写为普通 HTML 慢。我只是将 PHP 回显重新定位到 内部并让它回显 HTML
  • 没关系,这仍然没有想象的那么快。我想我想知道为什么使用宽度和高度属性会减慢网站速度。

标签: php javascript html image resize


【解决方案1】:

使用 Javascript 调整图像大小通常不是理想的方法。您正在消耗所有带宽来通过网络发送完整尺寸的图像,然后将它们缩小。更好的方法是从图像存储中提取图像并在服务器端调整它们的大小。然后将结果存储在服务器端缓存中,以便您可以为所有客户端请求提供优化的图像。这里不需要过多考虑缓存的概念,在这种情况下,它可以像目录或数据库中的新列一样简单。 (FWIW,我不喜欢将二进制数据存储在数据库中,但这可能是另一个讨论)

见:http://www.white-hat-web-design.co.uk/blog/resizing-images-with-php/

【讨论】:

    【解决方案2】:

    拍摄全尺寸图像并以不同尺寸加载整个图像是一种不好的做法。考虑生成缩略图并将其放置在页面上。

    如果您有一个 2500x2500 的图像,而您只是将高度和宽度设置为 500x500,则仍然需要加载整个 2500x2500 的图像。

    【讨论】:

    • 一般来说,这更像是相反的问题。大多数图像太小,我想将它们扩展为至少 150x150(隐藏图像中溢出溢出的部分:如果它们不是方形则隐藏)。
    【解决方案3】:

    图片可能太大了。我建议准备图像以供网络使用。谷歌“优化网络图像”以获取有关如何执行此操作的一些想法。

    【讨论】:

    • 不幸的是,这不是一个选择。此外,大多数图像都非常非常小,因为它们很旧。大多数图像都小于 150x150,这是我按比例将它们扩展成的(通过溢出隐藏突出的部分:隐藏)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 2010-09-15
    • 2011-01-24
    • 2018-01-18
    • 1970-01-01
    相关资源
    最近更新 更多