【问题标题】:HTML5 Canvas background imageHTML5 画布背景图片
【发布时间】:2012-12-10 08:52:05
【问题描述】:

我试图在我找到的这个画布脚本的背面放置一个背景图像。我知道这与 context.fillstyle 有关,但不知道如何去做。我希望那行能读到这样的内容:

context.fillStyle = "url('http://www.samskirrow.com/background.png')";

这是我当前的代码:

var waveform = (function() {

var req = new XMLHttpRequest();
req.open("GET", "js/jquery-1.6.4.min.js", false);
req.send();
eval(req.responseText);
req.open("GET", "js/soundmanager2.js", false);
req.send();
eval(req.responseText);
req.open("GET", "js/soundcloudplayer.js", false);
req.send();
eval(req.responseText);
req.open("GET", "js/raf.js", false);
req.send();
eval(req.responseText);

// soundcloud player setup

soundManager.usePolicyFile = true;
soundManager.url = 'http://www.samskirrow.com/client-kyra/js/';
soundManager.flashVersion = 9;
soundManager.useFlashBlock = false;
soundManager.debugFlash = false;
soundManager.debugMode = false;
soundManager.useHighPerformance = true;
soundManager.wmode = 'transparent';
soundManager.useFastPolling = true;
soundManager.usePeakData = true;
soundManager.useWaveformData = true;
soundManager.useEqData = true;

var clientID = "345ae40b30261fe4d9e6719f6e838dac";
var playlistUrl = "https://soundcloud.com/kyraofficial/sets/kyra-ft-cashtastic-good-love";

var waveLeft = [];
var waveRight = [];

// canvas animation setup
var canvas;
var context;

function init(c) {
    canvas = document.getElementById(c);
    context = canvas.getContext("2d");
    soundManager.onready(function() {
        initSound(clientID, playlistUrl);
    });
    aniloop();
}

function aniloop() {
    requestAnimFrame(aniloop);
    drawWave();
}

function drawWave() {
    
    var step = 10;
    var scale = 60;
    
    // clear
    context.fillStyle = "#ff19a7";
    context.fillRect(0, 0, canvas.width, canvas.height);
    
    // left wave
    context.beginPath();
            
    for ( var i = 0; i < 256; i++) {
        
        var l = (i/(256-step)) * 1000;
        var t = (scale + waveLeft[i] * -scale);
        
        if (i == 0) {
        context.moveTo(l,t);
        } else {
        context.lineTo(l,t); //change '128' to vary height of wave, change '256' to move wave up or down.
    }
    }
    
    context.stroke();


    // right wave
    context.beginPath();
    context.moveTo(0, 256);
    for ( var i = 0; i < 256; i++) {
        
        context.lineTo(4 * i, 255 + waveRight[i] * 128.);
    }
    context.lineWidth = 0.5;
    context.strokeStyle = "#000";
    context.stroke();
}

function updateWave(sound) {
    waveLeft = sound.waveformData.left;
}

return {
    init : init
};
})();

修改后的代码 - 目前只显示黑色作为背景,而不是图像:

// canvas animation setup
var backgroundImage = new Image(); 
backgroundImage.src = 'http://www.samskirrow.com/images/main-bg.jpg'; 
var canvas;
var context;

function init(c) {
    canvas = document.getElementById(c);
    context = canvas.getContext("2d");
    soundManager.onready(function() {
        initSound(clientID, playlistUrl);
    });
    aniloop();
}

function aniloop() {
    requestAnimFrame(aniloop);
    drawWave();
}

function drawWave() {
    
    var step = 10;
    var scale = 60;
    
    // clear
    context.drawImage(backgroundImage, 0, 0);
    context.fillRect(0, 0, canvas.width, canvas.height);
    
    // left wave
    context.beginPath();
            
    for ( var i = 0; i < 256; i++) {
        
        var l = (i/(256-step)) * 1000;
        var t = (scale + waveLeft[i] * -scale);
        
        if (i == 0) {
        context.moveTo(l,t);
        } else {
        context.lineTo(l,t); //change '128' to vary height of wave, change '256' to move wave up or down.
    }
    }
    
    context.stroke();


    // right wave
    context.beginPath();
    context.moveTo(0, 256);
    for ( var i = 0; i < 256; i++) {
        
        context.lineTo(4 * i, 255 + waveRight[i] * 128.);
    }
    context.lineWidth = 0.5;
    context.strokeStyle = "#ff19a7";
    context.stroke();
}

function updateWave(sound) {
    waveLeft = sound.waveformData.left;
}

return {
    init : init
};
})();

【问题讨论】:

  • context.fillStyle 只接受字符串,CanvasGradientCanvasPattern 对象,字符串被解析为 CSS 颜色值。如果要在画布上绘制图像,请创建一个 Image 对象,并将源设置为所需图像的 URL,然后只需使用 context.drawImage。如果您在 drawWave 中的任何其他内容之前绘制图像,那么当您清除画布时,您就有了背景。
  • 感谢@Rikonator,我的脚本不是那么好,您能否详细说明我将如何实现您的观点??
  • @Loktar 已经回答了,我没有什么要补充的,但无论如何这里有一个活动动画:jsfiddle.net/vZ8UT
  • 感谢您花时间做那个演示@Rikonator,我修改过的代码在上面,目前只显示黑色背景 - 不是图像。有什么想法吗?
  • context.drawImage 之后立即删除context.fillRect。如果您在绘制图像后使用fillRect,您实际上是在使用默认填充样式背景图像上填充画布大小的矩形,从而破坏了绘制图像的要点。跨度>

标签: html canvas html5-canvas computer-science


【解决方案1】:

有几种方法可以做到这一点。您可以为当前正在处理的画布添加背景,如果不重新绘制画布,则每个循环都可以。否则,您可以在主画布下方制作第二个画布并为其绘制背景。最后一种方法是只使用放置在画布下的标准&lt;img&gt; 元素。要在画布元素上绘制背景,您可以执行以下操作:

Live Demo

var canvas = document.getElementById("canvas"),
    ctx = canvas.getContext("2d");

canvas.width = 903;
canvas.height = 657;


var background = new Image();
background.src = "http://www.samskirrow.com/background.png";

// Make sure the image is loaded first otherwise nothing will draw.
background.onload = function(){
    ctx.drawImage(background,0,0);   
}

// Draw whatever else over top of it on the canvas.

【讨论】:

  • 非常感谢@Loktar 我快接近了,虽然目前它只是显示黑色作为背景。我已经编辑了上面的代码以显示我添加的内容。
  • 您能具体说明不同方法的优缺点吗?
  • 很好,如何在fabric js上做到这一点?
【解决方案2】:

Canvas 不使用 .png 文件作为背景图像。更改为 gif 或 jpg 等其他文件扩展名也可以正常工作。

【讨论】:

  • 请提供解释
【解决方案3】:

你为什么不把它设计出来:

<canvas id="canvas" width="800" height="600" style="background: url('./images/image.jpg')">
  Your browser does not support the canvas element.
</canvas>

【讨论】:

  • 这适用于所有现代浏览器吗?我听说它在 IE 中不起作用,但找不到任何证据。
【解决方案4】:

确保万一您的图像不在 dom 中,并且您从本地目录或服务器获取它,您应该等待图像加载,然后在画布上绘制它。

类似的东西:

function drawBgImg() {
    let bgImg = new Image();
    bgImg.src = '/images/1.jpg';
    bgImg.onload = () => {
        gCtx.drawImage(bgImg, 0, 0, gElCanvas.width, gElCanvas.height);
    }
}

【讨论】:

    猜你喜欢
    • 2012-04-02
    • 2015-03-18
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2014-01-07
    • 1970-01-01
    相关资源
    最近更新 更多