рисовать текст в центре изображения, используя PIL - PullRequest
1 голос
/ 10 февраля 2010

У меня есть несколько укусов, которые я хотел бы нарисовать для imagea. Дело в том, что я хочу, чтобы каждая строка отображалась в середине каждого изображения. как мне это сделать? или как я могу узнать длину в пикселях строки (давая конечно шрифт)? спасибо

Ответы [ 2 ]

2 голосов
/ 15 сентября 2013

Вы можете найти реализацию этого в http://tools.jedutils.com/tools/center-text-image

Вы можете использовать эту страницу для создания изображения прямо здесь, вместо того, чтобы реализовывать процедуру самостоятельно, но код также включен на странице.

Следуя советам Николь

from PIL import Image, ImageDraw, ImageFont, ImageFilter
import StringIO

filter_dict = {
    'BLUR' : ImageFilter.BLUR,
    'CONTOUR' : ImageFilter.CONTOUR,
    'DETAIL' : ImageFilter.DETAIL,
    'EDGE_ENHANCE' : ImageFilter.EDGE_ENHANCE,
    'EDGE_ENHANCE_MORE' : ImageFilter.EDGE_ENHANCE_MORE,
    'EMBOSS' : ImageFilter.EMBOSS,
    'FIND_EDGES' : ImageFilter.FIND_EDGES,
    'SMOOTH' : ImageFilter.SMOOTH,
    'SMOOTH_MORE' : ImageFilter.SMOOTH_MORE,
    'SHARPEN' : ImageFilter.SHARPEN
}

def get_font_full_path(font_path,font_name):
    ext = '.TTF' if font_name.upper() == font_name else ".ttf"
    return font_path + font_name + ext

def create_image(font_name, font_size, font_color, width, height, back_ground_color, text, img_type="JPEG", image_filter=None):
    font_full_path = get_font_full_path(font_path,font_name)
    font  =  ImageFont.truetype ( font_full_path, font_size )

    im  =  Image.new ( "RGB", (width,height), back_ground_color )
    draw  =  ImageDraw.Draw ( im )
    text_x, text_y = font.getsize(text)
    x = (width - text_x)/2
    y = (height - text_y)/2
    draw.text ( (x,y), text, font=font, fill=font_color )

    if image_filter:
        real_filter = filter_dict[image_filter]
        im = im.filter(real_filter)
    im.save ( "sample.jpg", format=img_type )

`

2 голосов
/ 10 февраля 2010

Шрифт PIL имеет метод getsize, который вы можете использовать для определения ширины и высоты шрифта, вы пробовали это? например,

from PIL import Image, ImageDraw, ImageFont

fontFile = "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"
font = ImageFont.truetype(fontFile, 10)
text="anurag"
print font.getsize(text)
assert font.getsize(text)[0]*2 == font.getsize(text*2)[0]
...