上传图片时压缩图片 - 前端(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上传图片文件了,正因如此,我们有些困难必须去攻克: 低网速下上传进度缓慢,用户体 ...
随机推荐
- java多个文件压缩下载
public static void zipFiles(File[] srcfile,ServletOutputStream sos){ byte[] buf=new byte[1024]; try ...
- Jememeter和Loadrunner测试MySQL性能
From:http://blog.csdn.net/testingstar/article/details/60579454 MySQL数据库性能测试的方法 前置条件: 安装系统:windows 7 ...
- surface 通过U盘 镜像恢复系统
1. 在恢复之前首先要解锁bitlocker(如果你的surface没有加锁就不需要这个步骤) 在另一台电脑上登录bitlocker锁绑定的微软账号,查询密钥,在需要的地方输入这个密钥(不经过这个操作 ...
- ubuntu将快捷方式复制到桌面
/usr/share/applications目录下,如果我们要创建桌面快捷方式,只需要右键-复制-桌面 就Ok
- import caffe时出错:can not find module skimage.io
import caffe时出错:can not find module skimage.io //以下内容在ubuntu16.4上实际验证过.注意大小写的.----20170605 在命令行输入Py ...
- 流迭代器 + 算法灵活控制IO流
前言 标准算法配合迭代器使用太美妙了,使我们对容器(数据)的处理更加得心应手.那么,能不能对IO流也使用标准算法呢?有人认为不能,他们说因为IO流不是容器,没有迭代器,故无法使用标准算法.他们错了,错 ...
- checkAll全选的一个小例子
function checkAll(tag,flag) { //得到所有check var checkboxs = $(tag).closest("table").find(&qu ...
- EasyDarwin开发出类似于美拍、秒拍的短视频拍摄SDK:EasyVideoRecorder
EasyVideoRecorder Github:https://github.com/EasyDarwin/EasyVideoRecorder EasyVideoRecorder作为一款短视频拍摄的 ...
- LeastRecentlyUsed
LeastRecentlyUsed Operating Systems http://www.cs.jhu.edu/~yairamir/cs418/os6/sld001.htm Cache repla ...
- static 静态域 类域 静态方法 工厂方法 he use of the static keyword to create fields and methods that belong to the class, rather than to an instance of the class 非访问修饰符
总结: 1.无论一个类实例化多少对象,它的静态变量只有一份拷贝: 静态域属于类,而非由类构造的实例化的对象,所有类的实例对象共享静态域. class Employee { private static ...