Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 缩小画布的比例越来越重要_Javascript_Css_Html_Canvas_Drawimage - Fatal编程技术网

Javascript 缩小画布的比例越来越重要

Javascript 缩小画布的比例越来越重要,javascript,css,html,canvas,drawimage,Javascript,Css,Html,Canvas,Drawimage,向上缩放画布似乎效果不错,但向下缩放似乎会切断像素。我尝试过在不使用内存画布的情况下移动事物的顺序,但没有任何效果。我最好的猜测是画布正在缩小,然后进一步缩小,因此画布数据没有覆盖整个画布大小 // Create a newly scaled canvas from the original and then delete the original. function ScaleCanvas(width, height, xScale, yScale) { // Get the true ov

向上缩放画布似乎效果不错,但向下缩放似乎会切断像素。我尝试过在不使用内存画布的情况下移动事物的顺序,但没有任何效果。我最好的猜测是画布正在缩小,然后进一步缩小,因此画布数据没有覆盖整个画布大小

// Create a newly scaled canvas from the original and then delete the original.
function ScaleCanvas(width, height, xScale, yScale) {

// Get the true overlay's current image data.
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);

// Create an in-memory canvas at the new resolution.
const newCanvas = $("<canvas>")
    .attr("width", width)
    .attr("height", height)[0];

// Draw the true overlay's image data into the in-memory canvas.
newCanvas.getContext("2d").putImageData(imageData, 0, 0);

// Update the size/resolution of the true overlay.
ctx.canvas.width = width;
ctx.canvas.height = height;

// Scale the true overlay's context.
ctx.scale(xScale, yScale);

// Draw the in-memory canvas onto the true overlay.
ctx.drawImage(newCanvas, 0, 0);
}
//从原始画布创建新缩放的画布,然后删除原始画布。
函数ScaleCanvas(宽度、高度、xScale、yScale){
//获取真实覆盖的当前图像数据。
const imageData=ctx.getImageData(0,0,canvas.width,canvas.height);
//以新分辨率创建内存画布。
常量newCanvas=$(“”)
.attr(“宽度”,宽度)
.attr(“高度”,高度)[0];
//将真实覆盖的图像数据绘制到内存画布中。
newCanvas.getContext(“2d”).putImageData(imageData,0,0);
//更新真实叠加的大小/分辨率。
ctx.canvas.width=宽度;
ctx.canvas.height=高度;
//缩放真实覆盖的上下文。
ctx.刻度(xScale,yScale);
//将内存画布绘制到真正的覆盖上。
ctx.drawImage(newCanvas,0,0);
}
这里有一个相关的问题,我从中得到了大部分逻辑:

画布在函数结束时具有适当的分辨率/大小,但考虑到一些像素是透明的,而另一些像素是不透明的黑色,很明显,缩小画布右侧和底部的像素没有产生所需的效果

更新
下面是一个更好地说明这个问题的例子。注意,在画布缩小后,一个透明像素不会停留在画布的中间。

< P>我没有复制,所以我也尝试放大和缩小画布,用下面的代码看起来一切都很好:

HTML:

结果:

希望能有所帮助

编辑(2018年2月6日):

我不确定是否很了解你的问题。如果我是正确的,当您调整画布的大小时,内容不会相应地调整大小。因此,在调整大小后,中心的某些内容可能不会显示在它应该显示的位置,而它必须位于调整大小的内容的中心,以便保持原始比例。 为了说明,我在中间添加了一个中等大小的红场(比透明像素更明显):

调整大小之前:

调整大小后:

事实上,要实现缩小规模,您需要编辑ScaleCanvas调用:

由此:

ScaleCanvas(75, 75, .75, .75);
为此:

ScaleCanvas(100, 100, .75, .75);
只更新比率,而不更新画布的大小

以下是您得到的:

调整大小之前:

调整大小后:

这是小提琴:

我希望我已经很好地理解了你的问题,并且这解决了它。其他注释如下:)

编辑(2018年2月13日):


好的,如果要同时调整画布及其内容的大小,ScaleCanvas函数中新创建的画布必须与初始画布的大小相同。我更新了小提琴,以便您可以以50%的比例多次调整画布的大小:。请注意画布的红色边框,它显示画布的大小也减小了(不仅仅是视觉内容)。

我没有复制,所以我也尝试了向上和向下缩放画布,使用以下代码,一切看起来都很好:

HTML:

结果:

希望能有所帮助

编辑(2018年2月6日):

我不确定是否很了解你的问题。如果我是正确的,当您调整画布的大小时,内容不会相应地调整大小。因此,在调整大小后,中心的某些内容可能不会显示在它应该显示的位置,而它必须位于调整大小的内容的中心,以便保持原始比例。 为了说明,我在中间添加了一个中等大小的红场(比透明像素更明显):

调整大小之前:

调整大小后:

事实上,要实现缩小规模,您需要编辑ScaleCanvas调用:

由此:

ScaleCanvas(75, 75, .75, .75);
为此:

ScaleCanvas(100, 100, .75, .75);
只更新比率,而不更新画布的大小

以下是您得到的:

调整大小之前:

调整大小后:

这是小提琴:

我希望我已经很好地理解了你的问题,并且这解决了它。其他注释如下:)

编辑(2018年2月13日):


好的,如果要同时调整画布及其内容的大小,ScaleCanvas函数中新创建的画布必须与初始画布的大小相同。我更新了小提琴,以便您可以以50%的比例多次调整画布的大小:。请注意画布的红色边框,这表明画布的尺寸也减小了(不仅仅是视觉内容)。

谢谢您的帮助。这里有一个jsfiddle可以更好地说明这个问题。请注意,透明像素在缩小尺寸@ M4GIK之后如何仍然不在中间。谢谢您的小提琴,我编辑了我以前的答案,实际上,这似乎产生了99%的预期效果。如果以这种方式缩小画布,那么画布元素的实际宽度和高度仍然是原始的较大尺寸。有没有办法在保持相同的行为的同时也调整画布的大小?@m4gik我编辑了我的编辑:>我希望这就是你想要的!开心开心开心开心开心开心开心开心开心开心谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!谢谢你的帮助。这里有一个jsfiddle可以更好地说明这个问题。请注意,透明像素在缩小尺寸@ M4GIK之后如何仍然不在中间。谢谢您的小提琴,我编辑了我以前的答案,实际上,这似乎产生了99%的预期效果。如果您以这种方式缩小画布,那么画布元素的实际宽度和高度仍然保持不变