保存图片到相册

# 保存图片到相册

# APP

通常图片的来源分为网络图片本地图片(相册、相机)Base64。 不同的来源,图片保存有一定的差异性。 下面分别针对不同来源,实现图片保存操作。

  • 网络图片

在 app 实现保存网络图片到相册,这个功能还是比较简单的,只需要使用 uni.downloadFileuni.saveImageToPhotosAlbum 两个 API 即可。前者用来下载网络图片到本地,获取临时路径。 后者基于临时路径进行保存到相册操作。

具体代码实现:

uni.downloadFile({
  url: 'https://www.example.com/file/test',
  success: (res) => {
    if (res.statusCode === 200) {
      uni.saveImageToPhotosAlbum({
        filePath: res.tempFilePath,
        success: function () {
          console.log('save success');
        },
      });
    }
  },
});
  • 本地图片(相册、相机)

需要访问用户相册、相机,在使用时需要获取系统访问权限。

uni.chooseImage({
  count: 1,
  sourceType: ['camera'], //支持 'camera', 'album' ,在不指定 sourceType 时,默认情况下支持两种方式
  success: function (res) {
    uni.saveImageToPhotosAlbum({
      filePath: res.tempFilePaths[0],
      success: function () {
        console.log('save success');
      },
    });
  },
});
  • 基于 base64

通常出现 base64 编码格式的图片情况,通常出现在营销活动宣传海报的。比如基于 canvas 绘制课程海报,活动推广等。

接下来现分析具体的实现思路:

uni.saveImageToPhotosAlbum 方法入手,它接收参数为 临时路径永久路径 (不支持网络图片)。 意味着,只需要想办法把 base64 编码格式图片转成本地文件,获取其临时文件路径即可。

思路有了,那么在 uniapp 中有提供这样的支持 ? 有,可以利用 Bitmap(位图)

Bitmap 是什么?

即位图。它本质上就是一张图片的内容在内存中的表达形式

这里不详细展开,具体可以通过查阅资料了解更多关于 Bitmap 的知识。

如何去构建对应的 Bitmap 对象? 在 uniapp 中,可以通过 plus+ 中提供 plus.nativeObj.Bitmap 构建位图对象。

下面具体的实现:

const bitmap = new plus.nativeObj.Bitmap('bitmap');
const base64 = '';
// 加载 Base64 编码格式图片到 Bitmap 对象
bitmap.loadBase64Data(base64, () => {
  // 指定存储临时目录
  const url = `_doc/${Date.now()}.png`;
  // 保存图片
  bitmap.save(
    url,
    {
      overwrite: true,
    },
    (i) => {
      // 保存图片到相册
      uni.saveImageToPhotosAlbum({
        filePath: i.target,
        success() {
          console.log('save success');
        },
      });
    },
    () => {
      uni.showToast({
        title: '保存图片失败',
      });
    }
  );
});

关于 plus.nativeObj.Bitmap 详细介绍,可以参考这里 (opens new window).

Last Updated: 9/1/2024, 6:28:54 PM