canvas

105 阅读2分钟

原生

1、 canvas的宽高设置:

canvas的本身画布大小是通过canvas标签中的width和height来设置的,如果同时对其css样式进行设置,会对canvas进行缩放;类似把一张图片进行处理,会把canvas标签中的尺寸缩放到css设置的尺寸;所以最好是通过标签属性设置尺寸,不用设置css的尺寸;

2、 canvas宽高改变后,画布上的内容会被清空

这时候我们需要重新绘制画布:使用getImageData将画布内容复制一份,然后在改变尺寸之后使用putImageData方法,将内容放回去;
ctx.getImageData(x,y,width,height);
返回值:imgData:[A.r,A.g,A.b,B.r,B.g,B.b]

image.png

var imgData=ctx.createImageData(100,100);
ctx.putImageData(imgData,x,y,dirtyX,dirtyY,dirtyWidth,dirtyHeight);

image.png

3.canvas加载图片:用public/static中的图片可以成功,用其他地方的会报错,显示找不到图片

`ctx = title.value.getContext('2d');
var image=new Image();
image.src='./static/images/下一步.png';            
image.onload=function(){
    Ctx.drawImage(image,0,0,50,50);
};
`

4.图像合成:两张图片叠加:原理是同一个位置drawImage两次

image.png

5.使用canvas将gif变成静图:canvas.toDataURL('image/png')

image.png

image.png

6.使用 svgManager 对 GIF 图片进行播放和暂停管理。

GIF 播放时显示动态效果,暂停时显示静态第一帧。

<svg
    xmlns="http://www.w3.org/2000/svg"
    preserveAspectRatio="xMidYMid meet"
    style="width: 100%; height: 100%"
    viewBox="0 0 1500 840"
    ref="svgDom"
>
    <image
        x="0"
        y="0"
        width="1500"
        height="840"
        :href="params.imgUrl"
        ref="gifImage"
    ></image>
</svg>

let svgManager = {
    init() {
        let img = new Image(); // 创建一个新的图像对象
        img.src = params.imgUrl; // 设置图像的来源 URL
        this.playUrl = img.src; // 保存 GIF 的播放 URL
        img.onload = () => { // 图片加载完成后执行
            this.canvas = document.createElement("canvas"); // 创建一个 Canvas
            this.ctx = this.canvas.getContext("2d"); // 获取 Canvas 的 2D 上下文
            this.canvas.setAttribute("width", img.width); // 设置 Canvas 宽度为图片宽度
            this.canvas.setAttribute("height", img.height); // 设置 Canvas 高度为图片高度
            this.ctx.drawImage(img, 0, 0); // 将图片绘制到 Canvas 上
            this.stopUrl = this.canvas.toDataURL('image/png'); // 将 Canvas 内容转换为 PNG 格式的 Base64 URL
            this.stop(); // 默认调用 `stop()` 方法,显示静态图片

    },
    play() {
            gifImage.value.setAttribute('href', this.playUrl); 
            // 将 `<image>` 元素的 `href` 设置为 GIF 的播放 URL
     },
   stop() { 
       gifImage.value.setAttribute('href', this.canvas.toDataURL('image/png')); 
       // 将 `<image>` 的 `href` 设置为 PNG 格式的静态图片 URL 
   }
};

onMounted(() => {
    svgManager.init();
    const observer = new ResizeObserver(() => svgSize.update());
    observer.observe(document.querySelector(".container"));
});