Какая буква английского алфавита занимает больше всего пикселей?


181

Я пытаюсь сделать динамическое программирование на основе количества символов в предложении. Какая буква английского алфавита занимает больше всего пикселей на экране?


16
больше всего пикселей? Широчайший? Tallest? Какой шрифт? Можете ли вы указать?
Грегор Брандт

6
Разве это не зависит от используемого шрифта?
Роберто Алои

Какой шрифт? Строчные, верхние?
Ракета Ронни

6
Это действительно зависит от шрифта, так как вы запрашиваете тот, который "занимает больше пикселей".
Гурзо

6
Мудрость традиционного набора текста - M или W для прописных букв и m для строчных. Зависит от шрифта, но в большинстве случаев это работает приемлемо.
tripleee

Ответы:


726

Хм, посмотрим:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

cccccccccccccccccccccccccccccccccccccccc

dddddddddddddddddddddddddddddddddddddddd

eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

ffffffffffffffffffffffffffffffffffffffff

gggggggggggggggggggggggggggggggggggggggg

hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj

kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

llllllllllllllllllllllllllllllllllllllll

mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn

oooooooooooooooooooooooooooooooooooooooo

pppppppppppppppppppppppppppppppppppppppp

qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr

ssssssssssssssssssssssssssssssssssssssss

tttttttttttttttttttttttttttttttttttttttt

uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB

CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD

EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ

KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL

MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN

OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP

QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ

RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU

VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV

WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

W побеждает.

Конечно, это глупый эмпирический эксперимент. Нет единого ответа, какое письмо является самым широким. Это зависит от шрифта. Таким образом, вам придется провести аналогичный эмпирический эксперимент, чтобы выяснить ответ для вашей среды. Но дело в том, что большинство шрифтов придерживаются одних и тех же соглашений, и заглавная буква W будет самой широкой.

Суть этих значений ширины символов в форме отношения (W = 100), полученной здесь, с использованием этого конкретного примера шрифта:

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


157
В монопространстве все выигрывают
Колин Хеберт

2
Интересно, что в «Arial Black» на моем MacBook в Chrome строчная буква m является самой широкой с небольшим отрывом.
Эрл Дженкинс

15
Как насчет этого ........................................ WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%% .......................... ......................................... так что я думаю, что @ выигрывает !!
Джон Хенкель

19
Так что W на самом деле не перевернутая буква M. Я ошибался все эти годы!
Улисс Алвес

3
Upvote просто из-за удивительности этого ответа!
Tanckom

122

В дополнение к удивительно практическому ответу Неда Батчелдера, потому что я пришел сюда, задаваясь вопросом о цифрах:

0000000000000000000000000000000000000000

1111111111111111111111111111111111111111

2222222222222222222222222222222222222222

3333333333333333333333333333333333333333

4444444444444444444444444444444444444444

5555555555555555555555555555555555555555

6666666666666666666666666666666666666666

7777777777777777777777777777777777777777

8888888888888888888888888888888888888888

9999999999999999999999999999999999999999


7
Я сомневался в этой информации, думая, что «1», безусловно, будет более узким, чем другие цифры. Но в шрифтах, которые я проверил, все цифры имеют одинаковую ширину. Я полагаю, это выбор дизайна шрифта.
jfritz42

6
По крайней мере для меня (просматривая этот пост в Firefox в Ubuntu), 1 является более узким, чем другие, а другие имеют одинаковую ширину.
МестреЛион

@MestreLion: Какой шрифт вы используете? Лицо, размер и любые модификаторы, такие как жирность или курсив.
Эрл Дженкинс

2
@ LukeTaylor - Почему это так! font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; font-size: 15px; О, это яблоко, всегда старающееся быть немного другим ...
Эрл Дженкинс

1
Это на самом деле зависит от font-variant-numeric: пропорциональные цифры допускают различную ширину, как в глифе, так и в интервале, в то время как табличные цифры должны следовать правилам, аналогичным моноширинным шрифтам.
Мэтью Уиллкоксон

21

Как насчет программного решения?

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


И «М», и «W» имеют одинаковое количество пикселей. Так как большинство ответов говорят "W", лучше показать, что M и W одинаковы и выиграли. Кстати очень хороший ответ.
Talespin_Kit



5

В зависимости от вашей платформы, может быть способ «getWidth» из строки или функции DrawText () с помощью свойства width.

Я бы сделал простой алгоритм, который использовал необходимый шрифт, а затем пробежал по алфавиту и сохранил его в небольшой конфигурации или просто рассчитал его при инициализации, поскольку цикл от А до Я не так уж сложен.


5

Это также зависит от шрифта. Я сделал это 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;
}


3

Алекс Майкл разместил в своем блоге решение для вычисления ширины шрифтов, аналогичное решению, опубликованному 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. Инициализируйте каждый пиксель белым. Затем посчитайте количество белых пикселей после того, как вы нарисовали каждую букву, и сохраните это число. Самое большое число, которое вы найдете, это то, что вы ищете.

РЕДАКТИРОВАТЬ: Если вы на самом деле просто заинтересованы в том, какой из них занимает самый большой прямоугольник (но похоже, что вы действительно после этого, а не пикселей), вы можете использовать различные вызовы API, чтобы найти размер, но это зависит от ваш язык программирования. Например, в Java вы должны использовать класс FontMetrics.


1

Я знаю, что принятый ответ здесь - W, W - для WIN.

Однако в этом случае W также для ширины. В данном примере использовался простой тест ширины для проверки пикселей, но это была только ширина, а не общее количество пикселей. В качестве простого встречного примера принятый ответ предполагает, что O и Q занимают одинаковое количество пикселей, но занимают одинаковое количество места.

Таким образом, W занимает больше всего места . Но разве это все пиксели, на которые он треснул?

Давайте получим некоторые эмпирические данные. Я создал imgur изображения из следующих B, M и W. Затем я проанализировал их количество пикселей (см. Ниже), вот результаты:

B: 114 пикселей

М: 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

Хотите узнать настоящий самый длинный глиф, а не просто гадать?
И я говорю не только о буквах, цифрах и общих символах (!, @ И т. Д.). Я имею в виду самый длинный глиф из всех 32 834 символов UTF-16.
Итак, я начал с ответа @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.


Это не отвечает на вопрос. Это просто дает пару догадок. Ответ, кстати, это ௌ.
Аноним
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.