当前位置:首页 > 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图片多选实现方法 基础实现方案 使用v-model绑定数组配合input[type="checkbox"]实现多选功能。创建图片列表数据时,每个图片对象应包含唯一标识符: data() {…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现保存图片

js实现保存图片

使用Canvas绘制并保存图片 在HTML中创建一个Canvas元素,通过JavaScript绘制内容后转换为图片并保存。Canvas的toDataURL方法可将画布内容转为Base64编码的图片数据…

vue实现图片拖动

vue实现图片拖动

Vue 实现图片拖动的步骤 使用 HTML5 拖放 API 在 Vue 中实现图片拖动可以利用 HTML5 的拖放 API。通过 draggable 属性设置元素可拖动,监听 dragstart、dr…

vue实现图片活动

vue实现图片活动

Vue 实现图片轮播 使用 Vue 实现图片轮播可以通过多种方式完成,以下是几种常见的方法: 使用第三方库(如 Swiper) Swiper 是一个流行的轮播图库,支持 Vue 集成。安装 Swip…

vue实现图片保存

vue实现图片保存

实现图片保存的基本方法 在Vue中实现图片保存功能通常涉及前端操作,可能包括从Canvas生成、直接下载或通过后端接口保存。以下是几种常见实现方式: 使用HTML5的download属性 对于已存在…