H5+对手机相机的调用:调用相机模组

  @[toc]

  一.效果图展示

  基本样式如下:

  上传照片之后,上传到服务器之后,进行调用文字识别和翻译API之后返回到该页面,之后的效果图:

  二. 前端样式以及JS控制转码

  这部分主要是H5+对手机相机的调用:

  1.首先,把mui的css和js引入到我的页面中:(准备工作)

  

  2.前端元素样式-》输入框和ui元素的使用:

  

  2.1 H5+中的调用相机模块和图库

  在H5+里面调用的相机模块和图库之后到页面,展示出来为后面裁剪照片做准备:

  拍照和相册选择如下:

   document.getElementById("moreMenus").addEventListener("tap", function() {

  1. var editButtons = new Array();
  2. editButtons.push({
  3. title: "拍照上传",
  4. style: "default"
  5. });
  6. editButtons.push({
  7. title: "从相册选择",
  8. style: "default"
  9. });
  10. plus.nativeUI.actionSheet({
  11. cancel: "取消",
  12. buttons: editButtons
  13. }, function(e) {
  14. var index = e.index;
  15. switch (index) {
  16. case 1:
  17. captureImage();
  18. break;
  19. case 2:
  20. selectImage();
  21. break;
  22. }
  23. });

  调用效果图如下:

  2.2 拍照上传和从相册里上传的js控制如下

  拍照的具体JS控制如下:

  var cmr = plus.camera.getCamera(2);

  在调用设备的相机模块之后,将图片地址转换:

   function(path) {

  1. plus.io.resolveLocalFileSystemURL(path, function(entry) {
  2. var newPath = entry.toLocalURL() + "?version=" + Math.random();
  3. loadImage(newPath);
  4. });

  调用相机模组成功:下图为调用相机模组成功的截图

  从相册里上传JS相关的JS控件如下:选择图片:

   function selectImage() {

  1. plus.gallery.pick(function(path) {
  2. loadImage(path);
  3. }, function(e) {
  4. mui.toast("没有选择图片.");
  5. });

  确定选择图片的JS相关的Js控制器如下:

  其中调用这个函数的时候path为当前的上传发图片在本机的图片的URL:对其进行一个保存之后,在前端进行一个覆盖图层,启用几个功能按钮。

   function loadImage(path) {

  1. var img = document.getElementById("userImage_id");
  2. img.src = path;
  3. if (window.imageDisable == true) {
  4. $("#userImage_id").cropper("enable");
  5. }
  6. $("#userImage_id").cropper("replace", path);
  7. //启用几个功能按钮
  8. $("button.toolbutton").prop("disabled", false);
  9. document.getElementById("userImage_id").onclick = function() {
  10. plus.runtime.openFile(path);
  11. }

  2.3 使用cropper框架实现前端裁剪

  在使用这个cropper框架之前,我们需要先设定其的宽度和长度:

   var dataURL = $("#userImage_id").cropper("getCroppedCanvas", {

  1. width: 300,
  2. height: 300

  使用toDataUR方法,将图片文件流转码为base64的格式:代码如下:

  var imgUrl = dataURL.toDataURL("image/png", 1);

  裁切完成取消显示裁切框,确定裁切后销毁裁切组件,标记一下js裁剪上传图片的插件,下次继续裁切时需要初始化一下裁切组件,禁用几个功能按钮,向后台提供数据

   $("#userImage_id").cropper("replace", imgUrl);

  1. $("#userImage_id").cropper("clear");
  2. $("#userImage_id").cropper("disable");
  3. window.imageDisable = true;
  4. $("button.toolbutton").prop("disabled", true);

  2.4 前端文件上传给服务器(AJAX)

  使用uploadFile(image)方法:

   var rootPath = "http://XXXXXX:2313";

  rootPath为后端服务器的ip地址,url为本地目标图片的文件

  使用AJAX,将imageBase64文件流传递给我的后端,进行一个图片处理,和相关的API调用。

   mui.ajax(url, {

  1. dataType: "json",
  2. type: "post",
  3. data: {
  4. imageBase64: image
  5. },
  6. success: function(data) {
  7. if (data.result == "success") {
  8. mui.toast("上传成功!");
  9. document.getElementById("imagePath_div").innerText = data.message;
  10. document.getElementById("imagePath_div2").innerText = data.overtranslate;
  11. return;
  12. }
  13. mui.toast(data.message);
  14. },
  15. error: function(a, b, c) {
  16. mui.toast("上传头像出现错误,请稍后再试!");
  17. }

  2.5 附加功能之前端长按复制

  激活长按按钮

   mui.init({

  1. gestureConfig: {
  2. longtap: true, //默认为false
  3. }

  使用mui的长按事件 我把我的复制元素 class 设置为copy-textjs裁剪上传图片的插件,每次触发事件就会使用 innerText 获取纯文本,加了一个确认框 让用户选择是否复制,判断是安卓还是ios。

  设置 复制的内容也就是 触发事件 innerText 获取的内容

   mui('body').on('longtap', '.copy-text', function() {

  1. var copy_content = this.innerText;
  2. mui.confirm('您要复制内容吗?', '题小满', ['取消', '复制内容'], function(e) {
  3. if (e.index == 1) {
  4. if (mui.os.ios) {
  5. var UIPasteboard = plus.ios.importClass("UIPasteboard");
  6. var generalPasteboard = UIPasteboard.generalPasteboard();
  7. generalPasteboard.plusCallMethod({
  8. setValue: copy_content,
  9. forPasteboardType: "public.utf8-plain-text"
  10. });
  11. generalPasteboard.plusCallMethod({
  12. valueForPasteboardType: "public.utf8-plain-text"
  13. });
  14. mui.toast('复制成功')
  15. } else {
  16. var context = plus.android.importClass("android.content.Context");
  17. var main = plus.android.runtimeMainActivity();
  18. var clip = main.getSystemService(context.CLIPBOARD_SERVICE);
  19. plus.android.invoke(clip, "setText", copy_content);
  20. mui.toast('复制成功')
  21. }
  22. }

  长按复制功能效果展示:

文章由官网发布,如若转载,请注明出处:https://www.veimoz.com/1929
0 评论
1.2k

发表评论

!