react 中 Zmage根据坐标系 标记四个点,并连成一个矩形

首先我们把他封装成一个组件,方便以后调用

import React, { useRef, useEffect, useState } from 'react';
import Zmage from "react-zmage";

export default function CanvasWithRect({ imageUrl, points }) {
    const canvasRef = useRef(null);
    const [processedImage, setProcessedImage] = useState('');

    useEffect(() => {
        const canvas = canvasRef.current;
        const ctx = canvas.getContext('2d');
        const img = new Image();

        img.crossOrigin = 'Anonymous'; // 处理跨域问题
        img.src = imageUrl;

        img.onload = () => {
            // 设置 Canvas 尺寸匹配图片
            canvas.width = img.width;
            canvas.height = img.height;

            // 绘制原始图片
            ctx.drawImage(img, 0, 0);

            // 计算矩形参数
            const [point1, point2] = points;
            const minX = Math.min(point1.x, point2.x);
            const maxX = Math.max(point1.x, point2.x);
            const minY = Math.min(point1.y, point2.y);
            const maxY = Math.max(point1.y, point2.y);

            // 绘制矩形
            ctx.strokeStyle = '#ff0000';
            ctx.lineWidth = 2;
            ctx.strokeRect(minX, minY, maxX - minX, maxY - minY);

            // 绘制四个顶点
            ctx.fillStyle = '#ff0000';
            [minX, maxX].forEach(x => {
                [minY, maxY].forEach(y => {
                    ctx.beginPath();
                    ctx.arc(x, y, 5, 0, Math.PI * 2);
                    ctx.fill();
                });
            });

            // 生成新图片
            setProcessedImage(canvas.toDataURL('image/png'));
        };
    }, [imageUrl, points]);

    return (
        <div>
            {/* 隐藏原始 Canvas */}
            <canvas ref={canvasRef} style={{ display: 'none' }} />

            {/* 显示处理后的图片 */}
            {processedImage && <Zmage height={90} src={processedImage} />}
        </div>
    );
};

父组件调用


import CanvasWithRect from './CanvaswithRect'

....


<CanvasWithRect imageUrl={'xxx.jpg'} points={[{ x: 404, y: 285 }, { x: 474, y: 362 }]}></CanvasWithRect>

效果展示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值