上传图片时压缩图片 - 前端(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上传图片文件了,正因如此,我们有些困难必须去攻克: 低网速下上传进度缓慢,用户体 ...
随机推荐
- tree related problems (update continuously)
leetcode Binary Tree Level Order Traversal 这道题是要进行二叉树的层次遍历.对于层次遍历,最简单直观的办法就是进行BFS.于是我们仅仅须要维护一个队列就能够了 ...
- React系列-ES6
ES6新特性概览 React系列代码(非本人) 5 Projects to Help You Learn React 本人对javascript并不擅长,只是在工作中会时常用到,而且以jQuery居多 ...
- 一起学android之怎样卸载指定的 应用程序(25)
效果图例如以下: 代码例如以下: public class MainActivity extends Activity { private Button btn_delete; @Override p ...
- HTML marquee标签
marquee语法 <marquee></marquee> 实例一<marquee>Hello, World</marquee> marquee常 ...
- listview 下拉刷新
http://blog.csdn.net/lancees/article/details/7776853
- quick-cocos2d-x开发工具sublime text及其强力插件QuickXDev
更新:如今QuickXDev已经能够通过Package Control下载了,全部QuickXDev相关的请看这里:http://my.oschina.net/lonewolf/blog?catalo ...
- iOS进程间通信之CFMessagePort
本文转载至 http://www.cocoachina.com/industry/20140606/8701.html iOS系统是出了名的封闭,每个应用的活动范围被严格地限制在各自的沙盒中.尽管如此 ...
- iOS开发之NewsstandKit.framework的使用
本文转载至 http://mobile.51cto.com/iphone-423385.htm 系统提供NewsstandKit.framework来支持newsstand类型的程序,就是在spr ...
- [省选]板块(shenben已经AFO!!!)
shenben已经AFO!!! 部分摘抄自网络 同样的,加粗是重点,星号是选学 图论 网络流(dinic,ISAP选一个,费用流写EK就行.*zkw费用流),二分图 点分治,边分治,*动态点分治 树链 ...
- Qtree3
题目描述 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑点,若无,输出 ...