鱼C论坛

 找回密码
 立即注册
查看: 4442|回复: 6

[已解决]canvas绘制图片到多边形

[复制链接]
发表于 2020-11-23 09:58:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我希望要让一个图片绘制在canvas的一个多边形上,可是似乎CanvasRenderingContext2D的绘制图片的接口只有矩形的,应该怎么做呢?
最佳答案
2023-11-26 03:19:02
小甲鱼的二师兄 发表于 2023-11-26 03:18
@FishC_GPT 我希望要让一个图片绘制在canvas的一个多 ...

你可以使用一种称为纹理映射(Texture Mapping)的技术,在一个多边形上绘制图片。下面是一个使用JavaScript和Canvas进行纹理映射的示例代码:
  1. // 获取Canvas元素和绘图上下文
  2. var canvas = document.getElementById('myCanvas');
  3. var ctx = canvas.getContext('2d');
  4. // 创建一个多边形的路径
  5. ctx.beginPath();
  6. ctx.moveTo(100, 100); // 第一个顶点
  7. ctx.lineTo(200, 150); // 第二个顶点
  8. ctx.lineTo(150, 250); // 第三个顶点
  9. ctx.closePath();
  10. // 填充多边形
  11. ctx.fillStyle = '#FF0000';
  12. ctx.fill();
  13. // 创建一个图片元素
  14. var img = new Image();
  15. img.src = 'image.png'; // 替换成你的图片路径
  16. // 在图片加载完成后执行绘制操作
  17. img.onload = function() {
  18.   // 首先保存当前的绘图状态
  19.   ctx.save();
  20.   // 开始裁剪出多边形的区域
  21.   ctx.beginPath();
  22.   ctx.moveTo(100, 100); // 第一个顶点
  23.   ctx.lineTo(200, 150); // 第二个顶点
  24.   ctx.lineTo(150, 250); // 第三个顶点
  25.   ctx.closePath();
  26.   ctx.clip();
  27.   // 绘制图片,让图片填充在多边形的区域内
  28.   ctx.drawImage(img, 100, 100);
  29.   // 恢复之前保存的绘图状态,避免影响后续绘制
  30.   ctx.restore();
  31. }
复制代码

请将代码中的 `myCanvas` 替换为你实际使用的Canvas元素的 ID,并将 `image.png` 替换为你要绘制的图片路径。这段代码首先绘制一个红色的多边形,然后使用 `drawImage` 方法在多边形内部绘制图片。

注意,这里的多边形是通过绘制路径的方式定义的,你可以根据自己的需求来修改多边形的顶点坐标。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-11-23 10:18:26 | 显示全部楼层
  1. <canvas id='c'>
  2. <script>
  3. const ctx = c.getContext("2d")
  4. ctx.beginPath()
  5. ctx.lineWidth = 10
  6. ctx.strokeStyle="green"
  7. ctx.lineCap="round"
  8. ctx.moveTo(20,20)
  9. ctx.lineTo(20,100)
  10. ctx.lineTo(80,100)
  11. ctx.closePath()
  12. ctx.stroke()
  13. </script>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-23 20:59:11 | 显示全部楼层

我要图片画到多边形上,不是要画一个多边形
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-26 03:18:47 | 显示全部楼层
@FishC_GPT 我希望要让一个图片绘制在canvas的一个多边形上,可是似乎CanvasRenderingContext2D的绘制图片的接口只有矩形的,应该怎么做呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-26 03:19:02 | 显示全部楼层    本楼为最佳答案   
小甲鱼的二师兄 发表于 2023-11-26 03:18
@FishC_GPT 我希望要让一个图片绘制在canvas的一个多 ...

你可以使用一种称为纹理映射(Texture Mapping)的技术,在一个多边形上绘制图片。下面是一个使用JavaScript和Canvas进行纹理映射的示例代码:
  1. // 获取Canvas元素和绘图上下文
  2. var canvas = document.getElementById('myCanvas');
  3. var ctx = canvas.getContext('2d');
  4. // 创建一个多边形的路径
  5. ctx.beginPath();
  6. ctx.moveTo(100, 100); // 第一个顶点
  7. ctx.lineTo(200, 150); // 第二个顶点
  8. ctx.lineTo(150, 250); // 第三个顶点
  9. ctx.closePath();
  10. // 填充多边形
  11. ctx.fillStyle = '#FF0000';
  12. ctx.fill();
  13. // 创建一个图片元素
  14. var img = new Image();
  15. img.src = 'image.png'; // 替换成你的图片路径
  16. // 在图片加载完成后执行绘制操作
  17. img.onload = function() {
  18.   // 首先保存当前的绘图状态
  19.   ctx.save();
  20.   // 开始裁剪出多边形的区域
  21.   ctx.beginPath();
  22.   ctx.moveTo(100, 100); // 第一个顶点
  23.   ctx.lineTo(200, 150); // 第二个顶点
  24.   ctx.lineTo(150, 250); // 第三个顶点
  25.   ctx.closePath();
  26.   ctx.clip();
  27.   // 绘制图片,让图片填充在多边形的区域内
  28.   ctx.drawImage(img, 100, 100);
  29.   // 恢复之前保存的绘图状态,避免影响后续绘制
  30.   ctx.restore();
  31. }
复制代码

请将代码中的 `myCanvas` 替换为你实际使用的Canvas元素的 ID,并将 `image.png` 替换为你要绘制的图片路径。这段代码首先绘制一个红色的多边形,然后使用 `drawImage` 方法在多边形内部绘制图片。

注意,这里的多边形是通过绘制路径的方式定义的,你可以根据自己的需求来修改多边形的顶点坐标。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-26 03:20:08 | 显示全部楼层
FishC_GPT 发表于 2023-11-26 03:19
你可以使用一种称为纹理映射(Texture Mapping)的技术,在一个多边形上绘制图片。下面是一个使用JavaScr ...

还有其它方法可以实现吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-26 03:20:26 | 显示全部楼层
小甲鱼的二师兄 发表于 2023-11-26 03:20
还有其它方法可以实现吗?

除了使用纹理映射(Texture Mapping)之外,还有一种方法可以将图片绘制在多边形上,那就是使用图像剪切(Image Clipping)的方式。

通过使用 `clip()` 方法可以剪切出一个特定形状的区域,然后再在该区域内绘制图片。下面是一个示例代码:
  1. // 获取Canvas元素和绘图上下文
  2. var canvas = document.getElementById('myCanvas');
  3. var ctx = canvas.getContext('2d');
  4. // 创建一个多边形的路径
  5. ctx.beginPath();
  6. ctx.moveTo(100, 100); // 第一个顶点
  7. ctx.lineTo(200, 150); // 第二个顶点
  8. ctx.lineTo(150, 250); // 第三个顶点
  9. ctx.closePath();
  10. // 使用clip()方法剪切出多边形的区域
  11. ctx.clip();
  12. // 创建一个图片元素
  13. var img = new Image();
  14. img.src = 'image.png'; // 替换成你的图片路径
  15. // 在图片加载完成后执行绘制操作
  16. img.onload = function() {
  17.   // 绘制图片,在剪切区域内部进行绘制
  18.   ctx.drawImage(img, 100, 100);
  19. }
复制代码

以上代码首先绘制了一个多边形路径,然后使用 `clip()` 方法剪切出了多边形的区域。接着加载了一张图片,并在图片加载完成后使用 `drawImage()` 方法将图片绘制在剪切区域内部。

请将代码中的 `myCanvas` 替换为你实际使用的Canvas元素的 ID,并将 `image.png` 替换为你要绘制的图片路径。

希望这种方法对你有所帮助!

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-13 23:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表