上传图片时压缩图片 - 前端(canvas)做法
HTML前端代码:
<?php $this->layout('head'); ?>
<?php $this->layout('sidebar'); ?>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<style type="text/css">
#preview {
display: inline-block;
width: 24.56rem;
height: 24.56rem;
position: relative;
background-image: url(img/iconfont-tianjia.png);
background-repeat: no-repeat;
background-size:cover ;
}
#file {
/*width: 100%;*/
height: 100%;
/*opacity: 0;*/
position: absolute;
left: 0;
top: 0;
cursor: pointer;
z-index: 5;
}
</style>
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper">
<!-- Content Header (Page header) -->
<section class="content-header">
</section>
<div class="col-md-12">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">商品图库</h3>
</div>
<!-- 第一种 -->
<input type="file" accept="image/*" name="picture" id="file" value="点击" />
<div id="preview"></div>
<!-- 第二种 -->
<input type="file" id="tesImg" onchange="tes(this)" />
<img id="tesId">
<img id="tesId1">
<img id="tesId2">
<!-- /.box-header -->
<div class="box-body" style="font-size: 1.3rem">
</div><!-- /.box-body -->
<div class="box-footer clearfix ">
</div>
</div><!-- /.box -->
</div>
<div class=" clearfix "></div>
</div>
<?php $this->layout('footer'); ?>
<!-- 第一种 -->
<script type="text/javascript">
var eleFile = document.querySelector('#file');
var preview = document.querySelector('#preview');
// 压缩图片需要的一些元素和对象
var reader = new FileReader(),
//创建一个img对象
img = new Image();
// 选择的文件对象
var file = null;
// 缩放图片需要的canvas
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
// base64地址图片加载完毕后
img.onload = function() {
// 图片原始尺寸
var originWidth = this.width;
var originHeight = this.height;
// 最大尺寸限制,可通过设置宽高来实现图片压缩程度
var maxWidth = 800,
maxHeight = 800
// 目标尺寸
var targetWidth = originWidth,
targetHeight = originHeight;
// 图片尺寸超过400x400的限制
if(originWidth > maxWidth || originHeight > maxHeight) {
if(originWidth / originHeight > maxWidth / maxHeight) {
// 更宽,按照宽度限定尺寸
targetWidth = maxWidth;
targetHeight = Math.round(maxWidth * (originHeight / originWidth));
} else {
targetHeight = maxHeight;
targetWidth = Math.round(maxHeight * (originWidth / originHeight));
}
}
// canvas对图片进行缩放
canvas.width = targetWidth;
canvas.height = targetHeight;
// 清除画布
context.clearRect(0, 0, targetWidth, targetHeight);
// 图片压缩
context.drawImage(img, 0, 0, targetWidth, targetHeight);
/*第一个参数是创建的img对象;第二个参数是左上角坐标,后面两个是画布区域宽高*/
//压缩后的图片base64 url
/*canvas.toDataURL(mimeType, qualityArgument),mimeType 默认值是'image/jpeg';
* qualityArgument表示导出的图片质量,只要导出为jpg和webp格式的时候此参数才有效果,默认值是0.92*/
var newUrl = canvas.toDataURL('image/jpeg', 0.8);//base64 格式
$.post(
'/business/test_canvas'
,{img:newUrl}
,function(data){
console.log(data);
}
);
// console.log(canvas.toDataURL('image/jpeg', 0.92));return;
preview.style.backgroundImage='url(' + newUrl + ')';
};
// 文件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) {
reader.readAsDataURL(file);
}
});
</script>
<!-- 第二种 -->
<script>
/*
var imgOb=new Image();
var imgDom=$("#tesId");
imgOb是图片对象,而imgDom是dom对象;
imgDom[0]是图片对象,与imgOb一样。
要想获取图片对象的宽与高
必须等图片对象加载后才能获取
imgOb.onload=function(e){
alert(imgOb.width);
alert(imgOb.width);
}
*/
function tes(ob){
var file=ob.files[0];
var reader=new FileReader();
reader.readAsDataURL(file);
reader.onload=function(e){
var imgObj=new Image();
imgObj.src=this.result;
imgObj.onload=function(a){
var canvas = document.createElement('canvas');
canvas.width = 100;
canvas.height = 100;
var ctx = canvas.getContext("2d");
ctx.drawImage(imgObj, 0, 0, 100, 100);
$("#tesId").attr('src',canvas.toDataURL("image/jpeg", 0.9));
canvas.width = 800;
canvas.height = 800;
ctx.drawImage(imgObj, 0, 0, 800, 800);
var img = canvas.toDataURL("image/jpg", 0.1);
$("#tesId1").attr('src',canvas.toDataURL("image/jpg", 0.1));
$.post(
'/business/test_canvas'
,{img: img}
,function(data){
}
);
canvas.width = 300;
canvas.height = 100;
ctx.drawImage(imgObj, 0, 0, 300, 100);
$("#tesId2").attr('src',canvas.toDataURL("image/jpeg", 0.6));
}
}
}
</script>
PHP后端接收前端 ajax方法传来base64格式图片保存:
// 测试canvas
public function test_canvas()
{
if($_POST){
// echo new BasicReturn(true, 0, '', $_POST); $img = $_POST['img'];
$abs_path = \sdk\config\Config::getUpPath()['upload'];
$goods_path = "goods/" . date("Y/m/d/"); //图片上传路径
if (!file_exists($abs_path . $goods_path))
mkdir($abs_path . $goods_path, 0777, 1);
$file_name = microtime(true) * 10000;
$imgPath = $goods_path . $file_name; // 保存图片
$type = $this->save_img_real($abs_path . $imgPath,$img); }
$this->view('test_canvas');
} private function save_img_real($path, $base64_image_content)
{
//匹配出图片的格式 if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)) {
$type = $result[2];
if ($type == 'jpeg') {
$type = 'jpg';
}
if ($type == 'jpg' || $type == 'gif' || $type == 'png') {
if (file_put_contents($path . '.' . $type, base64_decode(str_replace($result[1], '', $base64_image_content)))) {
return $type;
} else {
return false;
}
} else {
return false;
}
} elseif (preg_match('/^(data:;base64,)/', $base64_image_content, $result)) {
$img_data = base64_decode(str_replace($result[1], '', $base64_image_content));
$types = $this->check_image_type($img_data);
if ($types) {
if (file_put_contents($path . '.' . $types, $img_data)) {
return $types;
} else {
return false;
}
} else {
return false;
}
}
} private function check_image_type($image)
{
$bits = array(
'jpg' => "\xFF\xD8\xFF",
'gif' => "GIF",
'png' => "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a",
);
foreach ($bits as $type => $bit) {
if (substr($image, 0, strlen($bit)) === $bit) {
return $type;
}
}
return false;
}
需要注意的是:图片宽高 250 x 250 太小会失真,我这里就设置成 800 x 800
上传图片时压缩图片 - 前端(canvas)做法的更多相关文章
- java上传图片时压缩图片
/** * 函数:调整图片尺寸或生成缩略图 v 1.1 * @param $Image 需要调整的图片(含路径) * @param $Dw 调整时最大宽度;缩略图时的绝对宽度 * @param $Dh ...
- JS压缩图片(canvas),返回base64码
上传图片时总会遇到图片过大上传不上去的问题,本方法是在网上搜的压缩图片的例子,我测试过了,确实能用,但是照搬别人的代码,发现压缩后图片会失真,不清晰,现经修改图片清晰度还可以,不仔细看差别不大,so, ...
- vue + vant 上传图片之压缩图片
<van-uploader v-model="fileList" multiple :after-read="afterRead" :max-count= ...
- java 上传图片 并压缩图片大小
Thumbnailator 是一个优秀的图片处理的Google开源Java类库.处理效果远比Java API的好.从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生 ...
- java 上传图片 并压缩图片大小(转)
Thumbnailator 是一个优秀的图片处理的Google开源Java类库.处理效果远比Java API的好.从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生 ...
- java上传图片并压缩图片大小
Thumbnailator 是一个优秀的图片处理的Google开源Java类库.处理效果远比Java API的好.从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生 ...
- java实现上传图片并压缩图片大小功能
缩略图压缩文件jar包 <!-- 图片缩略图 --> <dependency> <groupId>net.coobird</groupId> <a ...
- vue+element-ui上传图片时压缩大小
第一种方法:需要安装一个模块 yarn add image-conversion --save <el-upload ref="upload" :data="dat ...
- 结合Vue.js的前端压缩图片方案
这是一个很简单的方案.嗯,是真的. 为什么要这么做? 在移动Web蓬勃发展的今天,有太多太多的应用需要让用户在移动Web上传图片文件了,正因如此,我们有些困难必须去攻克: 低网速下上传进度缓慢,用户体 ...
随机推荐
- JavaWeb页面添加隐藏版权信息
JavaWeb页面添加隐藏版权信息. 首先,我推荐一个值得玩味的版权站点,有兴趣的朋友能够去看上一看.Nazo Level 1,这个demo中我能发掘到有5个步骤,你看你能发现几层? 接下来.我来介绍 ...
- request 发送多层字典
a. 客户端向服务端发送多层字典的值 #客户端发送 obj = { 'data':{ "k1":"v1", "k2":"v2&qu ...
- navicat for mysql 快捷键(原创)
navicat for mysql 快捷键(原创) 在谷歌,百度上基本搜索不出来这方面的内容,我总结了一下,方便新手,节省一些探索的时间. 1.ctrl+q 打开查询窗口2.ctr ...
- hdu 1081 & poj 1050 To The Max(最大和的子矩阵)
转载请注明出处:http://blog.csdn.net/u012860063 Description Given a two-dimensional array of positive and ne ...
- 实习日记)select option 选择不同的option时, 页面发生不同的变化
怎么在下拉框的选择不同的option时, 页面发生响应的变化 因为option是没有点击事件什么的, 只有select才有, 所以不能通过option的点击事件来完成, 所以开始的尝试都失败了(之前 ...
- 使用EA生成多层次的代码框架
最近工作期间发现了一个非常棒的UML软件[Enterprise Architect UML 建模工具]简称EA,在该软件上绘制框架层面的类之间关系后,可以自动生成相关语言的代码. EA上目前支持的语言 ...
- python-pyDes-ECB加密-DES-DES3加密
网上的教程都他妹的是抄的,抄也就算了,还改抄错了,害我写了一两天都没找到原因,直接去官网看,找例子很方便 官网链接:http://twhiteman.netfirms.com/des.html 一个小 ...
- Oracle操作笔记
1.查询Oracle版本,数据库的SID select * from v$version; select name from v$database; 2.查询Oracle数据库所支持的功能 SELEC ...
- 自动添加QQ
自动添加QQ <meta http-equiv="refresh" content="0; url=tencent://AddContact/?fromId=50& ...
- linux的su和sudo(转载)
来源:http://www.jb51.net/LINUXjishu/12713.html 一. 使用 su 命令临时切换用户身份 1.su 的适用条件和威力 su命令就是切换用户的工具,怎么理解呢?比 ...