php canvas 前端JS压缩,获取图片二进制流数据并上传

<?php
if(isset($_GET['upload']) && $_GET['upload'] == 'img'){//二进制数据流$data = file_get_contents ( 'php://input' );    // 不需要php.ini设置,内存压力小if(empty($data)){$data = gzuncompress ( $GLOBALS ['HTTP_RAW_POST_DATA'] );    // 需要php.ini设置
    }if(imagecreatefromstring($data) == false){exit('图片已损坏');}$filename=time().'.png';$ret = file_put_contents($filename, $data, true);exit('http://'.$_SERVER['HTTP_HOST'].'/'.$filename);
}
?>
<!DOCTYPE html>
<html>
<head>
</head><body><div id="main"><h1>使用canvas在前端压缩图片实例页面</h1><div id="body"><div id="effect" class="part"><h3>效果(400x400限制):</h3><div class="show"><div class="demo"><p><input id="file" type="file" accept="image/gif, image/png, image/jpg, image/jpeg"></p><p id="log"></p></div></div></div></div>
</div><script>// 写log方法,演示辅助,与主逻辑无关var log = function (info) {document.getElementById('log').innerHTML += (info + '<br>');};var eleFile = document.querySelector('#file');if (window.FormData) {// 压缩图片需要的一些元素和对象var reader = new FileReader(), img = new Image();// 选择的文件对象var file = null;// 缩放图片需要的canvasvar canvas = document.createElement('canvas');var context = canvas.getContext('2d');// base64地址图片加载完毕后img.onload = function () {// 图片原始尺寸var originWidth = this.width;var originHeight = this.height;log('图片原尺寸是:' + [originWidth, originHeight].join('x'));// 计算出目标压缩尺寸var maxWidth = 400, maxHeight = 400;// 目标尺寸var targetWidth = originWidth, targetHeight = originHeight;if (originWidth > maxWidth || originHeight > maxHeight) {// 图片尺寸超过400x400的限制if (originWidth / originHeight > maxWidth / maxHeight) {// 更宽,按照宽度限定尺寸targetWidth = maxWidth;targetHeight = Math.round(maxWidth * (originHeight / originWidth));} else {targetHeight = maxHeight;targetWidth = Math.round(maxHeight * (originWidth / originHeight));}log('超过400x400的限制,图片大小限制为' + [targetWidth, targetHeight].join('x'));} else {log('图片尺寸较小,不压缩');}canvas.width = targetWidth;canvas.height = targetHeight;// 清除画布context.clearRect(0, 0, targetWidth, targetHeight);// 图片压缩context.drawImage(img, 0, 0, targetWidth, targetHeight);log('图片blob二进制形式ajax上传,当前进度<span id="percent"></span>');// 转为blob并上传canvas.toBlob(function (blob) {// 图片ajax上传var xhr = new XMLHttpRequest();// 显示进度的元素var elePercent = document.getElementById('percent');// 上传文件名var filename = encodeURIComponent(file.name).replace(/%/g, '');// 上传中xhr.upload.addEventListener("progress", function(e) {elePercent.innerHTML = Math.round(100 * e.loaded / e.total) / 100 + '%';}, false);// 文件上传成功或是失败xhr.onreadystatechange = function(e) {if (xhr.readyState == 4) {if (xhr.status == 200) {// 100%进度elePercent.innerHTML = '100%';// 显示上传成功后的图片地址var response = xhr.responseText;if (/^http/.test(response)) {//response = response.split(filename)[0] + filename;log('图片上传成功,地址是:<a href="'+ response +'" target="_blank">'+ response +'</a>');} else {log(response);}}}};// 开始上传xhr.open("POST", '?upload=img', true);xhr.setRequestHeader("X_FILENAME", filename);xhr.send(blob);}, file.type || 'image/png');};// 文件base64化,以便获知图片原始尺寸reader.onload = function(e) {// 图片尺寸img.src = e.target.result;};eleFile.addEventListener('change', function (event) {file = event.target.files[0];if (file.type.indexOf("image") == 0) {log('已选择图片'+ file.name +',大小为'+ Math.round(1000 * file.size / (1024*1024)) / 1000 +'M。');reader.readAsDataURL(file);} else {log('选择的文件非图片,到此为止。');}});}
</script>
</body>
</html>

 

 

效果图(canvas压缩图片会失真):

转载于:https://www.cnblogs.com/-mrl/p/8708114.html

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

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

相关文章

如何给linux目录加密码,怎么只给一个文件夹的内容加密?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Encfs security information ││ ││ According to a security audit by Taylor Hornby (Defuse Security), the ││ current implementation of Encfs is vulnerable or potentially vulnerable ││ to multiple types of att…

cordova监听事件中调用其他方法_Laravel模型事件的实现原理详解

模型事件在 Laravel 的世界中&#xff0c;你对 Eloquent 大多数操作都会或多或少的触发一些模型事件&#xff0c;下面这篇文章主要给大家介绍了关于Laravel模型事件的实现原理&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;需要的朋友可以参考借鉴。前言Laravel的ORM…

MongoDB和Web应用程序

当今时代是数据大规模增长的时代。 数据存储不是问题&#xff0c;是的&#xff0c;但是结构化和存储的方式可能会增加或减少所需数据块的查找时间。 不断增长的非结构化数据的用例 脸书&#xff1a; 7.5亿用户处于活跃状态&#xff0c;三分之一的互联网用户拥有Facebook帐户 …

【译】10个有趣的JSCSS库(2018.10)

Tutorialzine每月都会给我们精心挑选优秀的web开发资源&#xff0c;这些资源可以帮助我们解锁最新和最炫酷的网络开发姿势。前端er,让我们一起先睹为快吧&#xff01; WatermelonDB WatermelonDB是用于构建React和React Native应用程序的下一代数据库。快速&#xff0c;高度可…

自定义分页器

好久没来写东西那&#xff01;今天写个自定义分页器给大家参考下吧 首先我们在自己创建的Django项目的app下新建一个utils文件夹&#xff0c;用来放我们的分页器组件 简单说下分页器实现原理&#xff1a; 1.利用ORM查询语句的限制数据条数来确定每页显示的数据 2.设置我们每页显…

五 Vue学习 首页学习 (上)

首页&#xff1a; http://localhost:8002/#/&#xff0c; 登录页面如下&#xff1a; index.js文件中如下的路由配置&#xff0c;转过去看login.vue是如何实现的。 const routes [ { path: /, component: login },&#xff08;这里一个问题&#xff1a; logi…

linux下mqm添加用户,Linux 下MQ的安装和配置亲测

开篇之前奉上几条黄金链接&#xff1a;MQ参考文档http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0m0/index.jsp?topic%2Fcom.ibm.mq.doc%2Fhelp_home_wmq.htmhttp://www-01.ibm.com/support/docview.wss?uidswg27006467MQ下载地址&#xff1a;http://www-03.ibm.com/so…

Java核心面试问题

问&#xff1a;如果main方法被声明为私有该怎么办&#xff1f; 回答&#xff1a; 该程序可以正确编译&#xff0c;但在运行时会显示“ Main方法不公开”。 信息。 问&#xff1a;在Java中按引用传递和按值传递是什么意思&#xff1f; 回答&#xff1a; 通过引用方式传递&…

android 判断是否是标点符号_Java 中文字符判断 中文标点符号判断

Java Character 实现Unicode字符集介绍 CJK中文字符和中文标点判断主要内容&#xff1a;1. Java Character类介绍&#xff1b;2. Unicode 简介及 UnicodeBlock 与 UnicodeScript区别和联系3. 如何判断汉字及中文标点符号做中文信息处理&#xff0c;经常会遇到如何判断一个字是…

小程序tabbar这套方案全搞定!

关于微信小程序的tarbar&#xff0c;相信你们都不会陌生 在实现小程序微信原装的tabbar却比较呆板&#xff0c;不够精致&#xff0c;往往不符合自己的要求 这个时候怎么办呢 这套方案接着&#xff01; 先简单的来说一下主要思想:自定义字体图标组件以及tabbar组件&#xff0c…

linux服务器用哪个面板好,Linux服务器管理面板哪家比较好用?

Linux服务器管理面板哪家比较好用&#xff1f;发布时间&#xff1a;2020-07-21 06:08:33来源&#xff1a;51CTO阅读&#xff1a;261作者&#xff1a;BirdCloud_1022现在&#xff0c;越来越多的站长朋友都会选择服务器用来搭建网站&#xff0c;但是势必需要我们自己搭建WEB环境&…

spring boot(一)入门

目录 spring boot(一)入门一、简介1、微服务的概念2、什么是spring boot3、快速入门4.springboot的快捷部署spring boot(一)入门 一、简介 1、微服务的概念 说起spring boot&#xff0c;我们不得不说一下“微服务”一词的兴起&#xff0c;微服务一词最早起源于2014年&#xff0…

使用Couchbase分页

如果对Couchbase集群进行查询时必须处理大量文档&#xff0c;则使用分页来逐页获取行很重要。 您可以在“ 分页 ”一章的文档中找到一些信息&#xff0c;但是我想在本文中提供更多详细信息和示例代码。 在此示例中&#xff0c;我将基于啤酒样本数据集创建一个简单的视图&#…

android 常用机型尺寸_不同手机/设备和操作系统版本上的Android堆大小

素胚勾勒不出你不仅手机生产商&#xff0c;而且任何创建Android操作系统版本的人&#xff0c;都可以根据设备的特定需求&#xff0c;指定允许的最大堆大小。一些Android根&#xff0c;如CyanogenMod&#xff0c;甚至允许用户自己选择堆大小作为设置。可以使用该方法检测允许的最…

vue移动端项目缓存问题实践

最近在做一个vue移动端项目&#xff0c;被缓存问题搞得头都大了&#xff0c;积累了一些经验&#xff0c;特此记录总结下&#xff0c;权当是最近项目问题的一个回顾吧&#xff01; 先描述下问题场景&#xff1a;A页面->B页面->C页面。假设A页面是列表页面&#xff0c;B页…

pdf解析与结构化提取

PDF解析与结构化提取 PDF解析 对于PDF文档&#xff0c;我们选择用PDFMiner对其进行解析&#xff0c;得到文本。 PDFMiner PDFMiner使用了一种称作lazy parsing的策略&#xff0c;只在需要的时候才去解析&#xff0c;以减少时间和内存的使用。要解析PDF至少需要两个类&#xff1…

Linux usb bus日志如何打开,从linux usb bus节点来认识usb linux usb认识

首先从linux dmesg来认识usb:<6>[ 19.610046] msm_hsic_host msm_hsic_host: Qualcomm EHCI Host Controller using HSIC<6>[ 19.620391] msm_hsic_host msm_hsic_host: new USB bus registered, assigned bus number 1<6>[ 19.659942] msm_hsic_host …

Spring面试问题

还可以查看我们最新的文章69Spring面试问答-最终名单 。 1&#xff09;什么是春天&#xff1f; 回答&#xff1a; Spring是控件和面向方面的容器框架的轻量级转换。 2&#xff09;解释春天&#xff1f; 回答&#xff1a; 轻巧&#xff1a;在尺寸和透明度方面&#xff0c; S…

java 字符串转utc时间_JAVA 本地时间字符串转UTC时间字符串

本来想偷懒百度一个时间字符串转UTC的代码&#xff0c;但发现没有一个能用&#xff0c;写得还复杂得要死&#xff0c;没办法还是自己撸一个。/*** UTC时间字符串转本地时间字符串* 我的本地getDateTimeInstance()是格式&#xff1a;yyyy-MM-dd HH:mm:ss* param str UTC时间字符…

前端解读面向切面编程(AOP)

前言 面向对象(OOP)作为经典的设计范式&#xff0c;对于我们来说可谓无人不知&#xff0c;还记得我们入行起始时那句经典的总结吗-万事万物皆对象。 是的&#xff0c;基于OOP思想封装、继承、多态的特点&#xff0c;我们会自然而然的遵循模块化、组件化的思维来设计开发应用&a…