英文字母中哪个字母占用的像素最多? [关闭]
Posted
技术标签:
【中文标题】英文字母中哪个字母占用的像素最多? [关闭]【英文标题】:Which letter of the English alphabet takes up most pixels? [closed] 【发布时间】:2011-04-26 08:27:40 【问题描述】:我正在尝试根据句子中的字符数进行一些动态编程。哪个英文字母在屏幕上占据的像素最多?
【问题讨论】:
所有像素最多?最宽?最高?哪种字体?你能指定吗? 那不取决于使用的字体吗? 哪种字体?小写,大写? 这真的取决于字体,因为您要求的是“占用最多像素”的字体。 传统的排版智慧是 M 或 W 代表大写,m 代表小写。取决于字体,但这在大多数情况下都可以接受。 【参考方案1】:大写“M”通常是最宽的。
【讨论】:
因此计量单位之所以称为“em”en.m.wikipedia.org/wiki/Em_(typography) @marc_s: JAnderton's answer 似乎支持这个答案。【参考方案2】:我相信W
这个字母是最宽的。
【讨论】:
【参考方案3】:这取决于字体。例如,交叉零占用的空间比普通的要多得多。
但如果有人可以猜测,我会选择 X 或 B。
【讨论】:
【参考方案4】:嗯,让我们看看:
呸呸呸呸呸呸呸呸
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccc
dddddddddddddddddddddddddddddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
ffffffffffffffffffffffffffffffffffffffff
gggggggggggggggggggggggggggggggggggggggggg
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
llllllllllllllllllllllllllllllllllllllll
mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
呜呜呜呜呜呜呜呜呜呜呜呜
pppppppppppppppppppppppppppppppppppppppppppp
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
sssssssssssssssssssssssssssssssssssss
tttttttttttttttttttttttttttttttttttttttt
uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
W 获胜。
当然,这是一个愚蠢的经验实验。哪个字母最宽没有唯一的答案。这取决于字体。因此,您必须进行类似的经验实验才能找出适合您环境的答案。但事实是,大多数字体都遵循相同的约定,大写的 W 将是最宽的。
在此处使用此特定示例字体以比率形式 (W = 100) 获取这些字符宽度的要点:
https://gist.github.com/imaurer/d330e68e70180c985b380f25e195b90c
【讨论】:
在等空间,每个人都赢 有趣的是,在我的 Chrome MacBook 上的“Arial Black”中,小写 m 是最宽的,但幅度很小。 这个怎么样...................................... . WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%....... ................................................. 所以我认为@赢了! 专业提示:我也有同样的问题,具体到 Trebuchet MS 字体。我使用 Chrome 开发工具更改答案和 cmets 上的字体系列:body p, body .comcopy font-family: Trebuchet MS; SO 对所有正文使用“Helvetica Neue”,包括答案 (15px) 和 cmets (13px)。在这种字体中,“W”是最大的字母,“@”符号大于“W”字符。在“Trebuchet MS”字体系列中,“W”仍然是最大的字母,但“@”符号较小。 所以W实际上不是颠倒的M。这些年我错了!【参考方案5】:这取决于字体。我会用您最熟悉的编程语言创建一个小程序,在其中将字母表中的每个字母绘制成 n 倍 m 大小的位图。用白色初始化每个像素。然后在绘制每个字母后计算白色像素的数量并保存该数字。您找到的最大数字就是您要查找的数字。
编辑:如果您实际上只是对哪个占据最大的矩形感兴趣(但看起来您真的是在那之后,而不是像素),您可以使用各种 API 调用来查找大小,但是这取决于您的编程语言。例如,在 Java 中,您将使用 FontMetrics 类。
【讨论】:
【参考方案6】:Chrome 中的 Arial 30 像素 - W 胜。
【讨论】:
【参考方案7】:根据您的平台,可能有一种方法可以通过宽度属性从字符串或 DrawText() 函数中“获取宽度”。
我会创建一个使用所需字体的简单算法,然后运行 alfabet 并将其存储在一个小配置中,或者只是在初始化时计算它,因为从 A 到 Z 的循环并不难。
【讨论】:
【参考方案8】:进一步了解 Ned Batchelder 非常实用的答案,因为我来到这里想知道数字:
0000000000000000000000000000000000000000
111111111111111111111111111111111111111
2222222222222222222222222222222222222222
3333333333333333333333333333333333333333
4444444444444444444444444444444444444444
5555555555555555555555555555555555555555
6666666666666666666666666666666666666666
7777777777777777777777777777777777777777
8888888888888888888888888888888888888888
9999999999999999999999999999999999999999
【讨论】:
我怀疑这个信息,认为“1”肯定会比其他数字更窄。但是在我检查过的字体中,所有数字的宽度都相同。我想这是一种字体设计选择。 至少对我来说(在 Ubuntu 的 Firefox 中查看这篇文章),1 比其他的窄,其他的宽度都一样。 @MestreLion:您使用的是哪种字体?面部、大小和任何修饰符,例如粗体或斜体。 @LukeTaylor -- 为什么会这样!font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif;
font-size: 15px;
哦,那个苹果,总是想有点不同......
这实际上取决于font-variant-numeric
:比例数字允许在字形和间距中使用不同的宽度,而表格数字必须遵循与等宽字体类似的规则。【参考方案9】:
这也取决于字体。 1 或 2 年前,我使用 Processing 和 Helvetica 做到了这一点,它是 ILJTYFVCPAXUZKHSEDORGNBQMW 以增加像素的顺序。这个想法是用你正在查看的字体在画布上绘制文本,计算像素,然后使用 HashMap 或 Dictionary 进行排序。
当然,这可能与您的使用没有直接关系,因为它计算的是像素面积而不仅仅是宽度。也可能有点矫枉过正。
void setup()
size(30,30);
HashMap hm = new HashMap();
fill(255);
PFont font = loadFont("Helvetica-20.vlw");
textFont(font,20);
textAlign(CENTER);
for (int i=65; i<91; i++)
background(0);
text(char(i),width/2,height-(textDescent()+textAscent())/2);
loadPixels();
int white=0;
for (int k=0; k<pixels.length; k++)
white+=red(pixels[k]);
hm.put(char(i),white);
HashMap sorted = getSortedMap(hm);
String asciiString = new String();
for (Iterator<Map.Entry> i = sorted.entrySet().iterator(); i.hasNext();)
Map.Entry me = (Map.Entry)i.next();
asciiString += me.getKey();
println(asciiString); //the string in ascending pixel order
public HashMap getSortedMap(HashMap hmap)
HashMap map = new LinkedHashMap();
List mapKeys = new ArrayList(hmap.keySet());
List mapValues = new ArrayList(hmap.values());
TreeSet sortedSet = new TreeSet(mapValues);
Object[] sortedArray = sortedSet.toArray();
int size = sortedArray.length;
// a) Ascending sort
for (int i=0; i<size; i++)
map.put(mapKeys.get(mapValues.indexOf(sortedArray[i])), sortedArray[i]);
return map;
【讨论】:
【参考方案10】:Alex Michael 在他的博客上发布了一个计算字体宽度的解决方案,有点像 xxx 发布的解决方案(有趣的是,它把我链接到了这里)。
总结:
对于 Helvetica,前三个字母是:M(2493 像素)、W (2414) 和 B (1909)。 对于他的 Mac 附带的一组字体,结果大致相同:M (2217.51 ± 945.19)、W (2139.06 ± 945.29) 和 B (1841.38 ± 685.26)。原帖:http://alexmic.net/letter-pixel-count/
代码:
# -*- coding: utf-8 -*-
from __future__ import division
import os
from collections import defaultdict
from math import sqrt
from PIL import Image, ImageDraw, ImageFont
# Make a lowercase + uppercase alphabet.
alphabet = 'abcdefghijklmnopqrstuvwxyz'
alphabet += ''.join(map(str.upper, alphabet))
def draw_letter(letter, font, save=True):
img = Image.new('RGB', (100, 100), 'white')
draw = ImageDraw.Draw(img)
draw.text((0,0), letter, font=font, fill='#000000')
if save:
img.save("imgs/.png".format(letter), 'PNG')
return img
def count_black_pixels(img):
pixels = list(img.getdata())
return len(filter(lambda rgb: sum(rgb) == 0, pixels))
def available_fonts():
fontdir = '/Users/alex/Desktop/English'
for root, dirs, filenames in os.walk(fontdir):
for name in filenames:
path = os.path.join(root, name)
try:
yield ImageFont.truetype(path, 100)
except IOError:
pass
def letter_statistics(counts):
for letter, counts in sorted(counts.iteritems()):
n = len(counts)
mean = sum(counts) / n
sd = sqrt(sum((x - mean) ** 2 for x in counts) / n)
yield letter, mean, sd
def main():
counts = defaultdict(list)
for letter in alphabet:
for font in available_fonts():
img = draw_letter(letter, font, save=False)
count = count_black_pixels(img)
counts[letter].append(count)
for letter, mean, sd in letter_statistics(counts):
print u"0: 1:.2f ± 2:.2f".format(letter, mean, sd)
if __name__ == '__main__':
main()
【讨论】:
【参考方案11】:编程解决方案怎么样?
var capsIndex = 65;
var smallIndex = 97
var div = document.createElement('div');
div.style.float = 'left';
document.body.appendChild(div);
var highestWidth = 0;
var elem;
for(var i = capsIndex; i < capsIndex + 26; i++)
div.innerText = String.fromCharCode(i);
var computedWidth = window.getComputedStyle(div, null).getPropertyValue("width");
if(highestWidth < parseFloat(computedWidth))
highestWidth = parseFloat(computedWidth);
elem = String.fromCharCode(i);
for(var i = smallIndex; i < smallIndex + 26; i++)
div.innerText = String.fromCharCode(i);
var computedWidth = window.getComputedStyle(div, null).getPropertyValue("width");
if(highestWidth < parseFloat(computedWidth))
highestWidth = parseFloat(computedWidth);
elem = String.fromCharCode(i);
div.innerhtml = '<b>' + elem + '</b>' + ' won';
【讨论】:
“M”和“W”的像素数相同。由于大多数答案都说“W”,因此最好显示 M 和 W 相同并获胜。顺便说一句非常好的答案。【参考方案12】:我知道这里接受的答案是 W,W 代表 WIN。
但是,在这种情况下,W 也代表宽度。使用的案例研究采用简单的宽度测试来检查像素,但它只是宽度,而不是总像素数。作为一个简单的反例,公认的答案假设 O 和 Q 占用相同数量的像素,但它们只占用相同数量的空间。
因此,W 占用了最多的空间。但是,它是被破解的所有像素吗?
让我们获取一些经验数据。我从以下 B、M 和 W 创建了 imgur 图像。然后我分析了它们的像素数(见下文),结果如下:
B:114 像素
M : 150 像素
宽:157 像素
这是我将它们输入画布并分析图像中的原始像素数据的方法。
var imgs =
B : "//i.imgur.com/YOuEPOn.png",
M : "//i.imgur.com/Aev3ZKQ.png",
W : "//i.imgur.com/xSUwE7w.png"
;
window.onload = function()
for(var key in imgs)(function(img,key)
var Out = document.querySelector("#"+key+"Out");
img.crossOrigin = "Anonymous";
img.src=imgs[key];
img.onload = function()
var canvas = document.querySelector('#'+key);
(canvas.width = img.width,canvas.height = img.height);
var context = canvas.getContext('2d');
context.drawImage(img, 0, 0);
var data = context.getImageData(0, 0, img.width, img.height).data;
Out.innerHTML = "Total Pixels: " + data.length/4 + "<br>";
var pixelObject = ;
for(var i = 0; i < data.length; i += 4)
var rgba = "rgba("+data[i]+","+data[i+1]+","+data[i+2]+","+data[i+3]+")";
pixelObject[rgba] = pixelObject[rgba] ? pixelObject[rgba]+1 : 1;
Out.innerHTML += "Total Whitespace: " + pixelObject["rgba(255,255,255,255)"] + "<br>";
Out.innerHTML += "Total Pixels In "+ key +": " + ((data.length/4)-pixelObject["rgba(255,255,255,255)"]) + "<br>";
;
)(new Image(),key)
;
<table>
<tr>
<td>
<canvas id="B" ></canvas>
</td>
<td id="BOut">
</td>
</tr>
<tr>
<td>
<canvas id="M" ></canvas>
</td>
<td id="MOut">
</td>
</tr>
<tr>
<td>
<canvas id="W" ></canvas>
</td>
<td id="WOut">
</td>
</tr>
</table>
【讨论】:
【参考方案13】:想知道真实最长的字形,而不仅仅是猜测? 而且我不只是在谈论字母、数字和常见符号(!、@ 等等)。我的意思是 UTF-16 的所有 32,834 个字符中最长的字形。 所以我从@NK 的回答开始,它有一个编程解决方案,并进行了修改:
var capsIndex = 65;
var smallIndex = 97;
var div = document.createElement('div');
div.style.float = 'left';
document.body.appendChild(div);
var highestWidth = 0;
var elem;
for(var i = capsIndex; i < 32834; i++)
div.innerText = String.fromCharCode(i);
var computedWidth = window.getComputedStyle(div, null).getPropertyValue("width");
if(highestWidth < parseFloat(computedWidth))
highestWidth = parseFloat(computedWidth);
elem = String.fromCharCode(i);
div.innerHTML = '<b>' + elem + '</b>' + ' won';
在运行并等待(和等待)之后,它会给出输出ௌ won
。
有了它,UTF-32 中最长的字符!
请注意,在大多数字体上,最长的字形是 ﷽,但有些字体(尤其是等宽字体)会与字符重叠,就像运行程序时使用的字体一样。
【讨论】:
原来的问题是关于英文字母的。您可以提出一个单独的问题并回答您的问题。 @user894319twitter Done.【参考方案14】:此代码将获取所有字符的宽度作为数组:
const alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
var widths = [];
var div = document.createElement('div');
div.style.float = 'left';
document.body.appendChild(div);
var highestObservedWidth = 0;
var answer;
for (var i = 0; i < alphabet.length; i++)
div.innerText = alphabet[i];
var computedWidthString = window.getComputedStyle(div, null).getPropertyValue("width");
var computedWidth = parseFloat(computedWidthString.slice(0, -2));
// console.log(typeof(computedWidth));
widths[i] = computedWidth;
if(highestObservedWidth < computedWidth)
highestObservedWidth = computedWidth;
answer = div.innerText;
div.innerHTML = '<b>' + answer + '</b>' + ' won';
// console.log(widths.sort((a, b) => a - b));
【讨论】:
【参考方案15】:或者,如果您想要一个宽度图,包含的不仅仅是如上所述的字母(数字)字符(就像我在非浏览器环境中需要的那样)
const chars = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "!", "\"", "#", "$", "%", "'", "(", ")", "*", "+", ",", "-", ".", "/", ":", ";", "=", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "", "|", "", "~", " ", "&", ">", "<"]
const test = document.createElement('div')
test.id = "Test"
document.body.appendChild(test)
test.style.fontSize = 12
const result =
chars.forEach(char =>
let newStr = ""
for (let i = 0; i < 10; i++)
if (char === " ")
newStr += " "
else
newStr += char
test.innerHTML = newStr
const width = (test.clientWidth)
result[char] = width / 10
)
console.log('RESULT:', result)
#Test
position: absolute;
/* visibility: hidden; */
height: auto;
width: auto;
white-space: nowrap; /* Thanks to Herb Caudill comment */
【讨论】:
以上是关于英文字母中哪个字母占用的像素最多? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式检查开头的特定字母加上最多九个数字字符,用于黑斑羚 [关闭]
算法学习之 Python 实现单词分析-找出现次数最多的字母的 n 中方式
算法学习之 Python 实现单词分析-找出现次数最多的字母的 n 中方式