Chữ cái nào trong bảng chữ cái tiếng Anh chiếm nhiều pixel nhất?


181

Tôi đang cố gắng thực hiện một số chương trình động dựa trên số lượng ký tự trong một câu. Chữ cái nào trong bảng chữ cái tiếng Anh chiếm nhiều pixel nhất trên màn hình?


16
hầu hết các pixel trên tất cả? Rộng nhất? Cao nhất? Phông chữ nào? Bạn có thể chỉ định?
Gregor Brandt

6
Điều đó không phụ thuộc vào phông chữ được sử dụng?
Roberto Aloi

Phông chữ nào? Chữ thường, chữ hoa?
Rocket Ronnie

6
Nó thực sự phụ thuộc vào phông chữ vì bạn đang yêu cầu một phông chữ "chiếm nhiều pixel nhất".
Gurzo

6
Sự khôn ngoan sắp chữ truyền thống là M hoặc W cho chữ hoa và m cho chữ thường. Phụ thuộc vào phông chữ, nhưng điều này hoạt động chấp nhận được trong phần lớn các trường hợp.
tripleee

Câu trả lời:


726

Hmm, hãy xem:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

ccccccccccccccccccccccccccccccccccccccccccc

ddddddddddddddddddddddddddddddddddddd

eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

fffffffffffffffffffffffffffffffffffffffff

gggggggggggggggggggggggggggggggggggggggg

hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj

kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

lllllllllllllllllllllllllllllllllllll

mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn

oooooooooooooooooooooooooooooooooooooooo

pppppppppppppppppppppppppppppppppppppppppppp

qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr

ssssssssssssssssssssssssssssssssssssssss

tttttttttttttttttttttttttttttttttttttttttttt

uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

BBBBBBBBBBBBBBBBBB

CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

DDDĐDĐDĐDĐD

EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ

KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL

MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN

OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP

QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ

RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU

VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV

WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

Zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

W thắng.

Tất nhiên, đây là một thí nghiệm thực nghiệm ngớ ngẩn. Không có câu trả lời duy nhất cho lá thư nào rộng nhất. Nó phụ thuộc vào phông chữ. Vì vậy, bạn sẽ phải làm một thí nghiệm thực nghiệm tương tự để tìm ra câu trả lời cho môi trường của bạn. Nhưng thực tế là, hầu hết các phông chữ đều tuân theo các quy ước giống nhau và chữ W viết hoa sẽ rộng nhất.

Gist với các độ rộng ký tự này ở dạng tỷ lệ (W = 100) được chụp ở đây bằng phông chữ ví dụ cụ thể này:

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


157
Trong không gian vũ trụ, mọi người đều chiến thắng
Colin Hebert

2
Thật thú vị, trong 'Arial Black' trên MacBook của tôi trong Chrome, chữ thường m là rộng nhất, với một lề nhỏ.
Bá tước Jenkins

15
Làm thế nào về điều này ........................................ WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %%%%%%%%%%%%%% %% - 3 -% - ... - ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ......................................... vì vậy tôi nghĩ rằng @ thắng !!
John Henckel

19
Vì vậy, W thực sự không phải là một sự đảo lộn M. Tôi đã sai trong suốt những năm qua!
Ulysses Alves

3
Upvote đơn giản chỉ vì sự tuyệt vời của câu trả lời này!
Tanckom

122

Hơn nữa với câu trả lời thực tế khủng khiếp của Ned Batchelder, bởi vì tôi đến đây tự hỏi về các chữ số:

000000000000000000000000000000000000000000

1111111111111111111111111111111111111111111111

2222222222222222222222222222222222222222222222

333333333333333333333333333333333333333333

444444444444444444444444444444444444444444

555555555555555555555555555555555555555555

666666666666666666666666666666666666666666666

77777777777777777777777777777777777777777777

888888888888888888888888888888888888888888

9999999999999999999999999999999999999999999


7
Tôi nghi ngờ thông tin này, nghĩ rằng "1" chắc chắn sẽ hẹp hơn các chữ số khác. Nhưng trong các phông chữ tôi đã kiểm tra, tất cả các chữ số có cùng chiều rộng. Tôi cho rằng đó là một sự lựa chọn thiết kế phông chữ.
jfritz42

6
Ít nhất là đối với tôi (xem bài đăng này trong Firefox trong Ubuntu), 1 hẹp hơn các bài khác và các bài khác đều có cùng chiều rộng.
MestreLion

@MestreLion: Bạn đang sử dụng phông chữ nào? Khuôn mặt, kích thước và bất kỳ sửa đổi, chẳng hạn như đậm hoặc in nghiêng.
Bá tước Jenkins

2
@LukeTaylor - Tại sao lại như vậy! font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; font-size: 15px; Ôi, Apple đó, luôn cố gắng trở nên khác biệt một chút ....
Earl Jenkins

1
Điều này thực sự phụ thuộc vào font-variant-numeric: các số tỷ lệ cho phép các độ rộng khác nhau, cả trong glyph và khoảng cách, trong khi các số dạng bảng phải tuân theo các quy tắc tương tự như các phông chữ đơn cách.
Matthew Willcockson

20

Làm thế nào về một giải pháp lập trình?

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


Cả "M" và "W" có cùng số pixel. Vì hầu hết các câu trả lời đều nói "W", tốt hơn là hiển thị M và W giống nhau và giành chiến thắng. Nhân tiện trả lời rất hay.
Talespin_Kit



5

Tùy thuộc vào nền tảng của bạn, có thể có một cách để "getWidth" từ một chuỗi hoặc hàm DrawText () bằng cách nào đó với thuộc tính chiều rộng.

Tôi sẽ tạo ra một thuật toán đơn giản sử dụng phông chữ cần thiết và sau đó chạy qua alf.us và lưu nó trong một cấu hình nhỏ hoặc chỉ tính toán nó khi khởi tạo như một vòng lặp từ A đến Z không khó lắm.


5

Nó cũng phụ thuộc vào phông chữ. Tôi đã làm điều này 1 hoặc 2 năm trước với Xử lý và Helvetica và đó là ILJTYFVCPAXUZKHSEDORGNBQMW theo thứ tự tăng pixel. Ý tưởng là vẽ văn bản trên một khung vẽ với phông chữ bạn đang xem, đếm các pixel, sau đó sắp xếp với HashMap hoặc Từ điển.

Tất nhiên, điều này có thể không liên quan trực tiếp đến việc sử dụng của bạn vì điều này sẽ tính toán diện tích pixel thay vì chỉ chiều rộng. Có thể là một chút quá mức quá.

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

Một giải pháp để tính toán độ rộng của phông chữ giống như giải pháp được đăng bởi xxx đã được Alex Michael đăng trên blog của anh ấy (điều đó đủ vui để liên kết tôi ở đây).

Tóm lược:

  • Đối với Helvetica, ba chữ cái trên cùng là: M (2493 pixel), W (2414) và B (1909).
  • Đối với một bộ phông chữ được gửi cùng với máy Mac của mình, kết quả ít nhiều giống nhau: M (2217,51 ± 945,19), W (2139,06 ± 945,29) và B (1841,38 ± 685,26).

Bài đăng gốc: http://alexmic.net/letter-pixel-count/

Mã số:

# -*- 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

Nó sẽ phụ thuộc vào phông chữ. Tôi sẽ tạo một chương trình nhỏ bằng ngôn ngữ lập trình mà bạn thấy thoải mái nhất, nơi bạn vẽ từng chữ cái trong bảng chữ cái thành một bitmap cỡ m lần. Khởi tạo từng pixel với màu trắng. Sau đó đếm số pixel trắng sau khi bạn vẽ từng chữ cái và lưu số đó. Số lượng cao nhất bạn tìm thấy là số bạn đang tìm kiếm.

EDIT: Nếu bạn thực sự chỉ quan tâm đến cái nào chiếm hình chữ nhật lớn nhất (nhưng có vẻ như bạn thực sự sau đó, không phải pixel), bạn có thể sử dụng các lệnh gọi API khác nhau để tìm kích thước, nhưng điều đó phụ thuộc vào ngôn ngữ lập trình của bạn. Ví dụ, trong Java, bạn sẽ sử dụng lớp FontMetrics.


1

Tôi biết câu trả lời được chấp nhận ở đây là W, W là dành cho THẮNG.

Tuy nhiên, trong trường hợp này, W cũng dành cho Width. Nghiên cứu trường hợp đã sử dụng một thử nghiệm chiều rộng đơn giản để kiểm tra pixel, nhưng đó chỉ là chiều rộng, không phải tổng số pixel. Là một ví dụ dễ truy cập, câu trả lời được chấp nhận giả định rằng O và Q chiếm cùng một lượng pixel, tuy nhiên chúng chỉ chiếm cùng một dung lượng.

Do đó, W chiếm nhiều không gian nhất . Nhưng, đó có phải là tất cả các pixel mà nó bị bẻ khóa không?

Hãy lấy một số dữ liệu thực nghiệm. Tôi đã tạo hình ảnh imgur từ B, M và W. sau đây. Tôi đã phân tích số pixel của họ (xem bên dưới), đây là kết quả:

B: 114 pixel

M: 150 pixel

W: 157 pixel

Đây là cách tôi cho chúng vào khung vẽ và phân tích dữ liệu pixel thô từ hình ảnh.

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

Bạn muốn biết glyph thực sự dài nhất, không chỉ là đoán?
Và tôi không chỉ nói về các chữ cái, chữ số và ký hiệu phổ biến (!, @ V.v.). Ý tôi là glyph dài nhất trong tất cả 32.834 ký tự của UTF-16.
Vì vậy, tôi bắt đầu với câu trả lời của @NK có giải pháp lập trình cho nó và thực hiện một số sửa đổi nhỏ cho nó:

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

Sau khi chạy này và chờ đợi (và chờ đợi), nó cho đầu ra ௌ won.
Và bạn có nó, nhân vật dài nhất trong UTF-32! Lưu ý rằng trên một số phông chữ, glyph dài nhất là ﷽, nhưng các phông chữ khác (đặc biệt là các phông chữ đơn cách) chồng lấp các ký tự, như với phông chữ mà chương trình chiếm tài khoản chương trình.


-1

Nó phụ thuộc vào phông chữ. Ví dụ, số 0 vượt qua chiếm nhiều hơn đáng kể so với thông thường.

Nhưng nếu ai đó có thể đoán, tôi sẽ đi với X hoặc B.


Điều này không trả lời câu hỏi. Nó chỉ đưa ra một vài phỏng đoán. Câu trả lời, nhân tiện, nó.
Ẩn danh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.