|
|
本帖最后由 马黑黑 于 2024-5-25 17:11 编辑
问题的关键在于canvas画布的 drawImage 方法上。用它完整的参数来裁切一定尺寸的源、再绘制到完整画布上。drawImage() 方法及其参数解释:
语法:
drawImage(image, sx, sy, swidth, sheight, x, y, width, height);
参数解释:
drawImage(源, 源剪切点X坐标, 源剪切点Y坐标, 源剪切到的宽度, 源剪切到的高度, 画布开始绘制点X坐标, 画布开始绘制点Y坐标, 画布画到的宽度, 画布画到的高度);
你的帖子中,如果你希望帖子尺寸是 1024*640 的尺寸,那么,在CSS中设计好帖子容器的宽高,在HTML代码中将canvas画布的宽高设置成和帖子容器一致的尺寸。然后你需要知道视频的原始尺寸(每一个视频都有自己的原始尺寸,和图片一样的原理),如果你不知道,也可以动态获取,这需要增加两个变量用以存储视频的宽高尺寸和一个获取视频尺寸的方法,以下代码就是这么做的:
- <style>
- #tiezi { position: relative; left: calc(50% - 81px); top: 60px; transform: translate(-50%); width: 1024px; height: 640px; }
- #vc { position: absolute; left: 0; top: 0; background: lightblue; border: 1px solid gray; box-shadow: 2px 2px 4px gray; }
- #vid { opacity: 0; }
- #player { position: absolute; left: 240px; top: 260px; cursor: pointer; filter: drop-shadow(0 0 16px lightblue) opacity(.99); animation: rot 2.2s linear infinite alternate var(--state); }
- @keyframes rot { from { opacity: 0.9; transform: rotate(0) skew(-5deg) translate(0,0); } to { opacity: 0.2; transform: rotate(-16deg) skew(5deg) translate(20px,0px); } }
- </style>
- <div id="tiezi">
- <video id="vid" src="https://img.tukuppt.com/video_show/2629112/00/02/22/5b5874e61640f.mp4" loop muted></video>
- <audio id="aud" src="https://music.163.com/song/media/outer/url?id=1992058764" autoplay loop></audio>
- <canvas id="vc" width="1024" height="640" style="border: 1px solid red"></canvas>
- <img id="player" src="https://pic.imgdb.cn/item/66515bced9c307b7e95991ce.png" alt="" title="播放/暂停" />
- </div>
- <script>
- var ctx = vc.getContext('2d');
- //ww和hh是画布的宽高,vw和vh是video实际宽高
- var ww = vc.width, hh = vc.height, vw, vh;
- var raf = null;
- //视频可以播放时获取视频实际宽高尺寸
- vid.oncanplay = () => {
- vw = vid.videoWidth;
- vh = vid.videoHeight;
- };
- aud.onplaying = aud.onpause = () => {
- aud.paused ? vid.pause() : vid.play();
- tiezi.style.setProperty('--state', aud.paused ? 'paused' : 'running');
- vDraw();
- };
- aud.onseeked = () => cancelAnimationFrame(raf);
- var vDraw = () => {
- //绘制视频时裁切视频并绘制到完整画布尺寸上
- ctx.drawImage(vid, 0, 45, vw, vh - 45, 0, 0, ww, hh);
- aud.paused ? cancelAnimationFrame(raf) : raf = requestAnimationFrame(vDraw);
- };
- player.onclick = () => aud.paused ? aud.play() : aud.pause();
- </script>
复制代码
|
评分
-
| 参与人数 2 | 威望 +80 |
金钱 +160 |
经验 +80 |
收起
理由
|
红影
| + 50 |
+ 100 |
+ 50 |
赞一个! |
南无月
| + 30 |
+ 60 |
+ 30 |
很给力! |
查看全部评分
|