CanvasRenderingContext2D.createPattern()

createPattern()方法是为元素在指定的方向上设置重复模式的方法,(通俗些讲就是在画布中设置元素的平铺模式),此方法返回一个CanvasPattern对象,语法如下:

ctx.createPattern(image, repetition);

image: 做为重复图像源的 CanvasImageSource 对象。可以是下列之一:
1. HTMLImageElement (),
2. HTMLVideoElement (),
3. HTMLCanvasElement (),
4. CanvasRenderingContext2D,
5. ImageBitmap,
6. ImageData, or a
7. Blob.

repeat: 指定如何重复图像,允许的值为:
1. “repeat” (如果是“”或者null时,默认为该值)
2. “repeat-x”
3. “repeat-y”
4. “no-repeat”

以图片为实例进行说明下:
HTML部分代码:

<canvas id="canvas" width="600" height="480" style="border: 1px #ccc dashed;" onclick="drawImg();"></canvas>

js部分代码:


var count = 0; // 统计鼠标点击次数
var canvas = document.querySelector("canvas"), ctx = canvas.getContext("2d");
function drawImg(){
    var strPrnType = "";
    count++;
    count = (count == 5) ? 1 : count;
    switch(count) {
        case 1: strPrnType = "no-repeat"; break;   
        case 2: strPrnType = "repeat-x"; break;
        case 3: strPrnType = "repeat-y"; break;
        case 4: strPrnType = "repeat"; break;
    }
    ctx.clearRect(0,0, canvas.width, canvas.height);
    var img = new Image();
    img.src = "http://yanyuans.com/demo/images/mg.png";
    var prn = ctx.createPattern(img, strPrnType);
    img.onload = function(){
        ctx.fillStyle = prn;
        ctx.fillRect(0,0, canvas.width, canvas.height);
    }
}

createPattern()第一个参数可以是图片也可以是canvas等等,下面以canvas为例:
HTML部分:

<canvas id="canvas" width="600" height="480" style="border: 1px #ccc dashed;" onclick="drawImg();"></canvas>

js部分:

var canvas = document.querySelector("canvas"), ctx = canvas.getContext("2d"); 
var pattern = document.createElement('canvas');
pattern.width = 40;
pattern.height = 40;
var pctx = pattern.getContext('2d');
pctx.fillStyle = "rgb(188, 222, 178)";
pctx.fill();

var pattern = ctx.createPattern(pattern, "repeat");
ctx.rect(0,0,200,200);
ctx.fillStyle = pattern;
ctx.fill();
### 关于 `CanvasRenderingContext2D.createPattern` 报错的原因分析 当调用 `CanvasRenderingContext2D.createPattern` 方法时,如果传入的图像参数宽度或高度为 0,则会触发错误。这是因为该方法依赖有效的图像资源作为输入,而宽高为零意味着图像未被正确加载或者其尺寸不符合预期。 #### 原因解析 1. **图像未完全加载** 如果传递给 `createPattern` 的是一个 HTMLImageElement 对象(即 `<img>` 元素),但在调用此方法之前图片尚未完成加载,则可能会导致宽高为 0 的情况发生[^3]。 2. **无效的图像源** 当尝试创建模式所使用的图像路径不存在、损坏或是跨域请求失败时,也会返回一个无法正常渲染的对象,从而引发类似的错误[^1]。 3. **动态生成的内容问题** 若图案来源于另一个画布 (Canvas),则需确认目标 Canvas 已经填充了适当的数据并设置了合理的大小。任何一步缺失都可能导致最终获取到的是空白或无实际像素数据的结果[^2]。 #### 解决方案 以下是几种可能解决问题的方法: 1. **确保图像已成功加载后再操作** 使用事件监听器等待图片加载完毕再执行后续逻辑: ```javascript const img = new Image(); img.onload = function () { const ctx = document.getElementById('myCanvas').getContext('2d'); const pattern = ctx.createPattern(img, 'repeat'); // 创建平铺样式 ctx.fillStyle = pattern; ctx.fillRect(0, 0, 400, 400); }; img.src = 'path/to/image.png'; // 设置合法且可访问的URL地址 ``` 2. **处理跨域资源共享(CORS)** 需要服务器端支持 CORS 请求头设置允许来自特定域名甚至通配符(*)的所有请求。对于前端开发者来说可以这样配置你的 image 加载过程: ```javascript var img = new Image(); img.crossOrigin = ""; // 或者指定具体站点 "anonymous" img.src = url; ``` 3. **验证 Canvas 数据状态** 在基于现有 canvas 构建新图案前先检查原始 canvas 是否含有有效内容以及它的维度是否合理大于零: ```javascript let sourceCtx = anotherCanvas.getContext("2d"); if(sourceCtx && anotherCanvas.width > 0 && anotherCanvas.height > 0){ mainContext.createPattern(anotherCanvas,'no-repeat'); }else{ console.error("Source canvas is invalid or empty."); } ``` 以上措施能够帮助规避由于不恰当初始化引起的异常状况,并保障程序运行稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值