移動(dòng)端h5圖片裁剪、上傳:解決ios豎屏拍照裁剪后圖片旋轉(zhuǎn)90度問題

最近公司要做一個(gè)h5哟玷,其中包含了圖片裁剪狮辽、上傳等功能一也,當(dāng)時(shí)也沒太在意就用了cropper插件,因?yàn)橹霸赑C端用過也熟悉喉脖,大概看了一下文檔椰苟,說是支持移動(dòng)端,就毫不猶豫的選擇了它树叽,從此踏上了填坑之路......

第一個(gè)問題:ios豎屏拍照裁剪圖片后上傳到服務(wù)器的圖片是順時(shí)針旋轉(zhuǎn)90度

原因:由于目前的手機(jī)拍照基本都在2M以上舆蝴,而ios中只要超過2M圖片就會(huì)自動(dòng)旋轉(zhuǎn)。拍照后直接取出來的UIimage(用UIImagePickerControllerOriginalImage取出)题诵,它本身的imageOrientation屬性是3洁仗,即UIImageOrientationRight。如果這個(gè)圖片直接使用則沒事性锭,但是如果對(duì)它進(jìn)行裁剪赠潦、縮放等操作后,它的這個(gè)imageOrientation屬性會(huì)變成0草冈。此時(shí)這張圖片用在別的地方就會(huì)發(fā)生旋轉(zhuǎn)她奥。imageOrientation是只讀的,不能直接修改其值怎棱。

解決方法(js): 當(dāng)拍照后哩俭,獲取input中的圖片數(shù)據(jù),利用exif.js(http://code.ciaoca.com/JavaScript/exif-js/)獲取到Orientation屬性拳恋,此屬性有四個(gè)值
1 表示旋轉(zhuǎn)0度坑填,也就是沒有旋轉(zhuǎn)。
6 表示順時(shí)針旋轉(zhuǎn)90度
8 表示逆時(shí)針旋轉(zhuǎn)90度
3 旋轉(zhuǎn)180度
我們要做的就是在拍照后刊侯,從input中獲取到圖片宾娜,然后得到它的Orientation值,在裁剪后給它逆著旋轉(zhuǎn)90度吩谦,然后上傳就好了鸳谜,代碼在這就不寫了。

第二個(gè)問題:ios豎屏拍照后裁剪圖片后所得的圖片與裁剪區(qū)域不相符式廷。

暫時(shí)沒找到原因咐扭,由于之前直接在百度上搜索cropper,然后下載滑废,也沒有看是哪個(gè)版本蝗肪,在百度中搜索也完全搜不到相關(guān)的問題,最后我在github上cropper項(xiàng)目中issue中找到答案蠕趁,應(yīng)該是cropper之前的bug薛闪,新版本已經(jīng)修復(fù),我就試著用了新版本俺陋,完美解決豁延,而且新版本中已經(jīng)解決了第一個(gè)問題昙篙。

總結(jié):

這一路下來完全是自己坑了自己,如果一開始直接在GitHub上下載最新版就不會(huì)出現(xiàn)這些問題诱咏,以后吸取教訓(xùn)苔可。

最后貼上圖片裁剪、上傳完整代碼:

<!--html-->
<!--文件上傳-->
<input type="file" class="js-uploadfile">
<!--確定裁剪-->
<input type="button" class="js-ok" value="裁剪">
<!--cropper基本結(jié)構(gòu)-->
<div class="container js-container" style="width: 100%;height: auto">
    <img class="js-image" src="" style="width: 100%;height: auto">
</div>
<!--裁剪結(jié)果顯示-->
<div style="width: 60%;height: auto;margin: 1rem 20%">
    <img id="showImg" src="" alt="" style="width: 100%;height: auto">
</div>
//js代碼
var url = './index.php';
    $(".js-uploadfile").on("change", function () {
        var fr = new FileReader();
        var file = this.files[0];

        fr.readAsDataURL(file);
        fr.onload = function () {
            //這里初始化cropper
            $('.js-image').attr('src', fr.result);
            iniCropper()
        };
    });
    var croppable = false;
    function iniCropper() {
        var $image = $('.js-image'),
            image = $image[0];
        $image.cropper({
            dragMode: 'move',
            aspectRatio: 1,
            autoCropArea: 0.65,
            restore: false,
            viewMode: 1,
            guides: false,
            center: false,
            highlight: false,
            cropBoxMovable: false,
            cropBoxResizable: false,
            toggleDragModeOnDblclick: false,
            rotatable: true,
            checkOrientation: true,
            ready: function () {
                croppable = true;
            }
        });
    }


    $('.js-ok').on('click', function () {
        var dataURL = $('.js-image').cropper("getCroppedCanvas", {
            width: 200,
            height: 200
        });
        var data = {
            imgData: dataURL.toDataURL('image/png')
        };
        submit(url, data);
    });

    function submit(url, data) {
        $.ajax({
            type: 'POST',
            url: url,
            data: data,
            success: function (res) {
                $('#showImg').attr('src', res.img_name);
            },
            dataType: 'JSON'
        })
    }
//php代碼
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/7/27
 * Time: 18:57
 */

$post_data = $_POST['imgData'];

if ($_POST) {
    if ($_POST['imgData']) {

        $base_img = $_POST['imgData'];
        $base_img = str_replace('data:image/png;base64,', '', $base_img);
        $path = './avatar/';
        $pre = 'img_';
        $output_file = $pre . time() . rand(100, 999) . '.png';
        $path = $path . $output_file;
        $success = file_put_contents($path, base64_decode($base_img));

        if ($success) {
            $ajax_return = array(
                'code' => 1,
                'msg' => '上傳成功',
                'img_name' => $path
            );
            exit(json_encode($ajax_return, JSON_UNESCAPED_UNICODE));
        }
        $ajax_return = array(
            'code' => 0,
            'msg' => '上傳失敗',
        );
        exit(json_encode($ajax_return, JSON_UNESCAPED_UNICODE));
    } else {
        $ajax_return = array(
            'code' => 0,
            'msg' => '圖片為空',
        );
        exit(json_encode($ajax_return, JSON_UNESCAPED_UNICODE));
    }
} else {
    exit('發(fā)生錯(cuò)誤');
}

源碼github地址:https://github.com/blackleafs/imageUpload.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末袋狞,一起剝皮案震驚了整個(gè)濱河市焚辅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌苟鸯,老刑警劉巖同蜻,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異倔毙,居然都是意外死亡埃仪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門陕赃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卵蛉,“玉大人,你說我怎么就攤上這事么库∩邓浚” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵诉儒,是天一觀的道長(zhǎng)葡缰。 經(jīng)常有香客問我,道長(zhǎng)忱反,這世上最難降的妖魔是什么泛释? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮温算,結(jié)果婚禮上怜校,老公的妹妹穿的比我還像新娘。我一直安慰自己注竿,他們只是感情好茄茁,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巩割,像睡著了一般裙顽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宣谈,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天愈犹,我揣著相機(jī)與錄音,去河邊找鬼蒲祈。 笑死甘萧,一個(gè)胖子當(dāng)著我的面吹牛萝嘁,可吹牛的內(nèi)容都是我干的梆掸。 我是一名探鬼主播扬卷,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼酸钦!你這毒婦竟也來了怪得?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤卑硫,失蹤者是張志新(化名)和其女友劉穎徒恋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欢伏,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡入挣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硝拧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片径筏。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖障陶,靈堂內(nèi)的尸體忽然破棺而出滋恬,到底是詐尸還是另有隱情,我是刑警寧澤抱究,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布恢氯,位于F島的核電站,受9級(jí)特大地震影響鼓寺,放射性物質(zhì)發(fā)生泄漏勋拟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一妈候、第九天 我趴在偏房一處隱蔽的房頂上張望敢靡。 院中可真熱鬧,春花似錦州丹、人聲如沸醋安。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吓揪。三九已至,卻和暖如春所计,著一層夾襖步出監(jiān)牢的瞬間柠辞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國打工主胧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叭首,地道東北人习勤。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像焙格,于是被迫代替她去往敵國和親图毕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,280評(píng)論 25 707
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,414評(píng)論 7 249
  • 今天指得記錄的就是下午的時(shí)候帶兒子去兒童醫(yī)院看病蛤虐,抽血的時(shí)候小家伙沒有哭,不單沒有哭還挺淡定的肝陪。呵呵值得表揚(yáng)驳庭!另外...
    對(duì)月飲酒閱讀 130評(píng)論 0 0
  • 感謝自己參加了感恩體驗(yàn)營(yíng),21天的時(shí)間氯窍,我正在慢慢改變饲常!謝謝!謝謝荞驴!謝謝不皆! 感謝同事們一起探討新課程,大家各抒己見...
    Iris若一閱讀 616評(píng)論 0 0
  • 我開始想念三三 在青天白日里 想那個(gè)孑然半生的老婦人 爬上過最高的房子也只有十二米 在鄉(xiāng)村細(xì)細(xì)的靜脈里 清掃揚(yáng)塵 ...
    Kola說閱讀 374評(píng)論 8 2