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