Python 2.7 使用PIL绘制多语言文本并另存为1位和8位位图

Python 2.7 使用PIL绘制多语言文本并另存为1位和8位位图,python-2.7,fonts,python-imaging-library,Python 2.7,Fonts,Python Imaging Library,我从中的脚本开始。它对“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_

我从中的脚本开始。它对“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”:

更新:

建议使用PIL的
Image.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")
从PIL导入图像、ImageDraw、ImageFont
将numpy作为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(文本,字体=字体)
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.点(如果x<80,则λx:0,否则为1,模式为1')
imagenice_128=image8bit.point(如果x<128,则λx:0,否则为1,模式为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位位图中文字体开始