前端将服务器返回图片进行裁剪和框选重要信息


interface Rect {
    w: number;//需要图片宽度
    h: number;//需要图片高度
    x: number; //开始操作横坐标
    y: number;//开始操作纵坐标
}

/**
* @class
* @description 通过 canvas 将图片修改,
*/

class ChangeImages {
    image: HTMLImageElement;
    canvas: HTMLCanvasElement;
    constructor() {
        this.image = new Image();
        this.canvas = document.createElement('canvas');
    }

    /**
    * @function 
    * @description 裁剪图片
    * @param {String} imageUrl -  图片地址
    * @param {rect} rect -  图片裁剪位置及宽高
    * @param {String} crossOrigin -  跨域类型
    * @return {Promise} 返回裁剪后图片地址
    * @example
    *   new class().cropImage(imageUrl,rect)
    */

    cropImage(imageUrl: string, rect: Rect, crossOrigin: string = 'anonymous'): Promise<string> {
        const { x, y, w, h } = rect
        this.image.crossOrigin = crossOrigin;//设置跨域
        this.image.src = imageUrl;
        this.canvas.width = w;
        this.canvas.height = h;
        const context = this.canvas.getContext('2d');
        return new Promise((resolve, reject) => {
            this.image.onload = () => {
                context?.drawImage(this.image, x, y, w, h, 0, 0, w, h);
                resolve(this.canvas.toDataURL('image/png'));
            };
            this.image.onerror = (error) => {
                reject(error);
            };
        });
    };

    /**
    * @function 
    * @description 在图片绘制矩形
    * @param {String} imageUrl -  图片地址
    * @param {rect} rects -  图片绘制位置及宽高
    * @param {string} color -  图片绘制的颜色
    * @return {Promise} 返回绘制后图片地址
    * @example
    *   new class().drawBoxOnImage(imageUrl,rects)
    */

    drawBoxOnImage(imageUrl: string, rects: Rect[] | Rect, color: string = 'red'): Promise<string> {
        const ctx = this.canvas.getContext('2d');
        this.image.src = imageUrl;
        return new Promise((resolve, reject) => {
            this.image.onload = () => {
                this.canvas.width = this.image.width;
                this.canvas.height = this.image.height;
                ctx?.drawImage(this.image, 0, 0);
                ctx?.beginPath();
                ctx && (ctx.lineWidth = 5);
                ctx && (ctx.strokeStyle = color);
                Array.isArray(rects) ? rects.forEach(({ x, y, w, h }: Rect) => ctx?.rect(x, y, w, h)) : ctx?.rect(rects.x, rects.y, rects.w, rects.h);
                ctx?.stroke();
                resolve(this.canvas.toDataURL('image/png'));
            }
            this.image.onerror = (error) => {
                reject(error);
            };

        })
    }
}
export default new ChangeImages

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值