Html 模拟背景大小:画布元素中的封面

Html 模拟背景大小:画布元素中的封面,html,html5-canvas,Html,Html5 Canvas,我有一个画布元素,它的大小是固定的。我想在画布中设置一个背景图像,它占据整个画布的高度和宽度,但图像保持其纵横比。由于图像和画布的纵横比不同,显然会有一些剪辑或部分图像不可见。当我处理div时,这很简单-我可以设置背景大小:cover 如何使用canvas元素实现相同的效果,可能是使用context.drawImage drawImage(image,0,0); 下面是一把小提琴,它显示了我想要发生的事情,以及我尝试使用css时发生的事情: 背景尺寸信息:如果需要封面-我创建了这个函数,当时

我有一个画布元素,它的大小是固定的。我想在画布中设置一个背景图像,它占据整个画布的高度和宽度,但图像保持其纵横比。由于图像和画布的纵横比不同,显然会有一些剪辑或部分图像不可见。当我处理div时,这很简单-我可以设置背景大小:cover

如何使用canvas元素实现相同的效果,可能是使用context.drawImage


drawImage(image,0,0);

下面是一把小提琴,它显示了我想要发生的事情,以及我尝试使用css时发生的事情:


背景尺寸信息:如果需要封面-

我创建了这个函数,当时有点头疼。但是,在任何情况下,都会按照您的要求,按比例缩放目标矩形内的图像,以填充整个空间

/**
 * By Ken Fyrstenberg
 *
 * drawImageProp(context, image [, x, y, width, height [,offsetX, offsetY]])
 *
 * If image and context are only arguments rectangle will equal canvas
*/
function drawImageProp(ctx, img, x, y, w, h, offsetX, offsetY) {

    if (arguments.length === 2) {
        x = y = 0;
        w = ctx.canvas.width;
        h = ctx.canvas.height;
    }

    /// default offset is center
    offsetX = offsetX ? offsetX : 0.5;
    offsetY = offsetY ? offsetY : 0.5;

    /// keep bounds [0.0, 1.0]
    if (offsetX < 0) offsetX = 0;
    if (offsetY < 0) offsetY = 0;
    if (offsetX > 1) offsetX = 1;
    if (offsetY > 1) offsetY = 1;

    var iw = img.width,
        ih = img.height,
        r = Math.min(w / iw, h / ih),
        nw = iw * r,   /// new prop. width
        nh = ih * r,   /// new prop. height
        cx, cy, cw, ch, ar = 1;

    /// decide which gap to fill    
    if (nw < w) ar = w / nw;
    if (nh < h) ar = h / nh;
    nw *= ar;
    nh *= ar;

    /// calc source rectangle
    cw = iw / (nw / w);
    ch = ih / (nh / h);

    cx = (iw - cw) * offsetX;
    cy = (ih - ch) * offsetY;

    /// make sure source rectangle is valid
    if (cx < 0) cx = 0;
    if (cy < 0) cy = 0;
    if (cw > iw) cw = iw;
    if (ch > ih) ch = ih;

    /// fill image in dest. rectangle
    ctx.drawImage(img, cx, cy, cw, ch,  x, y, w, h);
}
/**
*肯·菲尔斯滕伯格
*
*drawImageProp(上下文、图像[、x、y、宽度、高度[、偏移量x、偏移量]])
*
*若图像和上下文是唯一的参数,那个么矩形将等于画布
*/
函数drawImageProp(ctx、img、x、y、w、h、offsetX、offsetY){
if(arguments.length==2){
x=y=0;
w=ctx.canvas.width;
h=ctx.canvas.height;
}
///默认偏移量为“中心”
offsetX=offsetX?offsetX:0.5;
偏移量=偏移量?偏移量:0.5;
///保持界限[0.0,1.0]
如果(offsetX<0)offsetX=0;
如果(偏移量<0)偏移量=0;
如果(offsetX>1)offsetX=1;
如果(offsetY>1)offsetY=1;
var iw=img.width,
ih=img.高度,
r=数学最小值(w/iw,h/ih),
nw=iw*r,///新道具宽度
nh=ih*r,///新道具高度
cx,cy,cw,ch,ar=1;
///决定填补哪个空白
如果(nwiw)cw=iw;
如果(ch>ih)ch=ih;
///在目标矩形中填充图像
ctx.drawImage(img、cx、cy、cw、ch、x、y、w、h);
}

我创建了这个函数,当时它有点让人头疼。但是,在任何情况下,都会按照您的要求,按比例缩放目标矩形内的图像,以填充整个空间

/**
 * By Ken Fyrstenberg
 *
 * drawImageProp(context, image [, x, y, width, height [,offsetX, offsetY]])
 *
 * If image and context are only arguments rectangle will equal canvas
*/
function drawImageProp(ctx, img, x, y, w, h, offsetX, offsetY) {

    if (arguments.length === 2) {
        x = y = 0;
        w = ctx.canvas.width;
        h = ctx.canvas.height;
    }

    /// default offset is center
    offsetX = offsetX ? offsetX : 0.5;
    offsetY = offsetY ? offsetY : 0.5;

    /// keep bounds [0.0, 1.0]
    if (offsetX < 0) offsetX = 0;
    if (offsetY < 0) offsetY = 0;
    if (offsetX > 1) offsetX = 1;
    if (offsetY > 1) offsetY = 1;

    var iw = img.width,
        ih = img.height,
        r = Math.min(w / iw, h / ih),
        nw = iw * r,   /// new prop. width
        nh = ih * r,   /// new prop. height
        cx, cy, cw, ch, ar = 1;

    /// decide which gap to fill    
    if (nw < w) ar = w / nw;
    if (nh < h) ar = h / nh;
    nw *= ar;
    nh *= ar;

    /// calc source rectangle
    cw = iw / (nw / w);
    ch = ih / (nh / h);

    cx = (iw - cw) * offsetX;
    cy = (ih - ch) * offsetY;

    /// make sure source rectangle is valid
    if (cx < 0) cx = 0;
    if (cy < 0) cy = 0;
    if (cw > iw) cw = iw;
    if (ch > ih) ch = ih;

    /// fill image in dest. rectangle
    ctx.drawImage(img, cx, cy, cw, ch,  x, y, w, h);
}
/**
*肯·菲尔斯滕伯格
*
*drawImageProp(上下文、图像[、x、y、宽度、高度[、偏移量x、偏移量]])
*
*若图像和上下文是唯一的参数,那个么矩形将等于画布
*/
函数drawImageProp(ctx、img、x、y、w、h、offsetX、offsetY){
if(arguments.length==2){
x=y=0;
w=ctx.canvas.width;
h=ctx.canvas.height;
}
///默认偏移量为“中心”
offsetX=offsetX?offsetX:0.5;
偏移量=偏移量?偏移量:0.5;
///保持界限[0.0,1.0]
如果(offsetX<0)offsetX=0;
如果(偏移量<0)偏移量=0;
如果(offsetX>1)offsetX=1;
如果(offsetY>1)offsetY=1;
var iw=img.width,
ih=img.高度,
r=数学最小值(w/iw,h/ih),
nw=iw*r,///新道具宽度
nh=ih*r,///新道具高度
cx,cy,cw,ch,ar=1;
///决定填补哪个空白
如果(nwiw)cw=iw;
如果(ch>ih)ch=ih;
///在目标矩形中填充图像
ctx.drawImage(img、cx、cy、cw、ch、x、y、w、h);
}

我创建了这个函数,当时它有点让人头疼。但是,在任何情况下,都会按照您的要求,按比例缩放目标矩形内的图像,以填充整个空间

/**
 * By Ken Fyrstenberg
 *
 * drawImageProp(context, image [, x, y, width, height [,offsetX, offsetY]])
 *
 * If image and context are only arguments rectangle will equal canvas
*/
function drawImageProp(ctx, img, x, y, w, h, offsetX, offsetY) {

    if (arguments.length === 2) {
        x = y = 0;
        w = ctx.canvas.width;
        h = ctx.canvas.height;
    }

    /// default offset is center
    offsetX = offsetX ? offsetX : 0.5;
    offsetY = offsetY ? offsetY : 0.5;

    /// keep bounds [0.0, 1.0]
    if (offsetX < 0) offsetX = 0;
    if (offsetY < 0) offsetY = 0;
    if (offsetX > 1) offsetX = 1;
    if (offsetY > 1) offsetY = 1;

    var iw = img.width,
        ih = img.height,
        r = Math.min(w / iw, h / ih),
        nw = iw * r,   /// new prop. width
        nh = ih * r,   /// new prop. height
        cx, cy, cw, ch, ar = 1;

    /// decide which gap to fill    
    if (nw < w) ar = w / nw;
    if (nh < h) ar = h / nh;
    nw *= ar;
    nh *= ar;

    /// calc source rectangle
    cw = iw / (nw / w);
    ch = ih / (nh / h);

    cx = (iw - cw) * offsetX;
    cy = (ih - ch) * offsetY;

    /// make sure source rectangle is valid
    if (cx < 0) cx = 0;
    if (cy < 0) cy = 0;
    if (cw > iw) cw = iw;
    if (ch > ih) ch = ih;

    /// fill image in dest. rectangle
    ctx.drawImage(img, cx, cy, cw, ch,  x, y, w, h);
}
/**
*肯·菲尔斯滕伯格
*
*drawImageProp(上下文、图像[、x、y、宽度、高度[、偏移量x、偏移量]])
*
*若图像和上下文是唯一的参数,那个么矩形将等于画布
*/
函数drawImageProp(ctx、img、x、y、w、h、offsetX、offsetY){
if(arguments.length==2){
x=y=0;
w=ctx.canvas.width;
h=ctx.canvas.height;
}
///默认偏移量为“中心”
offsetX=offsetX?offsetX:0.5;
偏移量=偏移量?偏移量:0.5;
///保持界限[0.0,1.0]
如果(offsetX<0)offsetX=0;
如果(偏移量<0)偏移量=0;
如果(offsetX>1)offsetX=1;
如果(offsetY>1)offsetY=1;
var iw=img.width,
ih=img.高度,
r=数学最小值(w/iw,h/ih),
nw=iw*r,///新道具宽度
nh=ih*r,///新道具高度
cx,cy,cw,ch,ar=1;
///决定填补哪个空白
如果(nwiw)cw=iw;
如果(ch>ih)ch=ih;
///在目标矩形中填充图像
ctx.drawImage(img、cx、cy、cw、ch、x、y、w、h);
}

我创建了这个函数,当时它有点让人头疼。但是,在任何情况下,都会按照您的要求,按比例缩放目标矩形内的图像,以填充整个空间

/**
 * By Ken Fyrstenberg
 *
 * drawImageProp(context, image [, x, y, width, height [,offsetX, offsetY]])
 *
 * If image and context are only arguments rectangle will equal canvas
*/
function drawImageProp(ctx, img, x, y, w, h, offsetX, offsetY) {

    if (arguments.length === 2) {
        x = y = 0;
        w = ctx.canvas.width;
        h = ctx.canvas.height;
    }

    /// default offset is center
    offsetX = offsetX ? offsetX : 0.5;
    offsetY = offsetY ? offsetY : 0.5;

    /// keep bounds [0.0, 1.0]
    if (offsetX < 0) offsetX = 0;
    if (offsetY < 0) offsetY = 0;
    if (offsetX > 1) offsetX = 1;
    if (offsetY > 1) offsetY = 1;

    var iw = img.width,
        ih = img.height,
        r = Math.min(w / iw, h / ih),
        nw = iw * r,   /// new prop. width
        nh = ih * r,   /// new prop. height
        cx, cy, cw, ch, ar = 1;

    /// decide which gap to fill    
    if (nw < w) ar = w / nw;
    if (nh < h) ar = h / nh;
    nw *= ar;
    nh *= ar;

    /// calc source rectangle
    cw = iw / (nw / w);
    ch = ih / (nh / h);

    cx = (iw - cw) * offsetX;
    cy = (ih - ch) * offsetY;

    /// make sure source rectangle is valid
    if (cx < 0) cx = 0;
    if (cy < 0) cy = 0;
    if (cw > iw) cw = iw;
    if (ch > ih) ch = ih;

    /// fill image in dest. rectangle
    ctx.drawImage(img, cx, cy, cw, ch,  x, y, w, h);
}
/**
*肯·菲尔斯滕伯格
*
*drawImageProp(上下文、图像[、x、y、宽度、高度[、偏移量x、偏移量]])
*
*若图像和上下文是唯一的参数,那个么矩形将等于画布
*/
函数drawImageProp(ctx、img、x、y、w、h、offsetX、offsetY){
if(arguments.length==2){