java 手机 上传图片_在手机端使用拍照功能上传图片的功能的解决文案

主要依赖了一个compress.js的文件,文件内容如下:

```/*

* Tencent is pleased to support the open source community by making WeUI.js available.

*

* Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.

*

* Licensed under the MIT License (the "License"); you may not use this file except in compliance

* with the License. You may obtain a copy of the License at

*

*       http://opensource.org/licenses/MIT

*

* Unless required by applicable law or agreed to in writing, software distributed under the License is

* distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,

* either express or implied. See the License for the specific language governing permissions and

* limitations under the License.

*//**

* 检查图片是否有被压扁,如果有,返回比率

* ref to http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios

*/function detectVerticalSquash(img) {

// 拍照在IOS7或以下的机型会出现照片被压扁的bug

var data;

var ih = img.naturalHeight;

var canvas = document.createElement('canvas');

canvas.width = 1;

canvas.height = ih;

var ctx = canvas.getContext('2d');

ctx.drawImage(img, 0, 0);

try {

data = ctx.getImageData(0, 0, 1, ih).data;

} catch (err) {

console.log('Cannot check verticalSquash: CORS?');

return 1;

}

var sy = 0;

var ey = ih;

var py = ih;

while (py > sy) {

var alpha = data[(py - 1) * 4 + 3];

if (alpha === 0) {

ey = py;

} else {

sy = py;

}

py = (ey + sy) >> 1; // py = parseInt((ey + sy) / 2)

}

var ratio = (py / ih);

return (ratio === 0) ? 1 : ratio;}/**

* dataURI to blob, ref to https://gist.github.com/fupslot/5015897

* @param dataURI

*/function dataURItoBuffer(dataURI){

var byteString = atob(dataURI.split(',')[1]);

var buffer = new ArrayBuffer(byteString.length);

var view = new Uint8Array(buffer);

for (var i = 0; i 

view[i] = byteString.charCodeAt(i);

}

return buffer;}function dataURItoBlob(dataURI) {

var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];

var buffer = dataURItoBuffer(dataURI);

return new Blob([buffer], {type: mimeString});}/**

* 获取图片的orientation

* ref to http://stackoverflow.com/questions/7584794/accessing-jpeg-exif-rotation-data-in-javascript-on-the-client-side

*/function getOrientation(buffer){

var view = new DataView(buffer);

if (view.getUint16(0, false) != 0xFFD8) return -2;

var length = view.byteLength, offset = 2;

while (offset 

var marker = view.getUint16(offset, false);

offset += 2;

if (marker == 0xFFE1) {

if (view.getUint32(offset += 2, false) != 0x45786966) return -1;

var little = view.getUint16(offset += 6, false) == 0x4949;

offset += view.getUint32(offset + 4, little);

var tags = view.getUint16(offset, little);

offset += 2;

for (var i = 0; i 

if (view.getUint16(offset + (i * 12), little) == 0x0112)

return view.getUint16(offset + (i * 12) + 8, little);

}

else if ((marker & 0xFF00) != 0xFF00) break;

else offset += view.getUint16(offset, false);

}

return -1;}/**

* 修正拍照时图片的方向

* ref to http://stackoverflow.com/questions/19463126/how-to-draw-photo-with-correct-orientation-in-canvas-after-capture-photo-by-usin

*/function orientationHelper(canvas, ctx, orientation) {

const w = canvas.width, h = canvas.height;

if(orientation > 4){

canvas.width = h;

canvas.height = w;

}

switch (orientation) {

case 2:

ctx.translate(w, 0);

ctx.scale(-1, 1);

break;

case 3:

ctx.translate(w, h);

ctx.rotate(Math.PI);

break;

case 4:

ctx.translate(0, h);

ctx.scale(1, -1);

break;

case 5:

ctx.rotate(0.5 * Math.PI);

ctx.scale(1, -1);

break;

case 6:

ctx.rotate(0.5 * Math.PI);

ctx.translate(0, -h);

break;

case 7:

ctx.rotate(0.5 * Math.PI);

ctx.translate(w, -h);

ctx.scale(-1, 1);

break;

case 8:

ctx.rotate(-0.5 * Math.PI);

ctx.translate(-w, 0);

break;

}}/**

* 压缩图片

*/function compress(file, options, callback) {

const reader = new FileReader();

reader.onload = function (evt) {

if(options.compress === false){

// 不启用压缩 & base64上传 的分支,不做任何处理,直接返回文件的base64编码

file.base64 = evt.target.result;

callback(file);

return;

}

// 启用压缩的分支

const img = new Image();

img.onload = function () {

const ratio = detectVerticalSquash(img);

const orientation = getOrientation(dataURItoBuffer(img.src));

const canvas = document.createElement('canvas');

const ctx = canvas.getContext('2d');

const maxW = options.compress.width;

const maxH = options.compress.height;

let w = img.width;

let h = img.height;

let dataURL;

if(w  maxH){

w = parseInt(maxH * img.width / img.height);

h = maxH;

}else if(w >= h && w > maxW){

h = parseInt(maxW * img.height / img.width);

w = maxW;

}

canvas.width = w;

canvas.height = h;

if(orientation > 0){

orientationHelper(canvas, ctx, orientation);

}

ctx.drawImage(img, 0, 0, w, h / ratio);

if(/image\/jpeg/.test(file.type) || /image\/jpg/.test(file.type)){

dataURL = canvas.toDataURL('image/jpeg', options.compress.quality);

}else{

dataURL =  canvas.toDataURL(file.type);

}

if(options.type == 'file'){

if(/;base64,null/.test(dataURL) || /;base64,$/.test(dataURL)){

// 压缩出错,以文件方式上传的,采用原文件上传

console.warn('Compress fail, dataURL is ' + dataURL + '. Next will use origin file to upload.');

callback(file);

}else{

let blob = dataURItoBlob(dataURL);

blob.id = file.id;

blob.name = file.name;

blob.lastModified = file.lastModified;

blob.lastModifiedDate = file.lastModifiedDate;

callback(blob);

}

}else{

if(/;base64,null/.test(dataURL) || /;base64,$/.test(dataURL)){

// 压缩失败,以base64上传的,直接报错不上传

options.onError(file, new Error('Compress fail, dataURL is ' + dataURL + '.'));

callback();

}else{

file.base64 = dataURL;

callback(file);

}

}

};

img.src = evt.target.result;

};

reader.readAsDataURL(file);}export default {

compress};

```

文件中有多种bug处理,如,拍照在IOS7或以下的机型会出现照片被压扁的bug 、修正拍照时图片的方向、压缩图片等问题。

具体使用也大概说明一下,下例子使用用的是vue-cli

1, 引入 js   注在静态文件目录下,es6引入,,注意,导出的是对象,,且用的是default导出import compress from '@/assets/js/compress.js'

2, 下面是个人的使用方式,

```

```

说到这儿,懂些vue的大概就知道了,上面是一个当成组件的封装,还可以更完善,谢谢点赞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

砸4亿美元,GE豪赌的全球最大风力发电机到底多大?

全世界只有3.14 % 的人关注了青少年数学之旅叶片长达107米,转子直径为220米,轮毂高度为135米,叶尖最大高度为260米,几乎是纽约自由女神像从地面到火炬尖端高度的三倍。这就是巨头GE豪赌的全球最大风力发电机:Haliade-X…

会计部分关键术语1

accounting equation 会计等式资产等于负债加所有者权益之和。articulation 勾稽关系存在于以相同的基础性交易为基础编制的财务报表之间的密切关系。assets 资产一个实体所拥有的经济资源。balance sheet 资产负债表通过汇总一个企业在某一时点的资产、负债和所有者权益反映企…

皮肤

又换皮肤了,各位感觉怎么样? 转载于:https://www.cnblogs.com/kay/archive/2008/03/11/1100171.html

VisualStudio配置中文提示

开篇语IntelliSense 是一种代码完成辅助工具,可以在不同的集成开发环境 (IDE) 中使用,例如 Visual Studio。默认情况下,在开发 .NET 项目时,SDK 仅包含英语版本的 IntelliSense 文件。虽然推荐使用英文,可以熟悉和学习…

丢失日志文件的风险与对策

实验背景:在备份与恢复数据库时,偶尔使用分离/附加的方法。如果在附加时丢失了或者删除了日志文件(LDF),可能会有哪些风险呢?下面通过实验来验证。一、搭建环境1. 创建数据库CREATE DATABASE [db01] ON PR…

java runtime 返回值_Java Runtime.exec()注意事项 | 学步园

转载自:http://blog.csdn.net/flying881114/archive/2011/03/23/6272472.aspx0. Runtime.exec()用来执行外部程序或命令1. Runtime.exec() 有四种调用方法* public Process exec(String command);* public Process exec(String [] cmdArray);* public Process exec(…

SQL中CONVERT转化函数的用法[个人推荐]

转载:http://piaoye.cnblogs.com/archive/2005/09/09/233363.htmlCONVERT的使用方法:格式:CONVERT(data_type,expression[,style]) 说明:此样式一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarchar,char,varchar)相互转换的时候才用到. 例子:SELECT CONVERT(va…

A和G cup的差距究竟有多大?| 今日趣图

全世界只有3.14 % 的人关注了青少年数学之旅太阳其实一直在狂奔太阳带着地球等行星以250km/s的速度在绕着银河系公转每转一圈需要2.5亿年图源见水印A罩杯和G罩杯的差距有多大錶情包运动鞋后面的这个东西原来是用来晒鞋子的抖音然一往一捆蛏子上撒盐会发生什么?残酷的…

计算机软件资格考试网站

计算机软件资格考试网站 软考在线http://www.netandnet.net/ 是一个专为准备参加软考人员服务的计算机专业水平考试网站,内容括最新软考新闻,软考文章,软考下载,软考书店,软考论坛等. 系统分析之窗http://www.sawin.com.cn/ Sawin作为系统分析、软件工程的技术推广…

五个 .NET 性能小贴士

原文:bit.ly/3wSpO4o作者:Nikita Starichenko翻译:精致码农大家好!今天我想和大家分享几个 .NET 的性能小贴士与基准测试。我的系统环境:BenchmarkDotNetv0.13.0, OSWindows 10.0.19042.985Intel Core i7-9750H CPU 2.…

java程序弊端_面向对象编程的弊端是什么?

信仰万物皆对象,习惯性Thinking in OOP的话,有可能会限制住自己解决实际问题的思路。曾经面试过某java候选人,我出了道其实很简单的算法题。结果候选人上来就去定义对象、属性、方法、接口等等,企图去搭一个面向对象的『框架』来解…

Javascript函数调用的四种模式

Javascript一共有四种调用模式:方法调用模式、函数调用模式、构造器调用模式以及apply调用模式。调用模式不同,对应的隐藏参数this值也会不同。 函数作为对象的属性时,称为方法。此时函数(即方法)中的this对应是该对象…

【推荐】BREW中 - 显示和图像

a. BREW 支持哪些图像格式? 适用版本: 1.0, 1.1, 2.0 BREW 支持颜色深度达到运行设备上提供的值的任何 BMP 文件。 BREW 目前尚不支持 GIF 和 JPEG 图像。 有些设备可以支持 GIF 和 JPEG 图像,请参阅设备数据表来查看 OEM 是否提供了支持以上…

我背着女朋友,用 Python 偷偷抓取了她的行踪

全世界只有3.14 %的人关注了青少年数学之旅1目 标 场 景有时候女朋友一个人在外面玩耍,问她在哪个地方,就是不告诉我。但是,你又很想知道女朋友的「位置」,这该如何是好?其实你可以这样套路女朋友,假装自己…

ASP.NET Core 中的规约模式(Specification Pattern )——增强泛型仓储模式

原文链接:https://codewithmukesh.com/blog/specification-pattern-in-aspnet-core/在本文中,我们将讨论在 ASP.NET Core 应用程序中实现规约模式以及它如何增强现有的泛型仓储模式。我们将从头开始构建具有泛型仓储模式、Entity Framework Core的 ASP.N…

面向过程的ado建造者模式

{*******************************************************}{ }{ ADO数据工厂 }{ }{ 版权所有 (C) 2008 咏…

Javascript:this用法

#Javascript:this用法整理pingan 于 星期三, 18/12/2013 - 22:32 提交 常用Javascript的人都知道,[this这个关键字在一个函式内究竟指向谁]的这个问题很令人头大,本人在这裡整理了一下Javascript中this的指向的五种不同…

动画演示男性结扎手术 | 今日趣图

全世界只有3.14 % 的人关注了青少年数学之旅流鼻涕了怎么办?医学教育徐琦招聘程序员啦知识萌死大丧失;图熊本科技把下列句子补充完整图三好学生李宇幼年的大象喝水并不会使用鼻子而是趴在水里直接用嘴大喝一顿它们9个月之后才会懂得用鼻子喝水科普斯基请…

MYSQL 只能回环口链接_loopback回环口详解

在配置OSPF路由协议的时候配置回环(loopback)接口是很重要的1件事.Cisco建议你配置OSPF的时候顺便配置回环接口.所谓回环接口,是逻辑接口而非物理接口,即不是你触摸的到的router上的真正的接口.作用是作为诊断OSPF而用.如果router的某一个接口由于故障down掉而不可用了,此时你怎…

AspNetCoreMassTransit Courier实现分布式事务

在之前的一篇博文中,CAP框架可以方便我们实现非实时、异步场景下的最终一致性,而有些用例总是无法避免的需要在实时、同步场景下进行,可以借助Saga事务来解决这一困扰。在一些博文和仓库中也搜寻到了.Net下实现Saga模式的解决方案MassTransit…