【问题标题】:Using JavaScript, can I save images as their CSS thumbnailed sizes?使用 JavaScript,我可以将图像保存为其 CSS 缩略图大小吗?
【发布时间】:2018-09-05 03:03:43
【问题描述】:

也许是一个奇怪的用例,但假设以下代码,其中 image1.jpg 是 1920x1080:

<a href="http://example.com/dir/photos/image1.jpg" target="_blank">
    <img src="http://example.com/dir/photos/image1.jpg">
</a>

如您所见,图像在页面上完全加载;但是,上面没有显示用于在页面上将该图像显示为缩略图的 CSS(例如,480 x 270)。

是的,这是一种非常未优化的做法。

我遇到的问题是客户在多个页面上发生了数百次此类事件。我正在尝试快速创建完全符合页面大小的图像的缩略图版本。有些图像比其他图像更宽/更高,并且图像/文件夹名称到处都是,因此从渲染页面创建每个图像的缩略图是我想要完成的任务。

理想情况下,我正在考虑使用 JS(或 jQuery,如果有人知道任何特定方法)来定位所有图像(但这需要发生),以最终创建和下载/保存缩略图为其 CSS 大小- 页面表示。

我希望这个问题有意义。如果需要,我很乐意澄清更多。感谢您提供的任何帮助!

【问题讨论】:

  • 听起来应该在后端处理,而不是前端
  • 很遗憾,这不是我现在可用的解决方案。我需要从渲染页面创建缩略图版本,将它们存储在自己的某个地方,然后相应地重新链接每个 img 标签。鉴于我所处的环境,我只是想减少已经很长的工作量。
  • 如果你的后端是用php运行的,你可以试试扩展slir:github.com/lencioni/SLIR

标签: javascript jquery html css image


【解决方案1】:

以下代码从页面中获取所有图像,并将它们缩放到用于渲染的有效 CSS 大小,然后执行下载。 它的工作方式如下:

  1. 生成一个空的画布元素
  2. 生成图像,并在其中加载原始图像元素源
  3. 使用原始图像大小将新图像的内容转储到画布中。
  4. 将画布的内容转储回原始图像元素中
  5. 执行 download() 函数(仅适用于 chrome)

function scaleToElementSize(img){
  return new Promise( (resolve,reject)=>{
    // create an empty canvas and assign to it
    // the rendered proportions of the provided image 
    let c = document.createElement('canvas');
    c.height = img.height;
    c.width = img.width ;
    const ctx = c.getContext("2d");

    // create an image element, and load the source
    // image in it
    let i = new Image();
    i.setAttribute('crossOrigin', 'anonymous');
    i.src = img.src;

    // when image is loaded, copy its contenta scaled     
    // into the canvas, dump the resulting scaled
    // image back, to the original image, and download
    i.onload = ()=>{
       ctx.drawImage(i, 0, 0, c.width, c.height); 
       img.setAttribute('filename', img.src);
       img.onload = null;
       img.src =  c.toDataURL("image/png");
       resolve();
    }
  });
}

function download(img){
  var link = document.createElement('a');
  link.download = img.getAttribute('filename');
  link.href = img.src.replace("image/png", "image/octet-stream");;
  link.click();
}

 document.querySelectorAll('img').forEach( img=>{
   img.onload= function(){ 
     scaleToElementSize(img)
     .then( ()=> download(img) )
   }
 })
<img src="https://placekitten.com/200/286?a.jpg" width="100">
<img src="https://placekitten.com/200/139?b.jpg" width="200">
<img src="https://placekitten.com/408/287?c.jpg" width="110">

【讨论】:

  • 这样能解决保存图片的需求吗?
  • 我更新了我的答案,现在它会自动下载重新缩放的图像(仅限 chrome)
  • 非常感谢您的回答!多么酷的解决方案。我必须在 TamperMonkey 中为我的特定用例做一个小的调整,即取消“img.onload=”,而不是将该函数包装在 IIFE 中。然后,我将完整的 querySelectorAll() 块包装在一个命名函数中,然后我通过 setTimeout() 调用该函数,该函数等待足够长的时间以确保页面已完全加载所有图像。 “img.onload=”与 TamperMonkey 中的任何 @run-at 参数都不能很好地配合(不是你的错)。再次感谢您分享您的解决方案;我一定会更深入地研究它!
猜你喜欢
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
相关资源
最近更新 更多