Questions tagged «canvas»

画布是用于许多自由格式图形输出API的绘图表面的通用术语。将此标记与其他标记一起使用,这些标记指示正在与编程语言和目标环境一起使用的特定图形API:[android],[uwp],[wpf],[tkinter],[java],[html5], [chart.js]等。如果合适,还包括特定的画布标签,例如[android-canvas],[html5-canvas],[tkinter-canvas]。

5
地图平铺算法
地图 我使用Perlin噪声高度图使用Javascript创建基于图块的RPG,然后根据噪声的高度分配图块类型。 地图最终看起来像这样(在小地图视图中)。 我有一个相当简单的算法,它从图像上的每个像素中提取颜色值,并将其转换为整数(0-5),具体取决于其在(0-255)之间的位置,该位置对应于tile字典中的tile。然后将此200x200数组传递给客户端。 然后,引擎根据数组中的值确定切片并将其绘制到画布上。因此,我最终得到了具有逼真的外观的有趣世界:山脉,海洋等。 现在,我想做的下一件事是应用某种混合算法,如果邻居不是同一类型,它将导致瓦片无缝混合到其邻居中。上面的示例地图是玩家在小地图中看到的。在屏幕上,他们看到了用白色矩形标记的部分的渲染版本。其中图块是用其图像而不是单色像素渲染的。 这是用户在地图上看到的示例,但与上面的视口显示的位置不同! 我希望这种转变能够发生。 算法 我想出了一个简单的算法,该算法可以遍历视口中的地图,并在每个图块的顶部渲染另一个图像,前提是该图块位于不同类型的图块旁边。(不更改地图!仅渲染一些额外的图像。)该算法的想法是对当前图块的邻居进行剖析: 这是引擎可能必须渲染的示例场景,当前图块是标有X的图块。 创建了一个3x3数组,并读取了周围的值。因此,在本示例中,数组看起来像。 [ [1,2,2] [1,2,2] [1,1,2] ]; 然后,我的想法是针对可能的图块配置制定一系列案例。在非常简单的水平上: if(profile[0][1] != profile[1][1]){ //draw a tile which is half sand and half transparent //Over the current tile -> profile[1][1] ... } 得到以下结果: 这是从[0][1]到的过渡[1][1],但不是从[1][1]到的过渡[2][1],这里仍然存在硬性边缘。因此,我认为在那种情况下必须使用角砖。我创建了两个3x3的Sprite工作表,以为可以容纳所有可能需要的图块组合。然后,我为游戏中的所有图块复制了此图(白色区域是透明的)。每种类型的图块最终为16个图块(不使用每个Spritesheet上的中心图块。) 理想结果 因此,有了这些新的图块和正确的算法,示例部分将如下所示: 但是我所做的每一次尝试都失败了,算法中总是存在一些缺陷,并且模式最终变得很奇怪。我似乎无法正确处理所有情况,总的来说,这似乎是一种糟糕的做法。 一个办法? 因此,如果任何人都可以提供关于我如何创建此效果的替代解决方案,或者提供什么方向来编写分析算法,那么我将不胜感激!

7
HTML5画布100%宽度视口高度?
我正在尝试创建一个画布元素,该元素占用视口宽度和高度的100%。 您可以在我的示例中看到这种情况的发生,但是它正在Chrome和FireFox中添加滚动条。如何防止多余的滚动条,仅将窗口的宽度和高度设置为画布的大小?
151 jquery  html  canvas  viewport 


14
HTML5画布调整大小(缩小)图像的质量?
我使用html5 canvas元素在浏览器中调整图像大小。事实证明,质量很低。我发现了这一点:在缩放<canvas>时禁用插值,但它无助于提高质量。 下面是我的css和js代码,以及用Photoshop调用并在canvas API中缩放的图像。 在浏览器中缩放图像时,我该怎么做才能获得最佳质量? 注意:我想将大图像缩小为小图像,修改画布中的颜色并将结果从画布发送到服务器。 CSS: canvas, img { image-rendering: optimizeQuality; image-rendering: -moz-crisp-edges; image-rendering: -webkit-optimize-contrast; image-rendering: optimize-contrast; -ms-interpolation-mode: nearest-neighbor; } JS: var $img = $('<img>'); var $originalCanvas = $('<canvas>'); $img.load(function() { var originalContext = $originalCanvas[0].getContext('2d'); originalContext.imageSmoothingEnabled = false; originalContext.webkitImageSmoothingEnabled = false; originalContext.mozImageSmoothingEnabled = false; originalContext.drawImage(this, 0, 0, 379, 500); …

23
如何找到HTML画布上文本的高度?
规范中有一个context.measureText(text)函数,该函数将告诉您打印该文本需要多少宽度,但是我找不到找到其高度的方法。我知道它是基于字体的,但是我不知道将字体字符串转换为文本高度。
148 javascript  text  canvas 

10
如何使用canvas.toDataURL()将画布另存为图像?
我目前正在构建HTML5网络应用程序/ Phonegap本机应用程序,似乎无法弄清楚如何使用将画布保存为图像canvas.toDataURL()。有人可以帮我吗? 这是代码,这怎么了? //我的画布被命名为“ canvasSignature” JavaScript: function putImage() { var canvas1 = document.getElementById("canvasSignature"); if (canvas1.getContext) { var ctx = canvas1.getContext("2d"); var myImage = canvas1.toDataURL("image/png"); } var imageElement = document.getElementById("MyPix"); imageElement.src = myImage; } HTML5: <div id="createPNGButton"> <button onclick="putImage()">Save as Image</button> </div>


9
用requestAnimationFrame控制fps?
现在看来似乎requestAnimationFrame是事实上的动画方法。在大多数情况下,它对我来说效果很好,但是现在我正在尝试制作一些画布动画,我在想:是否有任何方法可以确保它以特定的fps运行?我了解到rAF的目的是使动画始终保持平滑,并且可能冒使动画不稳定的风险,但是现在看来它以任意不同的速度运行,我想知道是否有一种方法可以打击那不知何故。 我会用,setInterval但是我想要rAF提供的优化(尤其是在标签页处于焦点时自动停止)。 如果有人想看一下我的代码,那就差不多了: animateFlash: function() { ctx_fg.clearRect(0,0,canvasWidth,canvasHeight); ctx_fg.fillStyle = 'rgba(177,39,116,1)'; ctx_fg.strokeStyle = 'none'; ctx_fg.beginPath(); for(var i in nodes) { nodes[i].drawFlash(); } ctx_fg.fill(); ctx_fg.closePath(); var instance = this; var rafID = requestAnimationFrame(function(){ instance.animateFlash(); }) var unfinishedNodes = nodes.filter(function(elem){ return elem.timer < timerMax; }); if(unfinishedNodes.length === 0) { console.log("done"); cancelAnimationFrame(rafID); instance.animate(); } …

8
检测不支持HTML5 <canvas>的最佳方法
处理浏览器不支持HTML5 &lt;canvas&gt;标签的情况的标准方法是嵌入一些后备内容,例如: &lt;canvas&gt;Your browser doesn't support "canvas".&lt;/canvas&gt; 但是页面的其余部分保持不变,这可能是不合适的或令人误解的。我想要某种检测画布不受支持的方式,以便可以相应地显示页面的其余部分。你会推荐什么?

10
如何使用javascript HTML5 canvas通过N点绘制平滑曲线?
对于绘图应用程序,我将鼠标移动坐标保存到数组中,然后使用lineTo进行绘制。结果线不平滑。如何在所有收集的点之间生成一条曲线? 我已经用谷歌搜索过,但是我只发现了3个绘制线条的函数:对于2个采样点,只需使用lineTo。对于3个采样点quadraticCurveTo,对于4个采样点,bezierCurveTo。 (我尝试bezierCurveTo为阵列中的每4个点绘制一个,但是这导致每4个采样点出现扭结,而不是连续的平滑曲线。) 我该如何编写一个函数绘制5个采样点及更多的平滑曲线?

5
在HTML5画布上绘制SVG文件
是否有将SVG文件绘制到HTML5画布上的默认方法?Google Chrome支持将SVG加载为图像(并简单地使用drawImage),但是开发者控制台会对此进行警告resource interpreted as image but transferred with MIME type image/svg+xml。 我知道将SVG转换为canvas命令的可能性(就像在这个问题中一样),但是我希望这不是必需的。我不在乎较旧的浏览器(因此,如果FireFox 4和IE 9支持某些功能,那就足够了)。
130 html  canvas  svg 

7
如何将简单的onClick事件处理程序添加到canvas元素?
我是一位经验丰富的Java程序员,但是大约十年来第一次接触JavaScript / HTML5。我完全陷入了有史以来最简单的事情。 作为示例,我只想绘制一些东西并向其中添加一个事件处理程序。我确定我在做一些愚蠢的事情,但是我已经四处搜寻,没有任何建议(例如,此问题的答案: 添加onclick属性以使用JavaScript输入)。我正在使用Firefox 10.0.1。我的代码如下。您会看到多条注释行,每行的末尾都有关于发生(或未发生)的描述。 这里正确的语法是什么?我要疯了! &lt;html&gt; &lt;body&gt; &lt;canvas id="myCanvas" width="300" height="150"/&gt; &lt;script language="JavaScript"&gt; var elem = document.getElementById('myCanvas'); // elem.onClick = alert("hello world"); - displays alert without clicking // elem.onClick = alert('hello world'); - displays alert without clicking // elem.onClick = "alert('hello world!')"; - does nothing, even with clicking …

2
如何将一个画布的内容本地复制到另一个画布
我想复制一个画布上的所有内容,然后将它们全部转移到客户端上的所有内容。我想我会使用canvas.toDataURL()and context.drawImage()方法来实现这一点,但是我遇到了一些问题。 我的解决方案是将其获取Canvas.toDataURL()并存储在Javascript中的Image对象中,然后使用该context.drawImage()方法将其放回原处。 但是,我相信该toDataURL方法会返回一个带有64位编码标签的标签"data:image/png;base64,"。这似乎不是一个有效的标签,(我总是可以使用一些RegEx删除它),但是"data:image/png;base64,"子字符串之后的64位编码字符串是否是有效的图像?我可以说image.src=iVBORw...ASASDAS,然后将其画在画布上吗? 我看过一些相关的问题: 使用base64将画布图像从一个画布显示到另一个画布 但是解决方案似乎并不正确。
128 html  canvas 

5
缩放<canvas>时禁用插值
注意:这与放大时现有画布元素的呈现方式有关,而与线条或图形在画布表面上的呈现方式无关。换句话说,这与缩放元素的插值有关,而与在画布上绘制的图形的抗锯齿无关。我不关心浏览器如何画线;我关心的是浏览器在放大时如何渲染canvas元素本身。 是否可以通过编程更改画布属性或浏览器设置以在缩放&lt;canvas&gt;元素时禁用插值?跨浏览器的解决方案是理想的,但不是必需的。基于Webkit的浏览器是我的主要目标。性能非常重要。 这个问题最相似,但不能充分说明问题。对于它的价值,我尝试image-rendering: -webkit-optimize-contrast无济于事。 该应用程序将是用HTML5 + JS编写的“复古” 8位样式游戏,以明确我的需求。 为了说明,这是一个示例。(现场版) 假设我有一张21x21的画布... &lt;canvas id='b' width='21' height='21'&gt;&lt;/canvas&gt; ...具有CSS的元素使元素大5倍(105x105): canvas { border: 5px solid #ddd; } canvas#b { width: 105px; height: 105px; } /* 5 * 21 = 105 */ 我在画布上绘制一个简单的“ X”,如下所示: $('canvas').each(function () { var ctx = this.getContext("2d"); ctx.moveTo(0,0); ctx.lineTo(21,21); ctx.moveTo(0,21); ctx.lineTo(21,0); ctx.stroke(); …
126 javascript  html  canvas 

6
将three.js背景更改为透明或其他颜色
我一直在尝试将画布的默认背景颜色从黑色更改为透明/其他任何颜色-但没有运气。 我的HTML: &lt;canvas id="canvasColor"&gt; 我的CSS: &lt;style type="text/css"&gt; #canvasColor { z-index: 998; opacity:1; background: red; } &lt;/style&gt; 正如您在下面的在线示例中看到的那样,我在画布上附加了一些动画,因此不能仅执行不透明度:0; 在id上。 实时预览:http: //devsgs.com/preview/test/particle/ 任何想法如何覆盖默认黑色?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.