上传图片时压缩图片 - 前端(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上传图片文件了,正因如此,我们有些困难必须去攻克: 低网速下上传进度缓慢,用户体 ...
随机推荐
- Push flow
自动移库规则push flow可以用来规划物流 比如产品A如果进入到picking区,按照仓储的规则,系统可以自动生产调拨单,将产品A 从picking区调拨到保存的库位货架A1E1 设置步骤 ...
- 最长连续序列(Longest Consecutive Sequence)
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...
- OS: 读者写者问题(写者优先+LINUX+多线程+互斥量+代码)(转)
一. 引子 最近想自己写个简单的 WEB SERVER ,为了先练练手,熟悉下在LINUX系统使用基本的进程.线程.互斥等,就拿以前学过的 OS 问题开开刀啦.记得当年学读者写者问题,尤其是写者优先的 ...
- 7.2 HAVING子句
7.2 HAVING子句正在更新内容.请稍后
- Linux驱动经典面试题目
1. linux驱动分类 2. 信号量与自旋锁 3. platform总线设备及总线设备怎样编写 4. kmalloc和vmalloc的差别 5. module_init的级别 6. 加入 ...
- ubuntu 安装后的配置
osx 下用 vmware 安装了一个 ubuntu 虚拟机,版本是 14.04 server.安装完之后要做一系列配置,记录如下. 配置 Android 编译环境 sudo apt-get inst ...
- windows下的txt格式转换成linux下的TXT
存在的问题是 多出一个方框或者黑格子 主要是因为bash 不能忽略windows的问题 用sed 命令来处理,分别是windows转linux,linux转windows sed -e 's/.$// ...
- 脱了裤子放屁之std::string
一个天天跟c#奋斗的苦逼c++程序猿 改自己曾经代码的时候发现有例如以下几行. char szPath[MAX_PATH] = {0}; GetModuleFileNameA(NULL,szPath, ...
- 使用kbmmw 的调度事件动态显示时间
kbmmw 里面提供了强大的事件调度功能,今天简单演示一个使用调度事件在窗体上显示时间. 建立一个新工程. 放上几个控件 在窗体里面引用单元 kbmMWScheduler, 然后添加过程 unit U ...
- 【BZOJ4956】lydsy七月月赛 I 乱搞
[BZOJ4956]lydsy七月月赛 I 题面 题解:傻题,Floyd传递闭包即可~ #include <cstdio> #include <cstring> #includ ...