英文字母中的哪个字母占用最多像素?


181

我正在尝试根据句子中的字符数进行一些动态编程。英文字母中的哪个字母占用屏幕上最多的像素?


16
全部像素最多?最宽?最高?哪种字体?你能指定吗?
Gregor Brandt 2010年

6
这不取决于所使用的字体吗?
罗伯托·阿洛伊

哪种字体?小写,大写?
火箭罗尼

6
它实际上取决于字体,因为您需要一种“占用最多像素”的字体。
古尔佐(Gurzo)2010年

6
传统的排版技巧是大写为M或W,小写为m。取决于字体,但这在大多数情况下可以接受。
2012年

Answers:


724

嗯,让我们看看:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

cccccccccccccccccccccccccccccccccccccccc

dddddddddddddddddddddddddddddddddddddddd

eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

ffffffffffffffffffffffffffffffffffffffff

gggggggggggggggggggggggggggggggggggggggg

hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj

kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

llllllllllllllllllllllllllllllllllllll

mm

nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn

oooooooooooooooooooooooooooooooooooooooooo

pppppppppppppppppppppppppppppppppppppppppp

qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr

sssssssssssssssssssssssssssssssss

tttttttttttttttttttttttttttttttttttttttt

uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB

CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD

EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ

KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL

MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN

OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP

QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ

$$$$ RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU

VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV

WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

W胜。

当然,这是一个愚蠢的经验实验。没有哪个字母最宽的答案。这取决于字体。因此,您必须进行类似的经验实验,才能找到适合您的环境的答案。但是事实是,大多数字体都遵循相同的约定,大写W将是最宽的。

使用以下特定示例字体在此处以比例形式(W = 100)捕获这些字符宽度的要点:

https://gist.github.com/imaurer/d330e68e70180c985b380f25e195b90c


156
在monospace中,每个人都赢了
Colin Hebert

2
有趣的是,在装有Chrome的MacBook上的“ Arial Black”中,小写字母m的宽度最大,幅度很小。
Earl Jenkins '02

15
怎么样................................................. WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW @@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%% ............................. ..........................................所以我认为@胜了!!
约翰·亨克尔

19
因此,W实际上并不是倒置的M。这些年来,我一直做错了!
尤利西斯·阿尔维斯

3
仅仅因为这个答案太棒了而投票!
Tanckom,

122

进一步介绍Ned Batchelder的实用答案,因为我来这里想知道数字:

0000000000000000000000000000000000000000000000

1111111111111111111111111111111111111111111

2222222222222222222222222222222222222222222

3333333333333333333333333333333333333333333

4444444444444444444444444444444444444444444

5555555555555555555555555555555555555555555555

6666666666666666666666666666666666666666

7777777777777777777777777777777777777777777

8888888888888888888888888888888888888888

9999999999999999999999999999999999999999


7
我对此信息表示怀疑,认为“ 1”肯定比其他数字窄。但是在我检查过的字体中,所有数字都具有相同的宽度。我想这是字体设计的选择。
jfritz42,2012年

6
至少对我来说(在Ubuntu的Firefox中查看此帖子),1比其他人窄,其他人都一样宽。
MestreLion

@MestreLion:您使用哪种字体?脸部,大小和任何修饰符,例如粗体或斜体。
Earl Jenkins

2
@LukeTaylor-为什么会这样呢! font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; font-size: 15px; 哦,苹果,总是试图一点点不同....
厄尔·詹金斯

1
这实际上取决于font-variant-numeric:比例数字在字形和间距中都允许不同的宽度,而表格数字必须遵循与等宽字体相似的规则。
马修·威尔考克森

20

程序化解决方案怎么样?

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相同并获胜。顺便说一句非常好的答案。
Talespin_Kit



5

根据您的平台,可能存在一种通过width属性从字符串或DrawText()函数“获取宽度”的方法。

我会做一个简单的算法时间,该算法利用所需的字体,然后遍历alfabet并将其存储在一个小的配置中,或者只是在初始化时对其进行计算,因为从A到Z的循环并不那么困难。


5

它还取决于字体。我在一两年前使用Processing和Helvetica做到了这一点,按照像素增加的顺序,它是ILJTYFVCPAXUZKHSEDORGNBQMW。想法是使用要查看的字体在画布上绘制文本,计算像素,然后使用HashMap或Dictionary进行排序。

当然,这可能与您的使用没有直接关系,因为这是计算像素区域而不是宽度。可能也有些矫kill过正。

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;
}


3

亚历克斯·迈克尔(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()

1

这将取决于字体。我会用最适合的编程语言来创建一个小程序,在该程序中,您将字母表中的每个字母绘制成大小为m的位图。用白色初始化每个像素。然后,在绘制每个字母后计算白色像素的数量并保存该数字。找到的最高编号是您要寻找的编号。

编辑:如果您实际上只是对哪个占据最大的矩形感兴趣(但看起来您真的是在那之后,而不是像素),则可以使用各种AP​​I调用来找到大小,但这取决于您的编程语言。例如,在Java中,您将使用FontMetrics类。


1

我知道这里接受的答案是W,W是WIN。

但是,在这种情况下,W也是宽度。案例研究使用了一个简单的宽度测试来检查像素,但这只是宽度,而不是总像素数。作为一个简单的反例,接受的答案假设O和Q占据相同数量的像素,但它们仅占据相同数量的空间。

因此,W占据了最大的空间。但是,难道它就是所有像素吗?

让我们获取一些经验数据。我从以下B,M和W创建了imgur图像。然后我分析了它们的像素数(请参见下文),结果如下:

B:114像素

M:150像素

W: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" width="100%" height="100%"></canvas>
  </td>
  <td id="BOut">
  </td>
</tr>
<tr>
  <td>
    <canvas id="M" width="100%" height="100%"></canvas>
  </td>
  <td id="MOut">
  </td>
</tr>
<tr>
  <td>
    <canvas id="W" width="100%" height="100%"></canvas>
  </td>
  <td id="WOut">
  </td>
</tr>
</table>


1

是否想知道真正最长的字形,而不仅仅是猜测?
我不只是在谈论字母,数字和通用符号(!,@等)。我的意思是,在所有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中最长的字符!请注意,在某些字体上,最长的字形是﷽,但是其他字体(尤其是等宽字体)与字符重叠,就像程序将程序考虑在内的字体一样。


-1

这取决于字体。例如,越过零比正常的占用更多。

但是如果可以猜测,我会选择X或B。


这不能回答问题。它只是给了一些猜测。答案是ௌ。
匿名
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.