Angular使用 ng-img-max 调整浏览器中的图片的示例代码


Posted in Javascript onAugust 17, 2017

你想在Angular应用程序中进行图片上传,是否想在图片上传之前在前端限制上传图片的尺寸?ng2-img-max模块正是你所要的! ng2-img-max模块会使用web sorkers 进行图片大小的计算,并驻留在主线程中。

我们来看看他的用途:

安装

首先,使用npm 或 Yarn安装模块:

$ npm install ng2-img-max blueimp-canvas-to-blob --save

# or Yarn :
$ yarn add ng2-img-max blueimp-canvas-to-blob

blueimp-canvas-to-blob是一个polyfill,以便canvas.toBlob()可以在Safari和旧版本的Internet Explorer等浏览器上使用。

将polyfill脚本包含在项目中。 如果您使用Angular CLI,您可以将脚本添加到.angular-cli.json文件中:

//: .angular-cli.json

...
"scripts": [
 "../node_modules/blueimp-canvas-to-blob/js/canvas-to-blob.min.js"
],
//...

将脚本添加到Angular CLI配置后,您将需要重新启动本地服务。

现在我们将模块导入应用模块或功能模块:

//: app.module.ts

//...
import { Ng2ImgMaxModule } from 'ng2-img-max';

@NgModule({
 declarations: [ AppComponent ],
 imports: [
  //...
  ng2ImgMaxModule
 ],
 providers: [],
 bootstrap: [ AppComponent ]
})
export class AppModule {}

最后,ng2-img-max服务可以导入并注入到这样的组件中:

import { Component } from '@angular/core';

import { Ng2ImgMaxService } from 'ng2-img-max';

@Component({ ... })
export class AppComponent {
 constructor(private ng2ImgMax: Ng2ImgMaxService ) {}
}

使用

我们添加一个File文件输入框到组件的模板中,像这样:

<input type='file' (change)="onImageChange($event)" accept="image/*" />

在组件类中添加方法onImageChange, 它将会限制图片的宽高为:400px,300px:

updateImage: Blob;

constructor(private ng2ImgMax: Ng2ImgMaxService) {}

onImageChange(event){
 let image = event.target.files[0];
 
 this.ng2ImgMax.resizeImage(image,400,300).subscribe(result=> {
  this.uploadImage = result;
 },
 error=> {
  console.log('error:',error);
 })
}

如果您有多个图像需要一次性调整大小,请改用resize方法,并将图片文件数组作为第一个参数传入。

结果是Blob类型,但是如果需要,可以使用File构造函数将其转换为正确的文件:

//: app.component.ts

uploadedImage: File;
constructor(private ng2ImgMax: Ng2ImgMaxService) {}
onImageChange(event){
 let image = event.target.files[0];
 
 this.ng2ImgMax.resizeImage(image,400,300).subscribe(result=> {
  this.uploadedImage = new File([result],result.name);
 },
 error=> {
  console.log('error',error);
 })
}

您现在可以将文件上传到您的后端。 不要忘记在后端做好验证,因为这里的内容会阻止一些用户将超大或非图像文件直接上传到后端。

只限制宽度或高度

假设您只想将高度限制为300px,并相应调整宽度,以保持宽高比相同。 只要设置任何一阀值到10000:

//...
onImageChange(event) {
 let image = event.target.files[0];
 this.ng2ImgMax.resizeImage(image,10000,300).subscribe(result=> {
  this.uploadedImage = new File([result],result.name);
 },
 error=> {
  console.log('error:',error);
 });
}

压缩代替Resizing

您还可以使用compress或compressImage方法执行有损压缩,而不是调整图像大小。 只需传递最大值(兆字节)。 你显然想要运行一些测试,看看你想要走多远的几个小时,同时保持图像看起来很好。

在以下示例中,我们将生成的图像限制为大约75Kb:

onImageChange(event) {
 let image = event.target.files[0];

 this.ng2ImgMax.compressImage(image, 0.075).subscribe(
  result => {
   this.uploadedImage = new File([result], result.name);
   this.getImagePreview(this.uploadedImage);
  },
  error => {
   console.log('? Oh no!', error);
  }
 );
}

图片预览

您可能想要预览要上传到用户的图像。 您可以使用FileReader对象执行此操作。 您还需要使用Angular的DomSanitizer来使其信任使用FileReader对象创建的base64编码数据URI:

现在,我们的组件内容是这样的。组件中有趣的新方法是getImagePreview:

//: app.component.ts

import { Component } from '@angular/core';
import { Ng2ImgMaxService } from 'ng2-img-max';
import { DomSanitizer } from '@angular/platform-browser';

@Component({ ... })
export class AppComponent {
 uploadedImage: File;
 imagePreview: string;

 constructor(
  private ng2ImgMax: Ng2ImgMaxService,
  public sanitizer: DomSanitizer
 ) {}

 onImageChange(event) {
  let image = event.target.files[0];

  this.ng2ImgMax.resizeImage(image, 10000, 375).subscribe(
   result => {
    this.uploadedImage = new File([result], result.name);
    this.getImagePreview(this.uploadedImage);
   },
   error => {
    console.log('? Oh no!', error);
   }
  );
 }

 getImagePreview(file: File) {
  const reader: FileReader = new FileReader();
  reader.readAsDataURL(file);
  reader.onload = () => {
   this.imagePreview = reader.result;
  };
 }
}

在我们的模板中,我们可以使用sanitizer来显示如图像:

//: app.component.html

<img
  *ngIf="imagePreview"
  [src]="sanitizer.bypassSecurityTrustUrl(imagePreview)">

这就是它的全部! 您还可以查看同一作者的ng2-img-tools包,以获得更多的浏览器端图像处理(如裁剪)。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中Cookie操作实例
Jan 09 Javascript
Javascript中this绑定的3种方法与比较
Oct 13 Javascript
用file标签实现多图文件上传预览
Feb 14 Javascript
angular之ng-template模板加载
Nov 09 Javascript
利用HBuilder打包前端开发webapp为apk的方法
Nov 13 Javascript
Vue2 SSR渲染根据不同页面修改 meta
Nov 20 Javascript
微信小程序简单实现form表单获取输入数据功能示例
Nov 30 Javascript
AngularJS基于MVC的复杂操作实例讲解
Dec 31 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
Apr 19 Javascript
TypeScript高级用法的知识点汇总
Dec 17 Javascript
vue 实现根据data中的属性值来设置不同的样式
Aug 04 Javascript
jQuery实现可以扩展的日历
Dec 01 jQuery
Canvas放置反弹效果随机图形(实例)
Aug 17 #Javascript
js实现方块上下左右移动效果
Aug 17 #Javascript
JavaScript中一些特殊的字符运算
Aug 17 #Javascript
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
Aug 17 #Javascript
JS 中LocalStorage和SessionStorage的使用
Aug 17 #Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
Aug 17 #jQuery
详解JS中的柯里化(currying)
Aug 17 #Javascript
You might like
广播爱好者需要了解的天线知识
2021/03/01 无线电
PHP第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
php中通过curl模拟登陆discuz论坛的实现代码
2012/02/16 PHP
Windows下部署Apache+PHP+MySQL运行环境实战
2012/08/31 PHP
鸡肋的PHP单例模式应用详解
2013/06/03 PHP
php和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
php分页函数完整实例代码
2014/09/22 PHP
非常实用的PHP常用函数汇总
2014/12/17 PHP
ThinkPHP中where()使用方法详解
2016/04/19 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
2018/07/17 PHP
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
jquery 学习之二 属性(类)
2010/11/25 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
jquery表单对象属性过滤选择器实例分析
2015/05/18 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
2015/12/12 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
js return返回多个值,通过对象的属性访问方法
2017/02/21 Javascript
HTML的select控件美化
2017/03/27 Javascript
vue cli2.0单页面title修改方法
2018/06/07 Javascript
JS函数基本定义与用法示例
2020/01/15 Javascript
javascript运行机制之执行顺序理解
2020/08/03 Javascript
[46:50]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python 中文字符串的处理实现代码
2009/10/25 Python
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
2018/02/22 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
基于keras中的回调函数用法说明
2020/06/17 Python
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
世界上最大的二手相机店:KEN
2017/05/17 全球购物
全球销量第一生发产品:Viviscal
2017/12/21 全球购物
金融管理专业毕业生求职信
2014/03/12 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
亮剑观后感600字
2015/06/05 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
MySQL索引失效场景及解决方案
2022/07/23 MySQL