我对不同浏览器如何在 HTML5 Canvas 上呈现字体大小有疑问。特别是字体大小不是整数的地方。例如“8.5px 宋体”、“2.23em 宋体”等。
for canvas.font=FontSize + "px Arial";其中 FontSize 是 (8.1, 8.2, 8.3, ...) 我希望得到一个线性结果,但是唯一一致存档的浏览器是 IE ! ( 我知道 )。 Firefox 在 11.2px 以下四舍五入,但超过 11.2px 是线性的。 Chrome 和 Safari 仅将字体缩放为整数值。
舍入规则似乎设置为像素并向下舍入到最接近的小于 .5 的整数
我的 Canvas 应用程序正在执行一些程序化的动画转换(缩放和平移)试图避免 Canvas 转换以提高效率,虽然我怀疑它会解决问题,但我也没有通过设置 html 文本大小来测试这个CSS3(根据规范,Canvas.font 应该基于)
浏览器至少在 pt、px、em 和 % 字体大小之间的行为是一致的。 [编辑:除了 Safari 不呈现 % 大小]
[ 旁白:所有字体一旦放大一点,就会显得有点粗体。当我们从 17.4px 到 17.5px 时,Safari 接管了这 block 蛋糕.. BAMB!]
我在下面附上了一些示例图片,但我真的很想知道如何让所有浏览器更像 IE 的一些想法(再一次没想过我会这么说)- 这是一个错误还是渲染字体的标准?
这是我的测试代码,可以针对 PX 字体大小情况进行复制。
<!DOCTYPE html><html><head><script>
function display() {
var canvas = document.getElementById('test');
// For EM and % cases....
//canvas.style.font="5px Arial";
canvas.height = 1000;
var context = canvas.getContext('2d');
var minSize = 10;
var lineHeight = 100;
for(var a=minSize; a< 20; a+=0.1)
{
var font_size = Math.round(a*10000)/10000;
context.font = a + "px Arial";
context.fillText("A: EXAMPLE TEXT > " + font_size, 20, (font_size-minSize)*lineHeight);
}
}
</script></head><body onload="display()"><canvas id="test"></canvas></body></html>
像素比例
点刻度
em 比例 - 1em = 5px Arial
百分比比例 - 100% = 5px Arial
最佳答案
我认为你们很多人应该为我做我的工作 ;) 不管怎样,这就是我解决问题的方法,虽然它有点乱,但仍然有一些我将描述的问题。
回顾一下(因为问题可能不清楚)我正在尝试将字体大小乘以一些 float 来放大和缩小文本。但这导致了不稳定的结果,因为大多数字体大小都四舍五入到最接近的整数值。
例如。
var zoom = 1.02;
var font_size = 12;
context.font = (font_size * zoom) + "px Arial"; // 12.24px
zoom = 1.04 (12.48px) 将呈现与上述代码相同的效果,而 zoom =1.06 (12.75px) 将四舍五入为 13px。
这导致值之间的字体大小发生非常不希望的跳跃,而 Canvas 上的所有其他元素都正确缩放。
所有浏览器都呈现给定的文本字符串(如“EXAMPLE TEXT”)并且长度略有不同,这一事实使问题变得更加复杂。
在初始化期间以标准字体大小(zoom=1)呈现文本并测量线长,将此值称为iniLineLength
在场景渲染期间,我使用隐藏 Canvas 将文本渲染到主 Canvas 上,然后将 drawImage 用于宽度倍增的主 Canvas 。
tmpContext.font = (font_size * zoom) + "px Arial";
tmpContext.fillText(MyLineOfText,0, 0);
var s = (iniLineLength * zoom) / tmpContext.measureText(MyLineOfText) ;
mainContext.drawImage(tmpCanvas,x, y, pw * s, ph);
生成的文本行根据行长度与预期行长度的偏离程度在主 Canvas 上拉伸(stretch)或收缩。
在理想世界中,s 始终等于 1,因为预期的行长度始终与实际行长度相同。预期的行长度是我们的样本行长度 iniLineLength 乘以我们的字体大小在这个渲染过程中的相同缩放因子。
所有这一切的好处是它具有规范化浏览器行为中所有差异的效果……几乎。
即使将行长度归一化,行中每个字符的确切位置也不相同。给出下图中的效果。
然而,这已经是我所拥有的巨大改进。
此外,您需要将 tmpCanvas 剪辑到 mainCanvas,否则您的浏览器会在尝试创建和复制百万像素的文本时逐渐停止,只是为了让一个字符全屏显示.
考虑到这一点,您还可以根据需要设置 tmp Canvas 宽度和高度,以适应您要呈现的实际文本行,这将节省内存、时间等。
关于html - 小数字体大小 html5 Canvas ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15430763/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'
Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在
我正在尝试将一个简单的CSV文件读入HTML表格以在浏览器中显示,但我遇到了麻烦。这就是我正在尝试的:Controller:defshow@csv=CSV.open("file.csv",:headers=>true)end查看:输出:NameStartDateEndDateQuantityPostalCode基本上我只获取标题,而不会读取和呈现CSV正文。 最佳答案 这最终成为最终解决方案:Controller:defshow#OpenaCSVfile,andthenreaditintoaCSV::Tableobjectforda
Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile
我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。