当前位置:首页 > JavaScript

js实现图片另存为

2026-04-04 08:23:13JavaScript

使用Canvas和下载链接实现图片另存为

通过Canvas将图片转换为数据URL,再创建下载链接触发保存:

function saveImage(url, filename) {
  const canvas = document.createElement('canvas');
  const img = document.createElement('img');
  img.crossOrigin = 'Anonymous';

  img.onload = function() {
    canvas.width = img.width;
    canvas.height = img.height;
    const ctx = canvas.getContext('2d');
    ctx.drawImage(img, 0, 0);

    const a = document.createElement('a');
    a.href = canvas.toDataURL('image/png');
    a.download = filename || 'download.png';
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
  };

  img.src = url;
}

直接使用Blob对象下载

适用于已获取二进制数据的场景:

function saveBlobAsImage(blob, filename) {
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = filename || 'download.jpg';
  document.body.appendChild(a);
  a.click();

  setTimeout(() => {
    document.body.removeChild(a);
    URL.revokeObjectURL(url);
  }, 100);
}

处理跨域图片的解决方案

当图片存在跨域限制时:

js实现图片另存为

function saveCrossOriginImage(url, filename) {
  fetch(url, { mode: 'cors' })
    .then(response => response.blob())
    .then(blob => {
      saveBlobAsImage(blob, filename);
    })
    .catch(err => console.error('下载失败:', err));
}

注意事项

  • 跨域请求需要服务器配置CORS头
  • 某些浏览器可能限制自动下载行为
  • 大文件建议显示下载进度提示
  • iOS Safari有特殊限制,可能需要用户显式操作

完整示例(兼容多数现代浏览器)

async function downloadImage(imageUrl, saveName) {
  try {
    const response = await fetch(imageUrl, { mode: 'cors' });
    if (!response.ok) throw new Error('网络响应不正常');

    const blob = await response.blob();
    const blobUrl = URL.createObjectURL(blob);

    const link = document.createElement('a');
    link.href = blobUrl;
    link.download = saveName || 'image_' + new Date().getTime() + '.jpg';
    document.body.appendChild(link);
    link.click();

    setTimeout(() => {
      document.body.removeChild(link);
      URL.revokeObjectURL(blobUrl);
    }, 100);
  } catch (error) {
    console.error('下载失败:', error);
    // 备用方案尝试Canvas方式
    saveImage(imageUrl, saveName);
  }
}

标签: 另存为图片
分享给朋友:

相关文章

vue实现无缝图片

vue实现无缝图片

实现无缝图片轮播的方法 在Vue中实现无缝图片轮播,可以通过以下步骤完成。这种方法利用Vue的响应式特性和CSS动画,确保图片切换平滑且无缝。 使用vue-awesome-swiper库 安装vue…

Vue实现图片 放大

Vue实现图片 放大

Vue实现图片放大功能 使用v-viewer插件 安装v-viewer插件: npm install v-viewer 在main.js中引入并配置: import Viewer from 'v-…

js实现图片放大

js实现图片放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性实现图片放大效果。当鼠标悬停时,图片会平滑放大。 const img = document…

js实现图片滚动

js实现图片滚动

图片滚动的实现方法 使用CSS动画实现 通过CSS的animation和@keyframes可以实现简单的图片滚动效果。这种方法适合静态图片的无缝循环滚动。 <style> .scr…

实现图片旋转js

实现图片旋转js

使用CSS transform属性旋转图片 通过CSS的transform属性可以轻松实现图片旋转。以下是一个简单的示例代码: const image = document.getElement…

vue实现图片的滚动

vue实现图片的滚动

实现图片滚动的几种方法 在Vue中实现图片滚动可以通过多种方式完成,以下是几种常见的方法: 使用CSS动画 通过CSS的animation和@keyframes实现简单的图片滚动效果。 <t…