Для хорошо выглядящих 1-битных изображений, вероятно, необходимо начать с 1-битного растрового китайского шрифта, предназначенного для цифровых дисплеев.

ал со сценария вэтот хороший ответ, Он прекрасно работает для «RGB», но режимы 8-битной серой шкалы «L» и 1-битного черно-белого «1» изображения PIL просто выглядят черными. Что я делаю неправильно?

from PIL import Image, ImageDraw, ImageFont
import numpy as np

w_disp   = 128
h_disp   =  64
fontsize =  32
text     =  u"你好!"

for imtype in "1", "L", "RGB":
    image = Image.new(imtype, (w_disp, h_disp))
    draw  = ImageDraw.Draw(image)
    font  = ImageFont.truetype("/Library/Fonts/Arial Unicode.ttf", fontsize)
    w, h  = draw.textsize(text, font=font)
    draw.text(((w_disp - w)/2, (h_disp - h)/2), text, font=font)
    image.save("NiHao! 2 " + imtype + ".bmp")
    data = np.array(list(image.getdata()))
    print data.shape, data.dtype, "min=", data.min(), "max=", data.max()

Выход:

(8192,) int64 min= 0 max= 0
(8192,) int64 min= 0 max= 0
(8192, 3) int64 min= 0 max= 255

imtype = "1":

imtype = "L":

imtype = "RGB":

Ответы на вопрос(1)

Решение Вопроса

ОБНОВИТЬ:

Этот ответ предлагает использовать PILImage.point() метод вместо.convert().

Все выглядит так:

from PIL import Image, ImageDraw, ImageFont
import numpy as np
w_disp   = 128
h_disp   =  64
fontsize =  32
text     =  u"你好!"

imageRGB = Image.new('RGB', (w_disp, h_disp))
draw  = ImageDraw.Draw(imageRGB)
font  = ImageFont.truetype("/Library/Fonts/Arial Unicode.ttf", fontsize)
w, h  = draw.textsize(text, font=font)
draw.text(((w_disp - w)/2, (h_disp - h)/2), text, font=font)

image8bit = imageRGB.convert("L")
imageRGB.save("NiHao! RGB.bmp")
image8bit.save("NiHao! 8bit.bmp")

imagenice_80  = image8bit.point(lambda x: 0 if x < 80  else 1, mode='1')
imagenice_128 = image8bit.point(lambda x: 0 if x < 128 else 1, mode='1')
imagenice_80.save("NiHao! nice 1bit 80.bmp")
imagenice_128.save("NiHao! nice 1bit 128.bmp")

ОРИГИНАЛ:

Похоже, шрифты TrueType не хотят работать с чем-то меньшим, чем RGB.

Вы можете попробовать преобразовать изображения с помощью PIL.convert() метод.

Начиная с изображения RGB, это дает:

image.convert("L"):

image.convert("1"):

Преобразование в 8-битную серую шкалу работает хорошо, но начиная с шрифтов TrueType или любого шрифта, основанного на серой шкале, 1-битное преобразование всегда будет выглядеть грубым.

Для хорошо выглядящих 1-битных изображений, вероятно, необходимо начать с 1-битного растрового китайского шрифта, предназначенного для цифровых дисплеев.

Ваш ответ на вопрос