uniapp 安卓原生截图保存到相册跟api服务器 canvas实现 plus.nativeObj.Bitmap实现

复制代码
// 截图plus.nativeObj.Bitma

// const handleScreenshot = () => {
//   try {
//     const timestamp = new Date().getTime()
//     const filePath = `_doc/screenshot_${timestamp}.png`
//     const currentPages = getCurrentPages()
//     const currentPage = currentPages[currentPages.length - 1]
//     const webview = currentPage.$getAppWebview() // 获取当前页面 webview
//     const bitmap = new plus.nativeObj.Bitmap('screenshot_' + timestamp)
//     webview.draw(
//       bitmap,
//       () => {
//         // 保存到本地 _doc/
//         bitmap.save(
//           filePath,
//           { overwrite: true, format: 'png' },
//           (res) => {
//             console.log('截图保存成功', res.target)

//             // 保存到手机相册
//             plus.gallery.save(res.target, (galleryRes) => {
//               console.log('已保存到相册:', galleryRes)
//               uni.showToast({ title: '已保存到相册', icon: 'success' })
//             }, (galleryErr) => {
//               console.error('保存相册失败', galleryErr)
//             })

//             // 上传到服务器
//             uni.uploadFile({
//               url: 'http://xxxxxx:8090/photo/upload',
//               filePath: res.target,
//               name: 'file',
//               success: (uploadRes) => uni.showToast({ title: '已到媒体库', icon: 'success' }) ,
//               fail: (err) => console.error('上传失败', err)
//             })

//             // 释放 bitmap 资源
//             bitmap.clear()
//           },
//           (err) => {
//             console.error('保存 _doc/ 失败', err)
//             bitmap.clear()
//           }
//         )
//       },
//       (err) => {
//         console.error('截图 draw 失败', err)
//         bitmap.clear()
//       }
//     )
//   } catch (error) {
//     console.error('截图异常', error)
//   }
// }


// 截图 canvas
// const handleScreenshot = () => {
//   try {
//     const timestamp = new Date().getTime()
//     const canvasId = 'drawCanvas'          // 你的 canvas-id
//     const filePath = `_doc/screenshot_${timestamp}.png`

//     // 使用 uniApp 官方 API 生成临时文件
//     uni.canvasToTempFilePath({
//       canvasId,
//       fileType: 'png',
//       success: (res) => {
//         console.log('canvas 截图成功', res.tempFilePath)

//         // 保存到本地 _doc/
//         const tempPath = res.tempFilePath

//         // 保存到手机相册
//         plus.gallery.save(tempPath, 
//           () => {
//             console.log('已保存到相册:', tempPath)
//           }, 
//           (err) => {
//             console.error('保存到相册失败', err)
//           }
//         )

//         // 上传到服务器
//         uni.uploadFile({
//           url: 'http://xxxxx/photo/upload',
//           filePath: tempPath,
//           name: 'file',
//           success: (uploadRes) => console.log('上传成功', uploadRes),
//           fail: (err) => console.error('上传失败', err)
//         })
//       },
//       fail: (err) => {
//         console.error('canvas 截图失败', err)
//       }
//     })
//   } catch (error) {
//     console.error('截图异常', error)
//   }
// }

两个绘制跟界面合成一张图截图-实现

复制代码
<template>
  <view >  
          <view @click="handleScreenshot">截图</view>
  <canvas canvas-id="canvasMerge" width="750" height="517"
      style="width:750rpx;height:517rpx;position:absolute;left:-9999px;top:-9999px;"></canvas>
  </view>
</template>


let imgPath1 = ref('')
let imgPath2 = ref('')
const screenshotBitmap = async () => {
  return new Promise((resolve, reject) => {
    try {
      const timestamp = new Date().getTime()
      const filePath = `_doc/screenshot_bitmap_${timestamp}.png`
      const currentPages = getCurrentPages()
      const currentPage = currentPages[currentPages.length - 1]
      const webview = currentPage.$getAppWebview()
      const bitmap = new plus.nativeObj.Bitmap('screenshot_' + timestamp)

      webview.draw(
        bitmap,
        () => {
          bitmap.save(
            filePath,
            { overwrite: true, format: 'png' },
            (res) => {
              imgPath1.value = res.target
              bitmap.clear()
              resolve(res.target)
            },
            (err) => {
              bitmap.clear()
              reject(err)
            }
          )
        },
        (err) => {
          bitmap.clear()
          reject(err)
        }
      )
    } catch (error) {
      reject(error)
    }
  })
}
// ------------------------
// 截图 canvas
// ------------------------
const screenshotCanvas = async (canvasId = 'drawCanvas') => {
  return new Promise((resolve, reject) => {
    try {
      const timestamp = new Date().getTime()
      plus.io.resolveLocalFileSystemURL('_doc/', (docEntry) => {
        const fileName = `screenshot_canvas_${timestamp}.png`
        uni.canvasToTempFilePath({
          canvasId,
          fileType: 'png',
          success: (res) => {
            plus.io.resolveLocalFileSystemURL(res.tempFilePath, (entry) => {
              entry.copyTo(
                docEntry,
                fileName,
                (newEntry) => {
                  imgPath2.value = newEntry.toLocalURL()
                  resolve(newEntry.toLocalURL())
                },
                (err) => reject(err)
              )
            }, (err) => reject(err))
          },
          fail: (err) => reject(err)
        })
      }, (err) => reject(err))
    } catch (error) {
      reject(error)
    }
  })
}
// 合成截图
const mergeScreenshots = async (path1, path2) => {
  const systemInfo = uni.getSystemInfoSync()
  const canvasWidthPx =systemInfo.screenWidth 
  const canvasHeightPx = systemInfo.screenHeight 

  return new Promise((resolve, reject) => {
    try {
      const ctx = uni.createCanvasContext('canvasMerge')
      ctx.clearRect(0, 0, canvasWidthPx, canvasHeightPx)
      ctx.drawImage(path1, 0, 0, canvasWidthPx, canvasHeightPx)
      ctx.drawImage(path2, 0, 0, canvasWidthPx, canvasHeightPx)

      ctx.draw(false, () => {
        const timestamp = new Date().getTime()
        const fileName = `merge_${timestamp}.png`

        uni.canvasToTempFilePath({
          canvasId: 'canvasMerge',
          fileType: 'png',
          success: (res) => {
            plus.io.resolveLocalFileSystemURL('_doc/', (docEntry) => {
              plus.io.resolveLocalFileSystemURL(res.tempFilePath, (entry) => {
                entry.copyTo(
                  docEntry,
                  fileName,
                  (newEntry) => resolve(newEntry.toLocalURL()),
                  (err) => reject(err)
                )
              }, (err) => reject(err))
            }, (err) => reject(err))
          },
          fail: (err) => reject(err)
        })
      })
    } catch (error) {
      reject(error)
    }
  })
}
// ------------------------
// 点击按钮执行
// ------------------------
const handleScreenshot = async () => {
  try {
    const path1 = await screenshotBitmap()
    const path2 = await screenshotCanvas('drawCanvas')
    const mergedPath = await mergeScreenshots(path1, path2)
    // 保存到相册
    plus.gallery.save(
      mergedPath,
      () => uni.showToast({ title: '已保存到相册', icon: 'success' }),
      (err) => console.error('保存相册失败', err)
    )

    // 上传到服务器
    uni.uploadFile({
      url: 'http://xxxx:8090/photo/upload',
      filePath: mergedPath,
      name: 'file',
      success: (res) => console.log('上传成功', res),
      fail: (err) => console.error('上传失败', err)
    })
  } catch (error) {
    console.error('截图/合成异常', error)
  }
}
相关推荐
Digitally1 小时前
2026 年 8 款安卓数据擦除软件和应用对比
android
杨忆1 小时前
android 11以上 截图工具类
android
粤M温同学2 小时前
Android Studio 中安装 CodeBuddy AI助手
android·ide·android studio
阿拉斯攀登2 小时前
【RK3576 安卓 JNI/NDK 系列 08】RK3576 实战(二):JNI 调用 I2C 驱动读取传感器数据
android·安卓ndk入门·jni方法签名·java调用c++·rk3576底层开发·rk3576 i2c开发
赶路人儿4 小时前
常见的mcp配置
android·adb
符哥20084 小时前
充电桩 WiFi 局域网配网(Android/Kotlin)流程、指令及实例说明文档
android·开发语言·kotlin
没有了遇见5 小时前
Android 项目架构之<用户信息模块>
android
2501_916007476 小时前
HTTPS 抓包的流程,代理抓包、设备数据线直连抓包、TCP 数据分析
网络协议·tcp/ip·ios·小程序·https·uni-app·iphone
Georgewu6 小时前
如何判断应用在鸿蒙卓易通或者出境易环境下?
android·harmonyos
localbob7 小时前
Pico 4XVR 1.10.13安装包下载与安装教程 ico 4XVR最新版下载、4XVR 1.10.13 APK安装包、Pico VR看电影软件、4XVR完整版安装教程、Pico 4播放器推荐、V
android·vr·vr播放器·vr眼镜播放器下载·pico 4xvr·4xvr下载·pico 4xvr最新版安装包