【发布时间】:2018-07-19 13:24:01
【问题描述】:
我正在构建一个 Electron 应用程序 (Chrome + Node.js),其目标是显示指定文件夹的所有图像。
这是一个应用程序,所以所有的图像都已经在磁盘上,不需要下载任何东西。
问题:
我需要它将所有图像显示为64x64 缩略图,但由于它们被加载为<img> 元素,原始图像被加载到 RAM 中并且只有在 CSS 将它们“调整大小”为width: 64px; height: 64px ,但事实并非如此,它仍将原始图像保存在 RAM 中,因此显示 300 张图像(1mb-20mb)需要大约 3.5 GB 的 RAM。
问题:
所以,我想知道是否有更简单的方法来获取图像的 64x64 缩略图并在网页上显示它而不是原始图像?
是否有可能在显示之前(即在将它们加载到 RAM 之前)使浏览器缩小(实际上将图像大小调整为 64x64)?
试过了:
我尝试使用<canvas> 而不是<img>,但它使应用在滚动时变得迟缓,因为它的计算量非常大(~0.1 毫秒/图像)。我想将其发送给网络工作者,但无法做到。
// 我在那里使用 vue.js
// THIS TAG IS INSIDE A V-FOR LOOP SO A CANVAS TAG IS CREATED FOR EACH ITEM IN THE LIST
<canvas :id="'item-' + props.index">
{{drawThumbnails(props.item.path, props.index)}}
</canvas>
drawThumbnails (path, canvasId) {
console.time('draw time')
var image = new Image();
image.onload = function() {
var canvas = document.getElementById(canvasId);
canvas.width = 64;
canvas.height = 64;
canvas.getContext("2d").drawImage(image, 0, 0, 64, 64);
}
image.src = path
console.timeEnd('draw time')
}
我想我可以做到这一点的另一种方法是使用jimp 将图像大小调整为64x64 并将它们保存到磁盘。这很慢,但我可以使用网络工作者将此作业发送到另一个核心
【问题讨论】:
-
在处理请求时,您可以在航班上制作任何尺寸的图像副本。 github.com/fluent-ffmpeg/node-fluent-ffmpeg
-
经典的最佳做法是在您的服务器上制作实际的缩略图,这样您就不会每张图片下载 20mb... 这很简单,而且很有效。如果您对每个请求执行任何调整大小,您的服务器可能会在一小时内关闭。
-
让浏览器加载原始文件是不好的做法。按需生成不同的版本,将它们缓存在服务器上,然后只将一个发送到需要的浏览器。客户端缓存将由浏览器处理,不用担心。也许使用 ETag 和/或 If-Modified-Since 标头。
-
“是否有可能让浏览器在显示之前(即在将它们加载到 RAM 之前)缩小尺寸(实际上将图像大小调整为 64x64)?” - 它需要首先解压缩原始图像,然后甚至 一些东西要缩小。除非您希望它在一张纸或其他东西上做到这一点,否则这当然意味着 RAM。
-
@sjahan 这是一个应用程序,所有图像都位于本地磁盘上
标签: javascript html node.js browser browser-cache