angular7中实现图片上传、图片压缩、图片裁剪功能

file-upload.service.ts

import { Injectable } from '@angular/core';
import { HttpService } from './http.service';
import { ApiService } from './api.service';

@Injectable({
    providedIn: 'root'
})
export class FileUploadService {

    constructor(
        public http: HttpService,
        public api: ApiService
    ) { }

    imgUpload(imgFile: any, cb: any) {
        // 图片上传
        const that = this;

        // 调用文件上传弹框
        imgFile.nativeElement.click();
		
		// // 2. 把获取到的图片转换成base64格式
        imgFile.nativeElement.onchange = function() {
            const filereader = new FileReader(); // 新建一个FileReader对象
            const file = this.files[0]; //  // 获取文件对象

            if (!/image\/\w+/.test(file.type)) {
                alert('看清楚,这个需要图片!');
                return false;
            }

            if (this.files[0]) {
                if (this.files[0].size / 1024 / 1024 > 2) {
                    alert('图片上传大小不要超过2MB, 请重新上传!');
                    return;
                }
            }

            const imgName = file.name; // 获取文件名称
			
			// 截取文件名称后面的文件格式
            const index = imgName.lastIndexOf('.');
            const Base64ImageType = imgName.substring(index + 1, imgName.length);
			
			// 将读取的文件转换成base64格式
            filereader.readAsDataURL(file);

            filereader.onload = () => {
            	// 转换后的文件数据存储在filereader对象的result中
                const result: any = filereader.result;

                // 3. 图片压缩
                const image = new Image(); // 新建一个img标签(不嵌入DOM节点,仅做canvas操作)
                image.src = result; // 让该标签加载base64格式的原图
					
				// 图片加载完毕后再通过canvas压缩图片,否则图片还没加载完就压缩,结果图片是全黑的
                image.onload = () => {

                    const canvas = document.createElement('canvas'); // 创建一个canvas元素
                    const context = canvas.getContext('2d'); // context相当于画笔,里面有各种可以进行绘图的API
                    
                    // 压缩后图片的宽度,这里设置为缩小一半,例如 imageWidth = image.width / 2;
                    const imageWidth = image.width;
                    const imageHeigth = image.height;
                    let imgData = ''; // 存储压缩后的图片
                    canvas.width = imageWidth; // 设置绘图的宽度
                    canvas.height = imageHeigth; // 设置绘图的高度
                    // 使用drawImage重新设置img标签中的图片大小,实现压缩和图片裁剪
                    context.drawImage(image, 0, 0, imageWidth, imageHeigth, 0, 0, 104, 104);
                    // 使用toDataURL将canvas上的图片转换为base64格式
                    imgData = canvas.toDataURL('image/jpeg');

                    if (imgData) {
                        // ajax数据请求
                        const params = `Base64Image=${imgData}&Base64ImageType=${Base64ImageType}`;
                        that.http.doPost(that.api.uploadBase64Image, params).subscribe((data: any) => {
                            if (data.IsSucceed) {
                                cb(data.Data);
                            } else {
                                alert('上传失败,请重新上传');
                            }
                        });
                    }

                };
            };
        };
    }
}

component.ts

// 头像上传
    imgUpload() {
        this.fileUpload.imgUpload(this.fileUploadImg, (imgUrl: any) => {
            this.knowledgeDetail.avatorImg = imgUrl;
            this.isShowAvator = true;
            console.log(this.knowledgeDetail.avatorImg);
        });
    }

component.html

<div class="avatorImg" (click)="imgUpload()">

    <div *ngIf="isShowAvator">
        ![在这里插入图片描述]()
    </div>
    
    <ng-container *ngIf="!isShowAvator">
        <div class="ant-upload" tabindex="0" role="button">
            <i class="anticon upload-icon anticon-plus ng-star-inserted">
                <svg viewBox="64 64 896 896" fill="currentColor" width="1em" height="1em" data-icon="plus" aria-hidden="true"><defs><style></style></defs><path d="M482 152h60q8 0 8 8v704q0 8-8 8h-60q-8 0-8-8V160q0-8 8-8z"></path><path d="M176 474h672q8 0 8 8v60q0 8-8 8H176q-8 0-8-8v-60q0-8 8-8z"></path></svg>
            </i>
            <div class="ant-upload-text ng-star-inserted">上传图片</div>
        </div>
    </ng-container>
	
	// 1.先通过input标签获取本地图片
    <input style="display: none;" type="file" #fileUploadImg>

</div>
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值