uni-app 有没有屏幕截图、截屏的插件
uni-app 有没有屏幕截图、截屏的插件
html5+有没有类似在手机qq钱包里买东西然后将交易结果保存成图片的插件,
要实现这样截屏并保存到本地从什么方向下手?
更新=====
plus.webview补充了截屏方法,这个效率更高,而且ios、Android都可以直接用。http://html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewObject.draw
以下为过期信息===========================================
不需要插件,Native.js搞定。附件是一段Native.js代码。
var Activity,view,viewClass,BitmapFactory,StringBuffer,Byte,CompressFormat,ByteArrayOutputStream,str,bBitmap,bStream,bytes,Base64;
var bitmap = null;
function plusReady(){
// 导入Native.js需要的原生对象
Activity = plus.android.runtimeMainActivity();
BitmapFactory = plus.android.importClass(“android.graphics.BitmapFactory”);
StringBuffer = plus.android.importClass(“java.lang.StringBuffer”)
Byte = plus.android.importClass(“java.lang.Byte”);
CompressFormat = plus.android.importClass(“android.graphics.Bitmap.CompressFormat”);
bBitmap = plus.android.importClass(“android.graphics.Bitmap”);
ByteArrayOutputStream = plus.android.importClass(“java.io.ByteArrayOutputStream”);
Base64 = plus.android.importClass(“android.util.Base64”);
//viewClass = plus.android.importClass(“android.view.View”);
document.getElementById("btGetCapture").disabled="";
}
function getCapture () {
//配置view缓存
view = Activity.getCurrentFocus();
plus.android.invoke(view,“setDrawingCacheEnabled”,true);
plus.android.invoke(view,“buildDrawingCache”);
//对view截图,存入bitmap中
bitmap = plus.android.invoke(view,“getDrawingCache”);
if (bitmap != null) {
console.log("截图成功");
// 将原生Bitmap转换成Base64字符串,赋值给js变量
try {
str = new StringBuffer();
bStream = new ByteArrayOutputStream();
bitmap.compress(bBitmap.CompressFormat.PNG, 100, bStream);
bStream.flush();
bStream.close();
bytes = bStream.toByteArray();
str.append(Base64.encodeToString(bytes, Base64.NO_WRAP));
} catch (e) {
console.log(e.message);
}
console.log("截图字节长度:"+str.length());
document.getElementById("imgCapture").src = "data:image/png;base64," + str.toString();
}
else {
console.log("截图失败,请重试"); //此处可以进一步优化为失败后循环截图直到获取到截图
}
}
</script>
<style type="text/css">
body{
margin: 0px; padding: 0px;
}
</style>
</head>
<body>
<!--<button onclick="history.back()">后退</button>-->
<button onclick="location.reload()">刷新</button>
<button id="btGetCapture" onclick="getCapture()" disabled="disabled"> 截图 </button>
<img id="imgCapture" style="width: 100%;"/>
</body>
</html>多谢回答,现在我想把这个图片保存到手机本地,应该如何解决。
回复 dipper: 你可以在原生层直接用Native.js保存到手机上,也可以js层用plus.io保存
我有一个问题不明白,就是importClass 里面的原生类 是放在哪里的?安卓也是要导入lib的 才可以引用,不太理解 这个是放在哪里?求大声讲解
plus.webview的draw方法里的clip设置截屏区域在ios下好像不起作用
这个有bug,硬件加速情况下,截取不到canvas
回复 2***@qq.com: canvas 本身可直接转图像
plus.webview.bitmap.draw的截屏方法无法截取TABBAR的内容。
回复 诗雨:uni-app的 tabbar、navigationbar不属于webview渲染的
为什么,我复制下来的报错了
Uncaught Attempt to invoke virtual method ‘java.lang.String java.lang.Class.getName()’……
我也是醉了又是这种用不了的东西拿出来
使用drag截图,为何保存到相册里的图片是纯白色的?
代码如下:
‘’’
// 截屏绘制
var bitmap = null;
function captureWebview() {
bitmap = new plus.nativeObj.Bitmap(‘test’);
let ws = plus.webview.currentWebview();
// 将webview内容绘制到Bitmap对象中
ws.draw(bitmap, function() {
console.log(‘截屏绘制图片成功’);
var path = “_doc/project_barcode.png”;
var options = {
“overwrite”: true,
“format”: “png”,
“quality”: 50
}
bitmap.save(path, options, bmSaveSuccessCB, bmSaveErrorCB); //将图片保存到指定的路径(仅支持本地文件系统)
//保存到相册后,回收Bitmap图片内存
bitmap.recycle();
}, function(e) {
console.log(‘截屏绘制图片失败:’ + JSON.stringify(e));
});
}
var bmSaveSuccessCB = function(e) {
console.log(e)
console.log(“保存成功”)
console.log(“保存地址:” + e.target)
saveToGallery(e.target)
}
var bmSaveErrorCB = function(error) {
plus.nativeUI.toast(“保存失败”)
console.log(“code:” + error.code + “;msg:” + error.message);
}
function saveToGallery(path) {
console.log(path)
plus.gallery.save(path, function(e) {
plus.nativeUI.toast(‘保存到相册成功’)
console.log(JSON.stringify(e));
}, function(err) {
plus.nativeUI.toast(err.message )
console.log(“保存到相册失败:” + JSON.stringify(err));
});
}
‘’’
感谢分享
赞,但是IOS要怎么写?
+1,ios呢?plus.webview不能截取canvas里面的图
plus.webview.WebviewObject.draw可以对指定部分内容截图吗?(用过html2canvas,但在手机上截图模糊)
请问前辈 这个问题解决了吗?
CompressFormat = plus.android.importClass(“android.graphics.Bitmap.CompressFormat”);
这里出错的
去掉这的CompressFormat 就可以了,但是又出现个新问题,截图按钮成俩个了
bitmap.compress(bBitmap.CompressFormat.PNG, 100, bStream);
这里出错,请问是什么原因???
具体怎么解决啊,少代码啊
控制台报错,而且保存的图片字符串长度为0,图一和图二报错是在同一行,
这是文档上例子,供参考:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Webview Example</title> <script type="text/javascript"> var ws=null; // H5 plus事件处理 function plusReady(){ ws=plus.webview.currentWebview(); } if(window.plus){ plusReady(); }else{ document.addEventListener('plusready', plusReady, false); } // 截屏绘制 var bitmap=null; function captureWebview() { bitmap = new plus.nativeObj.Bitmap('test'); // 将webview内容绘制到Bitmap对象中 ws.draw(bitmap,function(){ console.log('截屏绘制图片成功'); },function(e){ console.log('截屏绘制图片失败:'+JSON.stringify(e)); }); } </script> </head> <body> 截屏绘制Webview窗口<button onclick="captureWebview()">Draw</button> </body> </html>
如果是要生成超出屏幕的截图,怎么办??
使用drag截图,如果页面使用了plus.video.VideoPlayer无法截取视频,截取的图片视频区域是一片黑色
亲,有解决方案吗
这种方式截屏太过于局限,如果页面视频控件,多个webview是无法满足的。只能通过原生插件的方式去截屏
如何把base64格式的图片保存成JPG或者PNG 然后并保存到相册呢
在uni-app中,虽然官方没有直接提供一个内置的屏幕截图插件,但你可以通过一些方法实现屏幕截图功能。以下是一个使用HTML5 Canvas和JavaScript实现屏幕截图的示例代码,你可以在uni-app项目中集成并使用它。
首先,你需要创建一个页面或组件,并在其中添加用于触发截图功能的按钮以及展示截图结果的区域。然后,你可以使用Canvas API来捕获页面的屏幕截图。
示例代码
- 页面或组件的模板部分(template):
<template>
<view>
<button @click="captureScreen">截图</button>
<image v-if="screenshot" :src="screenshot" style="width: 100%; height: auto;"></image>
</view>
</template>
- 页面或组件的脚本部分(script):
<script>
export default {
data() {
return {
screenshot: null, // 存储截图的URL
};
},
methods: {
captureScreen() {
// 创建一个与页面大小相同的Canvas
const canvas = document.createElement('canvas');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
// 获取Canvas的2D绘图上下文
const context = canvas.getContext('2d');
// 创建一个临时的Image对象,并设置其src为当前页面的URL(这里使用'#'表示当前页面)
const img = new Image();
img.src = '#'; // 注意:在uni-app中,这里可能需要特殊处理,如先渲染到一个离屏Canvas再截图
// 当Image加载完成后,将其绘制到Canvas上
img.onload = () => {
// 注意:由于uni-app的限制,直接使用img.src = '#'可能不会生效
// 这里应该使用uni-app提供的API或方法来获取页面内容并绘制到Canvas上
// 以下是一个假设性的处理,实际需要根据uni-app的特性进行调整
// 例如,你可能需要先将页面内容渲染到一个隐藏的Canvas上,然后再从那个Canvas复制到新的Canvas进行截图
// 假设我们已经有一个包含页面内容的Canvas,名为sourceCanvas
const sourceCanvas = document.getElementById('sourceCanvas'); // 这个ID需要你自己在页面中定义一个隐藏的Canvas
if (sourceCanvas) {
context.drawImage(sourceCanvas, 0, 0, canvas.width, canvas.height);
// 将Canvas内容转换为Data URL
this.screenshot = canvas.toDataURL('image/png');
} else {
console.error('Source canvas not found!');
}
};
// 注意:上面的img.onload处理可能不适用于uni-app,因为img.src = '#'不会加载任何内容
// 你需要根据uni-app的实际情况进行调整,比如使用uni-app提供的API进行截图
},
},
};
</script>
注意:上面的代码示例中,直接使用img.src = '#'
来加载当前页面内容的方法在uni-app中是不会生效的。你需要根据uni-app的特性,使用其提供的API或方法来获取页面内容,并将其绘制到Canvas上。例如,你可以先将页面内容渲染到一个隐藏的Canvas上,然后再从那个Canvas复制到新的Canvas进行截图。由于uni-app的具体实现细节可能会有所不同,你需要参考其官方文档或社区资源来进行调整。