移动端h5图片裁剪、上传:解决ios竖屏拍照裁剪后图片旋转90度问题

最近公司要做一个h5,其中包含了图片裁剪、上传等功能,当时也没太在意就用了cropper插件,因为之前在PC端用过也熟悉,大概看了一下文档,说是支持移动端,就毫不犹豫的选择了它,从此踏上了填坑之路......

第一个问题:ios竖屏拍照裁剪图片后上传到服务器的图片是顺时针旋转90度

原因:由于目前的手机拍照基本都在2M以上,而ios中只要超过2M图片就会自动旋转。拍照后直接取出来的UIimage(用UIImagePickerControllerOriginalImage取出),它本身的imageOrientation属性是3,即UIImageOrientationRight。如果这个图片直接使用则没事,但是如果对它进行裁剪、缩放等操作后,它的这个imageOrientation属性会变成0。此时这张图片用在别的地方就会发生旋转。imageOrientation是只读的,不能直接修改其值。

解决方法(js): 当拍照后,获取input中的图片数据,利用exif.js(http://code.ciaoca.com/JavaScript/exif-js/)获取到Orientation属性,此属性有四个值
1 表示旋转0度,也就是没有旋转。
6 表示顺时针旋转90度
8 表示逆时针旋转90度
3 旋转180度
我们要做的就是在拍照后,从input中获取到图片,然后得到它的Orientation值,在裁剪后给它逆着旋转90度,然后上传就好了,代码在这就不写了。

第二个问题:ios竖屏拍照后裁剪图片后所得的图片与裁剪区域不相符。

暂时没找到原因,由于之前直接在百度上搜索cropper,然后下载,也没有看是哪个版本,在百度中搜索也完全搜不到相关的问题,最后我在github上cropper项目中issue中找到答案,应该是cropper之前的bug,新版本已经修复,我就试着用了新版本,完美解决,而且新版本中已经解决了第一个问题。

总结:

这一路下来完全是自己坑了自己,如果一开始直接在GitHub上下载最新版就不会出现这些问题,以后吸取教训。

最后贴上图片裁剪、上传完整代码:

<!--html-->
<!--文件上传-->
<input type="file" class="js-uploadfile">
<!--确定裁剪-->
<input type="button" class="js-ok" value="裁剪">
<!--cropper基本结构-->
<div class="container js-container" style="width: 100%;height: auto">
    <img class="js-image" src="" style="width: 100%;height: auto">
</div>
<!--裁剪结果显示-->
<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('发生错误');
}

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容