移动端网页上传图片功能简析(主要应用场景为微信公众号)

功能简介:

在微信公众号中,要开发一个照片上传功能,可以拍照,可以选择相册图片,可以预览。

开发思路:

用户点击上传按钮--》拍照或者选择图片--》调用上传接口--》后来程序处理(生成缩略图,旋转图片)上传至fastdfs服务器--》返回上传图片的缩略图地址和原图片地址显示在已上传图片区域。

用户对于已上传的图片可以删除.如删除,对应fastdfs中的原始图片和缩率图一并删除。

参考文章:

http://blog.csdn.net/linlzk/article/details/48652635

遇到的问题:

1,上传图片

采用表单方式上传

		               <form class="uploadForm" enctype="multipart/form-data">
		            	<input class="health-assay-info-id" name="healthAssayInfoId" type="hidden"><!--此处处理业务问题的id,上传图片后,对应的相关业务数据的id-->
		                <label class="btn-file">
		                	<input type="file" accept="image/*"  name="pics" capture="camera" onchange="form_pics.addImg(this);">
		                    <img src="../images/upimg.png" >
		                </label>
		               </form>

 代码中的红色部分很重要。如果没有此限制,部分安卓机型上无法选择照相机。

2,ios手机拍照,横拍和竖拍旋转问题

使用引入exif.js。获取当前 照相机拍摄的照片的旋转度数。

ps:此处下载 http://code.ciaoca.com/javascript/exif-js/ 

EXIF.getData(document.getElementById(‘imgElement‘), function(){
  var Orientation  = EXIF.getTag(this, ‘Orientation‘);  //ajaxSubmit上传处理代码,把 Orientation作为参数,传到后台。
});

 后台处理:

            if (picOrientation != null && picOrientation > 1) {
                int degree = 0;
                switch (picOrientation) {
                    case 6:
                        degree = 90;
                        break;
                    case 8:
                        degree = 270;
                        break;
                    case 3:
                        degree = 180;
                        break;
                    default:
                        degree = 0;
                        break;
                }
            }

 旋转图片代码(旋转要重新计算图片的宽高。http://www.oschina.net/code/snippet_818200_45972)

    public static BufferedImage rotateImage(final BufferedImage bufferedImage, final int angle) {

        int width = bufferedImage.getWidth();
        int height = bufferedImage.getHeight();
        int new_w = 0, new_h = 0;
        int new_radian = angle;
        if (angle <= 90) {
            new_w = (int)(width * Math.cos(Math.toRadians(new_radian)) + height * Math.sin(Math.toRadians(new_radian)));
            new_h = (int)(height * Math.cos(Math.toRadians(new_radian)) + width * Math.sin(Math.toRadians(new_radian)));
        }
        else if (angle <= 180) {
            new_radian = angle - 90;
            new_w = (int)(height * Math.cos(Math.toRadians(new_radian)) + width * Math.sin(Math.toRadians(new_radian)));
            new_h = (int)(width * Math.cos(Math.toRadians(new_radian)) + height * Math.sin(Math.toRadians(new_radian)));
        }
        else if (angle <= 270) {
            new_radian = angle - 180;
            new_w = (int)(width * Math.cos(Math.toRadians(new_radian)) + height * Math.sin(Math.toRadians(new_radian)));
            new_h = (int)(height * Math.cos(Math.toRadians(new_radian)) + width * Math.sin(Math.toRadians(new_radian)));
        }
        else {
            new_radian = angle - 270;
            new_w = (int)(height * Math.cos(Math.toRadians(new_radian)) + width * Math.sin(Math.toRadians(new_radian)));
            new_h = (int)(width * Math.cos(Math.toRadians(new_radian)) + height * Math.sin(Math.toRadians(new_radian)));
        }
        BufferedImage toStore = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = toStore.createGraphics();
        AffineTransform affineTransform = new AffineTransform();
        affineTransform.rotate(Math.toRadians(angle), width / 2, height / 2);
        if (angle != 180) {
            AffineTransform translationTransform = findTranslation(affineTransform, bufferedImage, angle);
            affineTransform.preConcatenate(translationTransform);
        }
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, new_w, new_h);
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g.drawRenderedImage(bufferedImage, affineTransform);
        g.dispose();
        return toStore;
    }

  3.使用

EXIF.getData获取获取拍摄方向时,感觉此方式是异步的如果这样写
var Orientation = null;
EXIF.getData(document.getElementById(‘imgElement‘), function(){
    Orientation = EXIF.getTag(this, ‘Orientation‘);

});

//ajaxSubmit上传处理代码,把 Orientation作为参数,传到后台。

 就会先去执行上传,然后才执行

EXIF.getData的回调函数获取到Orientation 。还没有想到有什么好的解决方案,索性把上传代码逻辑写到了EXIF.getData的回调函数里面。4,展示大图展示大图时需要计算手机屏幕的分辨率。我的策略如下
         var windowW = $(window).width();
         var windowH = $(window).height();
         var realWidth = this.width;
         var realHeight = this.height;
         var imgWidth, imgHeight;
         var scale = 0.8;

         if(realHeight>windowH*scale && realWidth>windowW) {
        	 imgWidth = windowW;
        	 imgHeight = imgWidth/realWidth*realHeight;
         } else if(realHeight>windowH*scale){
        	 imgHeight = windowH*scale;
             imgWidth = imgHeight/realHeight*realWidth;
         } else if(realWidth>windowW){
        	 imgWidth = windowW;
        	 imgHeight = imgWidth/realWidth*realHeight;
         } else {
             imgWidth = realWidth;
             imgHeight = realHeight;
         }
         $("#bigimg").css("width",imgWidth);

  如果实际宽度>屏幕宽度,保证宽是沾满屏幕,调整高度

  

时间: 2024-10-05 05:12:59

移动端网页上传图片功能简析(主要应用场景为微信公众号)的相关文章

微信公众号开发简单的网页授权登陆获取用户基本信息

由于业务需要,近期在做微信公众号开发,其中一个模块是微信用户点击个人中心访问可以得到次微信用户的头像昵称国家省份等基本信息. 但由于业务需求,这块功能暂时用不上了,但这功能的实现毕竟是自己花费几天时间搞出来的,觉得以后会用的上,暂且记录一下实现过程. 首先:获取用户信息的过程属于微信网页授权登陆,再做这一块之前请先阅读微信开发文档以熟悉基本的开发过程: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 微信开发文档

[5] 微信公众号开发 - 微信支付功能开发(网页JSAPI调用)

1.微信支付的流程 如下三张手机截图,我们在微信网页端看到的支付,表面上看到的是 "点击支付按钮 - 弹出支付框 - 支付成功后出现提示页面",实际上的核心处理过程是: 点击支付按钮时,执行一个Ajax到后台 后台通过前台的部分信息(如商品名额,金额等),将其组装成符合微信要求格式的xml,然后调用微信的"统一下单接口" 调用成功后微信会返回一个组装好的xml,我们提取之中的消息(预支付id也在其中)以JSON形式返回给前台 前台将该JSON传参给微信内置JS的方法

微信公众号实现手机授权网页登录功能

前提条件 手机微信已经绑定过该公众号,已经存在该用户openId的映射关系 场景: 公众号绑定了一个接单系统,想要在pc网页中显示操作,订单的获取是需要权限的(绑定过该公众号才能使用和显示) 实现: 1.需要两个页面,一个在手机中显示授权的页面,一个是网页中显示二维码页面(扫描二维码后,手机端显示授权的页面) 2.二维码页面,调用后端接口,传入手机授权页面的url为参数,返回二维码图片(后端根据微信配置生成,包含传入的url信息和二维码的唯一标识,code)和这个二维码的唯一标识,后端提供第二个

微信公众号JSAPI网页支付

一.使用场景以及说明 使用场景:商户已有H5商城网站,用户通过消息或扫描二维码在微信内打开网页时,可以调用微信支付完成下单购买的流程. 说明:用户打开图文消息戒者扫描二维码,在微信内置浏览器打开网页进行的支付.商户网页前端通过使用微信提供的 JS API,调用微信支付模块.这种方式,适合需要在商户网页进行选购下单的购买流程. 二.准备工作 公共号支付需要提前在微信公共平台进行业务配置,包括设置支付授权目录.设置JS接口安全域名以及设置授权回调页面域名. 1.进行微信公众支付之前,我们需要申请个公

微信公众号 几种移动端UI框架介绍

微信公众号开发,主要是移动端网页的页面开发,在这里推荐3个移动端UI框架:WeUI.SUI和Mint UI. 1. WeUI 1.1 WeUI WeUI是微信官方设计团队为微信 Web 开发量身设计,可以令用户在HTML5应用中的使用感知更加统一. 组件包含button.cell.dialog. progress, toast.article.icon等等. 资源 官方Demo:https://weui.io/ Github:https://Github.com/weui/weui (★1340

微信公众号开发纪要(4)-调用微信扫一扫功能

在微信公众号页面中调用微信扫一扫功能,就是调用微信JS-SDK.让JS-SDK完成调用摄像头扫描,然后我们将扫描结果进行业务操作.微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包.通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微信分享.扫一扫.卡券.支付等微信特有的能力,为微信用户提供更优质的网页体验.如何调用微信JS-SDK,在微信公众平台技术文档中的微信网页开发-->微信JS-SDK说明文档中有详细

微信JS-SDK]微信公众号JS开发之卡券领取功能详解

js sdk: http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD.952-.E6.89.80.E6.9C.89JS.E6.8E.A5.E5.8F.A3.E5.88.97.E8.A1.A8 微信团队在2015年初改革了微信JS的API,本文主要详细说明其中用到的卡券领取功能. 微信卡券需要认证过的公众号才能申请开通,而且创建的卡券也是要审核才能投放的.微信的卡券对于用户体验上来说

微信公众号网页授权登录获取用户基本信息

发布时间:2018-10-24 技术:spring springboot,微信公众号 概述 微信公众号网页授权登录后微信获取用户基本信息,部署即可运行完整demo 详细 代码下载:http://www.demodashi.com/demo/14290.html 一.前言 (1)适合人群 1,JAVA服务端开发人员 2,初级人员开发人员 3,了解spring springboot + maven 3,了解公众号开发 (2)你需要准备什么? 1,积极主动学习 2,微信公众号开发基本流程 3,java

教你在微信公众号中加入订单、预约、登记、投诉和反馈等功能

教你在微信公众号中加入订单.预约.登记.投诉和反馈等功能 现在很多企业和组织都有了自己的公众号,但大多数只用来发消息,消息多了一来用户很反感,二来也不能很好的和用户互动.今天就跟大家分享一下本人如何利用表单大师在其中加入订单.预约.登记.投诉.反馈等功能. 表单大师是一款在线表单应用程序,通过简单拖拽就可快速地创建各种Web表单,如在线订单.满意度调查和各种报名表.反馈表.申请表.登记表等.表单大师还会为每个表单提供一个网址(URL),只需要将此URL设置为微信自定义菜单的URL即可将二者无缝连