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 相关文章推荐
JQuery1.6 使用方法三
Nov 23 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
Nov 14 Javascript
Javascript高级技巧分享
Feb 25 Javascript
js老生常谈之this,constructor ,prototype全面解析
Apr 05 Javascript
vue实现ToDoList简单实例
Feb 07 Javascript
Vue 仿百度搜索功能实现代码
Feb 16 Javascript
vue中子组件调用兄弟组件方法
Jul 06 Javascript
vue实现城市列表选择功能
Jul 16 Javascript
JS判断用户用的哪个浏览器实例详解
Oct 09 Javascript
通过说明与示例了解js五种设计模式
Jun 17 Javascript
从表单校验看JavaScript策略模式的使用详解
Oct 17 Javascript
vue实现在data里引入相对路径
Jun 05 Vue.js
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
PHP 身份证号验证函数
2009/05/07 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
PHP实现通过文本文件统计页面访问量功能示例
2019/02/13 PHP
扩展String功能方法
2006/09/22 Javascript
Expandable &quot;Detail&quot; Table Rows
2007/08/29 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
JS实现简单的Canvas画图实例
2013/07/04 Javascript
浅谈JS继承_借用构造函数 &amp; 组合式继承
2016/08/16 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
vue给对象动态添加属性和值的实例
2019/09/09 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
2019/09/23 Javascript
如何在vue中使用video.js播放m3u8格式的视频
2021/02/01 Vue.js
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
Python中for循环控制语句用法实例
2015/06/02 Python
Python实现数通设备端口使用情况监控实例
2015/07/15 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
如何使用pyinstaller打包32位的exe程序
2019/05/26 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
PyTorch的torch.cat用法
2020/06/28 Python
关于django python manage.py startapp 应用名出错异常原因解析
2020/12/15 Python
馥绿德雅美国官方网站:Rene Furterer头皮护理专家
2019/05/01 全球购物
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
C/C++程序员常见面试题一
2012/12/08 面试题
介绍一下Python中webbrowser的用法
2013/05/07 面试题
2014年幼儿园元旦活动方案
2014/02/13 职场文书
体现团队精神的口号
2014/06/06 职场文书
药剂专业毕业生求职信
2014/06/24 职场文书
齐云山导游词
2015/02/06 职场文书
情人节单身感言
2015/08/03 职场文书
勤俭节约主题班会
2015/08/13 职场文书
人生哲理妙语30条:淡写流年,笑过人生
2019/09/04 职场文书
python如何获取网络数据
2021/04/11 Python