MUI 拍照或選取照片上傳作為頭像


1.第一種方法是用H5來實現的

  HTML:

1 <label>
2     <input style="opacity: 0;" type="file" accept="image/*" id="head_img_change"/>
3     <img id="headimg" src="img/erma_search_goods_detail.png">
4 </label>

 

  JQ:

 1 $(function(){
 2 
 3     $("#head_img_change").change(function() {
 4       var $file = $(this);
 5       var fileObj = $file[0];
 6       var windowURL = window.URL || window.webkitURL;
 7       var dataURL;
 8       var $img = $("#headimg");
 9       if(fileObj && fileObj.files && fileObj.files[0]){
10         dataURL = windowURL.createObjectURL(fileObj.files[0]);
11         $img.attr('src',dataURL);
12       }else{
13         dataURL = $file.val();
14         var imgObj = document.getElementById("headimg");
15         // 1、在設置filter屬性時,元素必須已經存在在DOM樹中,動態創建的Node,也需要在設置屬性前加入到DOM中,先設置屬性再加入,無效;
16         // 2、src屬性需要像下面的方式添加,上面的兩種方式添加,無效;
17         imgObj.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)";
18         imgObj.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = dataURL;
19       }
20     });
21 
22   })

 

  說明:1)外部加個label是為了把讓用戶點擊的時候在范圍內的都會觸發input

     2)H5  input file上傳圖片,調用API:<input type="file" accept="image/*;capture=camera">直接調用相機
                       <input type="file" accept="image/*" />調用相機、圖片或者相冊

       注:部分android機只能調用本地相冊,相機調用不了或者只能調用相機,不能調用相冊。

     3)此方法是網上的一種方法,做了兼容的,IE6以上都能正常運行。

 

2.第二種方法:MUI h5+

   不用引入mui.js或mui.min.js,直接在hbuilder這個IDE中新建移動app,然后在頁面中直接調用方法就行了,當然,需要在manifest.json中先配置權限,然后真機調試才能看到效果。點擊這里是拍照調用方法的文檔

function getImage(){
    var cameraObj = plus.camera.getCamera();
    cameraObj.captureImage(function(path){
        CompressImage(path)
    }, function(e){
        console.log('取消拍照');
    }, {
        filename:'_doc/pic/',
        index:1
    });
}
function CompressImage(path){
    plus.zip.compressImage( {
        src:path,
        dst:path,
        overwrite:true,
        quality:60,
        rotate:90
    }, function(event){
        var _src=event.target;
        mui.confirm("是否保存該圖片","溫馨提示",["否","是"],function(e){
            console.log(_src)
            if(e.index){
                plus.gallery.save(_src, function(evt){
                    $(".box").append('<img src="'+evt.file+'">');
                    mui.alert('保存成功'+evt.file);
                    
                }, function(err){
                    mui.alert('保存失敗: '+JSON.stringify(err));
                    
                });
            }
        })

        console.log(event.size)
    }, function(err){
        
    });
}

 說明: 

  getImage()是點擊拍照按鈕之后觸發的事件。CompressImage(path)是壓縮圖片的事件。

  拍照上傳需要用到5+的api。plus.camera.getCamera()是獲取到camera攝像頭對象

  該對象有三個方法,其中一個是captureImage,它有三個參數,captureImage(successCB, errorCB, option)

    successCB:拍照操作成功的回調函數(必選)CameraSuccessCallback

    errorCB:拍照操作失敗的回調函數(可選)CameraErrorCallback

    option:攝像頭拍照參數(必選)CameraOption。

    option這個對象的屬性:filename: 拍照或攝像文件保存的路徑;

               index: 拍照或攝像默認使用的攝像頭,1表示主攝像頭(后),2表示輔攝像頭(前) 

 

  compressImage是圖片壓縮的方法,屬於5+里的zip接口。plus.zip.compressImage( options, successCB, errorCB),它也有三個參數,具體的參數信息可查看這里

  plus.gallery.save是保存文件到本地的方法,屬於5+里的gallery接口,plus.gallery.save( path, successCB, errorCB )。它也有三個參數,具體的參數信息可查看這里

 在上面的compressImage方法中,我加入了rotate:90的屬性,是因為手持設備不同方向所拍攝的照片方向不同,照片的方向都會不同,但相冊中會自動糾正,這一問題在ios和android中都存在。

 一般你只要豎直拍攝的照片,在頁面上顯示的時候就會自動旋轉90度的樣子。所以這里強制旋轉90度,適用於大部分情況,但是如果拍攝的時候橫着拍,或者180度倒着拍就不行了。
 可以考慮使用Exif.js來獲取圖片的拍照方向,然后設置旋轉就能解決問題。

 拍照完成了,上傳的話,就可以用canvas把圖片編碼成base64,然后在后台解碼base64就行了。也可以考慮使用5+api中的uploader來上傳

 這里有我自己總結的 5+ runtime 常用api,里面有詳細的說明


第三種方法是通過form表單來實現:只需兩步
第一步:html
<form action="" method="post" enctype="multipart/form-data">
    <input type="file" onchange="uploadImg(this,'behindeImg')" class="comFileBtn"  accept="image/*"/>
</form>
第二步:js 
//上傳圖片
//that是該input,imgName是圖片要顯示的src的位置
function uploadImg(that,imgName){
    var reads= new FileReader();
    var fileObj=that.files[0];
    var imageType = /^image\//;
    //是否是圖片,如果input沒加accept屬性,這里也可以判斷
    if (!imageType.test(fileObj.type)) {
        alert("請選擇圖片!");
        return;
    }
    //讀取完成
    reads.readAsDataURL(fileObj);
    reads.onload = function(e) {
        //圖片路徑設置為讀取的圖片
        $("#"+imgName).attr('src',e.target.result) ;
    };
}

 這樣,后台也可以通過讀取表單數據來獲取內容了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM