H5调用相机,裁剪,压缩照片

移动端H5调启相册或拍照 选择图片后进行裁剪  这段时间做一个公众号项目的开发,其中有一个功能涉及到微信网页调启相机或者拍照 选择图片后进行裁剪 然后转换base64 上传服务器。 思路: 1. 在本页面点击拍照或相册 调启相机或者相册 选择图片后 将图片传到裁剪页面 2. 在裁剪页面显示选择的图片 使用Cropper插件进行裁剪 3. 点击裁剪按钮 将Cropper裁剪的内容 利用canvas 将裁剪的图转换base64 4. 在... 阅读详情

最近项目中遇到拍照,预览上传的问题,苹果手机不兼容,拍照旋转90度,在网上查找出好多方法,都无效,最后用input调用相机,然后用canvas画布裁剪照片,压缩保存,代码如下。

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <meta name="apple-mobile-web-app-capable" content="yes" />
        <meta name="apple-mobile-web-app-status-bar-style" content="black" />
        <meta name="format-detection" content="telephone=no, email=no" />
        <meta name="renderer" content="webkit">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="HandheldFriendly" content="true">
        <meta name="MobileOptimized" content="640">
        <meta name="screen-orientation" content="portrait">
        <meta name="x5-orientation" content="portrait">
        <meta name="full-screen" content="yes">
        <meta name="x5-fullscreen" content="true">
        <meta name="browsermode" content="application">
        <meta name="x5-page-mode" content="app">
        <!--<base href="__ROOT__/Public/syh/shy_5/" />-->
        <meta name="msapplication-tap-highlight" content="no">
        <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
        <script src="js/exif.js"></script>
        <script src="js/jquery-2.1.4.min.js"></script>
        <title>H5拍照预览压缩保存文件</title> 
    </head>

    <body>  

                     <img id="imgss" src="img/6/4.jpg" class="ani  p6_element4" />        // 预览

                    <img src="img/6/8.png" id='uploadBtn' class="ani p6_save" />            //保存            


                   <input type="file" name="fileToUpload" id="fileToUpload" accept="image/*" capture="camera" onclick="hint()" ;/>      //调用相机
                    <input type="hidden" id="pid" value="{$pid}" />
                    <canvas id="canvas" width="374" height="544" style="display: none;"></canvas>
                    <input type="hidden" id="url" value="__URL__" />
                    <textarea id="compressValue" hidden></textarea>
                    <div id="upp">
                        <div class="spinner">
                            <div class="spinner-container container1">
                                <div class="circle1"></div>
                                <div class="circle2"></div>
                                <div class="circle3"></div>
                                <div class="circle4"></div>
                            </div>
                            <div class="spinner-container container2">
                                <div class="circle1"></div>
                                <div class="circle2"></div>
                                <div class="circle3"></div>
                                <div class="circle4"></div>
                            </div>
                            <div class="spinner-container container3">
                                <div class="circle1"></div>
                                <div class="circle2"></div>
                                <div class="circle3"></div>
                                <div class="circle4"></div>
                            </div>
                        </div>
                    </div>

     
        <script type="text/javascript">
            function hint() {
                alert("请您竖屏拍照!")
            }
        </script>
        <script>
            var post_flag = false; //设置一个对象来控制是否进入AJAX过程

            function post(preview, pid, url) {

                if(post_flag) return; //如果正在提交则直接返回,停止执行

                post_flag = true; //标记当前状态为正在提交状态

                $.ajax({

                    url: url + "/ajax",
                    type: "POST",
                    data: {
                        'imgBase64': preview,
                        'pid': pid
                    },
                    dataType: 'json',
                    beforeSend: function() {
                        $('#upp').show();
                        $('#uploadBtn').hide();
                    },
                    success: function(data) {
                        if(data=='上传成功!'){
                            post_flag = false;
                            $("#upp").hide();
                        }else{
                            post_flag = false;
                            $("#upp").hide();
                            alert(data);
                        }

                    },
                    error: function() {
                        alert('操作失败,请跟技术联系');
                    }
                });

            }

            //提交click事件
            $('#uploadBtn').click(function() {
                var preview = document.getElementById('compressValue').value;
                var pid = document.getElementById('pid').value;
                var url = document.getElementById('url').value;
                if(preview) {

                    post(preview, pid, url);
                }
            });

            function getObjectURL(file) {
                var url = null;
                if(window.createObjectURL != undefined) { // basic
                    url = window.createObjectURL(file);
                } else if(window.URL != undefined) { // mozilla(firefox)
                    url = window.URL.createObjectURL(file);
                } else if(window.webkitURL != undefined) { // webkit or chrome
                    url = window.webkitURL.createObjectURL(file);
                }
                return url;
            }

            $('#fileToUpload').change(function() {
                var Orientation = null;

                var canvas = document.getElementById('canvas');
                var dd = canvas.getContext('2d');
                var file = this.files[0];
                var imgsrc = getObjectURL(file);
                var img = new Image();
                img.src = imgsrc;

                img.onload = function() {
                 
                    if(navigator.userAgent.match(/iphone/i) || navigator.userAgent.match(/SM-/i)) {

                        EXIF.getData(file, function() {
                            var canvas = document.getElementById('canvas');
                            var dd = canvas.getContext('2d');
                            //            alert(EXIF.pretty(this));
                            //            EXIF.getAllTags(this);
                            //                    alert(EXIF.getTag(this, 'Orientation'));
                            Orientation = EXIF.getTag(this, 'Orientation');
                            
                            if(Orientation != "" && Orientation != 1) {
 
                                switch(Orientation) {
                                    case 6: //三星竖拍
                                        dd.save();
                                        dd.translate(374 / 2, 544 / 2);
                                        dd.rotate(90 * Math.PI / 180);
                                        //                        var xs=(544/374)+0.01;
                                        //                        dd.scale(xs,xs);//  照片放在相框下面,上面用overflow
                                        if(navigator.userAgent.match(/SM-/i)) {
                                            dd.scale(2.5, 1);
                                        } else {
                                            dd.scale(1.94, 1);
                                        }
                                       
                                        dd.drawImage(img, 0, 0, img.width, img.height, -187, -272, 374, 544);
                                        
                                        base64 = canvas.toDataURL('image/jpeg', 0.4);

                                        dd.restore();
                                        $("#uploadBtn").show();
                                        $('#imgss').attr('src', base64);
//                                        postbase = base64.substr(22);
                                        $('#compressValue').val(base64);

                                        break;
                                    case 8:
                                        dd.save();
                                        dd.translate(374 / 2, 544 / 2);
                                        dd.rotate(-90 * Math.PI / 180);
                                        //                        var xs=(544/374)+0.01;
                                        //                        dd.scale(xs,xs);//  照片放在相框下面,上面用overflow
                                        dd.scale(1.94, 1);

                                        dd.drawImage(img, 0, 0, img.width, img.height, -187, -272, 374, 544);
                                        base64 = canvas.toDataURL('image/jpeg', 0.4);

                                        dd.restore();
                                        $("#uploadBtn").show();
                                        $('#imgss').attr('src', base64);
//                                        postbase = base64.substr(22);
                                        $('#compressValue').val(base64);

                                        break;
                                    case 3:
                                        alert(3);
                                        dd.save();
                                        dd.translate(374 / 2, 544 / 2);
                                        dd.rotate(180 * Math.PI / 180);
                                        //                        var xs=(544/374)+0.01;
                                        //                        dd.scale(xs,xs);//  照片放在相框下面,上面用overflow
                                        dd.scale(1.94, 1);

                                        dd.drawImage(img, 0, 0, img.width, img.height, -187, -272, 374, 544);
                                        base64 = canvas.toDataURL('image/jpeg', 0.4);

                                        dd.restore();
                                        $("#uploadBtn").show();
                                        $('#imgss').attr('src', base64);
//                                        postbase = base64.substr(22);
                                        $('#compressValue').val(base64);

                                        break;
                                }

                            } else {
                                var canvas = document.getElementById('canvas');
                                var dd = canvas.getContext('2d');
                                var sx, sy, sw, sh;
                                var d_kgb = 374 / 544;
                                var s_kgb = img.width / img.height;

                                if(s_kgb > d_kgb) {
                                    sw = parseInt(img.height * d_kgb);
                                    sx = parseInt((img.width - sw) / 2);
                                    sy = 0;
                                    sh = img.height;

                                } else if(s_kgb < d_kgb) {
                                    sh = img.width / d_kgb;
                                    sy = (img.height - sh) / 2;
                                    sx = 0;
                                    sw = img.width;
                                    //                alert(sx+"|"+sy+"|"+sw+"|"+sh);
                                } else {
                                    sx = 0, sy = 0, sw = img.width, sh = img.height;
                                }
                                
                                dd.drawImage(img, sx, sy, sw, sh, 0, 0, 374, 544);
                                dd.clearRect(10,10,300,100);
                                base64 = canvas.toDataURL('image/jpeg', 0.4);
                                 
                                 $("#uploadBtn").show();
                                $('#imgss').attr('src', base64);
                            //    postbase = base64.substr(22);
                                $('#imgbase').val(base64);

                            }

                        });

                    }

                        var sx, sy, sw, sh;
                        var d_kgb = 374 / 544;
                        var s_kgb = img.width / img.height;

                        if(s_kgb > d_kgb) {
                            sw = parseInt(img.height * d_kgb);
                            sx = parseInt((img.width - sw) / 2);
                            sy = 0;
                            sh = img.height;

                        } else if(s_kgb < d_kgb) {
                            sh = img.width / d_kgb;
                            sy = (img.height - sh) / 2;
                            sx = 0;
                            sw = img.width;
                            //                alert(sx+"|"+sy+"|"+sw+"|"+sh);
                        } else {
                            sx = 0, sy = 0, sw = img.width, sh = img.height;
                        }
                        dd.drawImage(img, sx, sy, sw, sh, 0, 0, 374, 544);
//                      dd.clearRect(30,30,500,200);
                        base64 = canvas.toDataURL('image/jpeg', 0.4);
                        
               $("#uploadBtn").show();
                    $('#imgss').attr('src', base64);
                    //postbase = base64.substr(22);
                    $('#compressValue').val(base64);
                };
            });
        </script>
    </body>

</html>

【uniapp小程序】上传图片_小程序 uni,2024年最新Golang开发面经分享 来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新** 阅读详情

相关推荐

uniapp - 超详细 H5 网站图片压缩功能,图像上传前进行压缩降低大小并上传到服务器完整示例源码(附带 uview 组件库 u-upload 上传组件与该图片压缩插件 “搭配组合“ 使用教程)

uniapp图片图像压缩插件,uniappuviewupload压缩图片,uniapp如何对图片进行压缩减小体积,uniapp上传图片太慢有什么办法能压缩一下吗,uniapph5上传前压缩图片降低大小,uniapp中如何压缩图片,uniapp图像上传前如何进行降低质量缩小文件大小,uniappuviewUpload上传组件怎么在H5网页上图片压缩,uview上传组件怎么压缩降低图片大小,uniapp图像压缩示例代码,uniapp照片相片怎么进行上传前的压缩操作,uniappuview组

🏆 前端领域优质创作者 1万+

HTML5实现图片压缩上传(详解)

HTML5实现图片压缩上传,主要用到FileReader, canvas, Blob,FormData这几个api 1,fileReader用来读取文件 2,利用canvas.toDataURL('"image/jpeg",quality)中的quality参数进行图片压缩 3,将图片base64格式转化为blob对象 4,利用formData上传 首先介绍下FileReader, c...

前端361 5012

H5实现调用手机摄像头相册。完美实现图片压缩、预览、删除的功能。---Demo

H5实现调用手机摄像头相册。完美实现图片压缩、预览、删除的功能。

H5上传照片调用相册拍照(附源码)

效果图: 随便找了两张图片大家别介意哈~~~ 话不多所上源码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1...

刺心的博客 5587

【华为2021校招】笔试题【通用硬件】

时间:2020/07/15 19:00 时长:60min 题型:40单选+5多选 难度:中等 考察范围:模电、数电、SI、EMC、电源、微机原理、计算机网络、材料

Jkcia的博客 4万+

在Unity中为Sentis部署的YOLOv8模型集成NMS层并实现移动端性能优化

本文详细讲解了在Unity中利用Sentis部署YOLOv8模型时,如何通过代码动态集成NMS层以解决移动端性能瓶颈。文章核心在于避免导出时绑定NMS,转而使用Sentis原生API在运行时高效构建NMS处理流程,并分享了关键的GPU数据操作与移动端性能优化技巧,确保模型在移动设备上流畅运行。

p1q2r的博客 1094

H5 input拍照上传图片,处理图片旋转压缩并转成file文件

之前图片上传都是上传的base64码,但是这次需要存到其他系统服务器,只接收file,所以整理了一个公共方法,主要用于移动端,PC端没有试过,包含图片的旋转,压缩和转成file文件。 初始代码是循环压缩到100kb以下的,但是压缩超过3次以后,后台接到的file开始报错,偶发性,自己测试没有复现,上了生产就有问题,所以综合考虑改为100kb以下,只旋转,大于100kb只压缩一次了,不需要循环压缩的...

ApologizeError的博客 1723

关于华为高斯数据库出现Invalid or unsupported by client SCRAM mechanisms定位解决的过程

最近公司有个新项目使用的是高斯数据库,因为我们的项目是直接从别的项目组拿来的,配置都是已经配好的,但是在放到正式环境上之后出现报错。起初我们以为是测试和正式的版本不一致,但是结果是版本一致的。最后这个问题搞了我们几个小时,都没法解决。

Curtisjia的博客 3185

H5-移动端相机拍照(读取本地相册)(PC端读取本地相册)、压缩、预览、裁剪、上传功能开发汇总

最新更新时间:2019年04月21日17:56:04 《猛戳-查看我的博客地图-总有你意想不到的惊喜》 本文内容:开发过程中遇到的相关问题总结 H5端相机拍照原理 设置input标签的属性如下,capture为空会让用户选择本地文件或者拍照,onChange事件直接将图片文件转换为base64 <html> <body> //react组件 <input ...

万少博-FE 1559

AutoGLM-Phone 实现“豆包 AI 手机”的自动化操作手机的实战方案教程 让普通手机秒变ai手机

是一个基于视觉语言模型(VLM)的 AI 手机智能助理框架。❌ 不依赖固定坐标❌ 不需要提前录制脚本✅ 能“看懂”手机屏幕✅ 能理解自然语言指令✅ 能自动规划操作路径并执行让 AI 像人一样看屏幕、想步骤、点手机。从工程角度看,AutoGLM-Phone 已经具备“AI 手机助理”的完整雏形能看能理解能规划能执行能跨 App所谓的「豆包 AI 手机」,本质上就是这类能力的产品化封装。而现在,这套能力已经可以被普通开发者亲手跑起来、改起来、甚至接入自己的业务场景。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 595

基于YOLOv12的牙齿识别与计数系统:从理论到完整实现

本文详细介绍了一种基于YOLOv12深度学习模型的牙齿识别与计数系统。该系统能够在口腔X光片中准确识别和计数牙齿,并提供了用户友好的UI界面。文章涵盖了数据预处理、模型训练、性能优化以及完整系统实现的各个环节,并提供了可复现的代码和数据集参考。整个系统包含三个主要模块:数据预处理模块YOLOv12模型训练模块UI界面展示模块。

YOLO 178

H5 拍照图片旋转、压缩和上传

原文地址:github.com/whinc/blog/… 最近接到一个“发表评论”的需求:用户输入评论并且可以拍照或从相册选择图片上传,即支持图文评论。需要同时在 H5 和小程序两端实现,该需求处理图片的地方较多,本文对 H5 端的图片处理实践做一个小结。项目代码基于 Vue 框架,为了避免受框架影响,我将代码全部改为原生 API 的实现方式进行说明,同时项目代码中有很多其他额外的细...

weixin_30872867的博客 240

第一章 DRM 子系统概述:1.2 专栏定位与技术覆盖范围

本专栏系统解析Linux内核DRM图形子系统的核心技术,涵盖GEM对象管理、TTM内存机制、DRM-Fence同步等核心模块,深入剖析DMA-BUF共享、DMA_Resv资源管理等关键技术。通过解读内核源码与用户态接口(libdrm),结合进程管理、匿名inode等底层机制,构建完整的DRM知识体系。专栏兼顾深度与易懂性,辅以实际应用场景分析,既适合图形驱动开发新手入门,也可满足资深工程师进阶需求,帮助读者掌握从内核实现到应用开发的全栈知识。

图形/计算GPU的驱动与虚拟化技术分享园地 3029

uniapp选择图片裁剪,上传到服务器

uniapp选择图片裁剪,上传到服务器

abs_botton的博客 3627

一文读懂AI协同办公领域发展和趋势

协同办公,又称OA,是指企业内部或外部各类人员之间利用信息技术来进行协作工作的一种形式。这种协作工作既可以由直接员工进行,也可以来自外部的咨询机构、合作伙伴或联营企业。协同办公的优势在于可以对资源进行有效管理和配置,各部门之间可以建立良好的协作关系,跨部门更好地实现资源共享。

女王の专属领地 2362

Camunda 7.x 系列【67】实战篇之撤销流程

撤销流程 即撤销当前已发起的流程实例。这是一个常见的需求,Camunda本身不提供直接的方法来撤销正在执行的流程,需要自定义处理逻辑。

记录知识、锤炼自我 1378

微信小程序 扫描 试纸类 图片旋转 照片 h5

1.微信小程序 提供了 扫描的—二维码 --一维码 —特殊码 之类 2.https://mp.weixin.qq.com/wxopen/pluginbasicprofile?action=intro&appid=wx479777803030f27b 孕妇插件识别 拍照 进行裁剪 通过图片识别 获取数据 没有其他办法 ...

web修理工 949

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

uni-app图片选择器终极指南:相册与相机集成完整教程

uni-app图片选择器是跨平台开发中不可或缺的功能,让开发者轻松实现相册选择和相机拍摄的完美集成。作为uni-app框架的核心API之一,chooseImage方法提供了简单易用的接口,帮助开发者在各种小程序和H5平台上实现图片选择功能。本文将为你详细介绍uni-app图片选择器的完整使用方法、配置选项和最佳实践。 ## 🎯 什么是uni-app图片选择器? uni-app图片选择器是基于

gitblog_01037的博客 558

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

H5 和小程序拍照图片旋转、压缩和上传

原文地址:github.com/whinc/blog/… 最近接到一个“发表评论”的需求:用户输入评论并且可以拍照或从相册选择图片上传,即支持图文评论。需要同时在 H5 和小程序两端实现,该需求处理图片的地方较多,本文对 H5 端的图片处理实践做一个小结。项目代码基于 Vue 框架,为了避免受框架影响,我将代码全部改为原生 API 的实现方式进行说明,同时项目代码中有很多其他额外的细节和功能(...

weixin_33672109的博客 1122

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

前端调用摄像头拍照生成图片加裁切

【代码】前端调用摄像头拍照生成图片加裁切。

qq_70047543的博客 593

【绝对干货】仿微信QQ设置图形头像裁剪,让你的App从此炫起来~

最近在做毕业设计,想有一个功能和QQ一样可以裁剪头像并设置圆形头像,额,这是设计狮的一种潮流。 而纵观现在主流的APP,只要有用户系统这个功能,这个需求一般都是在(bu)劫(de)难(bu)逃(xue)! 图片裁剪实现方式有两种,一种是利用系统自带的裁剪工具,一种是使用开源工具Cropper。本节就为大家带来如何使用系统自带的裁剪工具进行图片裁剪~ 还是先来个简单的运行图。(Ps,本人还没结...

weixin_33997389的博客 473

mui ajax 传递base64,HTML5 MUI 手机预览图片,裁剪上传base64,保存数据库

app和网站页面都可以使用需要的文件:这些都需要,这些文件在下文的参考网址可以下载 页面头部引用:页面底部引用(但是在body里):布局://触发选择图片事件//默认图片以及选择裁剪后展示的效果确认提交//保存数据事件//等待动画请稍等...//关闭裁剪窗口//左旋转90度//右旋转90度//确定JS部分://post内容function postAvatar() {var petimage = ...

weixin_39633455的博客 545

autocrop支持的30+图片格式全解析:从JPEG到WebP的人脸裁剪指南

**autocrop** 是一款自动检测人脸并完成人脸裁剪的开源工具,它内置 OpenCV 的 YuNet 神经网络人脸检测模型,无需手动框选,就能把照片中最大的那张脸自动居中裁剪出来。更让新手惊喜的是,这款人脸裁剪工具对图片格式的兼容性远超想象:根据源码 `autocrop/constants.py` 中的格式映射表,autocrop 支持 **40+ 种图片格式、70+ 种文件扩展名**,从经

gitblog_01017的博客 519

【uniapp小程序】上传图片

本篇文章我们研究一下,在移动端开发过程中经常使用到的图片上传功能。在大多数小程序或者APP中都会遇到一些实名认证或者头像上传的功能。uniapp官方也提供了相应的API供我们使用。

qq_49002903的博客 4万+

uniapp图片上传预览uni.chooseImage、uni.previewImage

current 为当前显示图片的链接/索引值,不填或填写的值无效则为 urls 的第一张。App端如需要更丰富的相机拍照API(如直接调用前置摄像头),参考。1.9.5+ 支持传图片在 urls 中的索引值。,其中 B1 与 B2 的图片链接是一样的。微信小程序从基础库 2.21.0 开始,//可以指定是原图还是压缩图,默认二者都有。从本地相册选择图片或使用相机拍照。//是否可以循环预览 无效。// 图片指示器样式 无效。

蓝鲸鱼计算机软件开发工作室 4789
上一篇: 实现照片拍照保存插件
下一篇: 移动端页面滑动轮播
wait9166
博客等级 码龄10年 0粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值