python PIL 图片叠加文字

2019-12-31  本文已影响0人  车到山前必有路2021

https://github.com/xiaodongzhang1025/Text2Pic

#coding:utf-8

__author__ = 'zhangxiaodong'

import sys

import os

import codecs

import time

import shutil

import codecs

import chardet

from PIL import Image,ImageDraw,ImageFont

reload(sys)

sys.setdefaultencoding('utf8')

def GetDataEncoding(data):

    data_encoding = None

    det_ret = chardet.detect(data)

    if det_ret:

        data_encoding = det_ret['encoding']

        #print det_ret

        #print 'data_encoding', data_encoding

    if data_encoding == 'windows-1251':

        data_encoding = 'gbk'

        #print '    windows-1251 ==> gbk'

    return data_encoding

def Text2Pic(text_file):

    ###################################################################

    #############for encode detect

    title_encoding = GetDataEncoding(text_file)

    text_file = text_file.decode(title_encoding)

    #text_file = text_file.decode('gbk')    ######### GBK !!!!

    ###################################################################

    pic_file, txt_ext = os.path.splitext(text_file)

    if txt_ext != '.txt':

        return False

    print '\n\n==================================', text_file

    title_text = os.path.split(pic_file)[-1]

    print 'title', title_text

    pic_file = pic_file + '.png'

    print '  ', text_file, "===>", pic_file

    #template_img = Image.new('RGB', (1080, 2160), (255, 255, 255))

    template_img = Image.open('template.png')

    total_width = template_img.width

    total_height = template_img.height

    print total_width, total_height

    new_img = Image.new('RGB', (total_width, total_height), (255, 255, 255))

    new_img.paste(template_img, (0, 0))

    draw = ImageDraw.Draw(new_img)

    #################################################################

    title_color = (255, 0, 0)

    normal_color = (0, 0, 0)

    title_font = ImageFont.truetype('simsun.ttc', total_width/15)

    normal_font = ImageFont.truetype('simsun.ttc', total_width/20)

    ################################################################

    normal_encoding = 'utf-8'

    with open(text_file, 'rb') as file_hd:

        raw_data = file_hd.read(4096)

        normal_encoding = GetDataEncoding(raw_data)

        print 'normal_encoding', normal_encoding

    with codecs.open(text_file, 'r', normal_encoding) as file_hd:

        lines = file_hd.readlines()

        line_height = normal_font.getsize(title_text)[1]*1.5    #####行间距1.5倍

        max_width = 0

        line_num = len(lines)

        for i, line in enumerate(lines):

            normal_text = line.strip()

            tmp_width = (total_width - normal_font.getsize(normal_text)[0])/2

            if max_width < tmp_width:

                max_width = tmp_width

        normal_start_x = 0

        if total_width > max_width:

            #normal_start_x = (total_width - max_width)/2    ######居中显示

            normal_start_x = normal_font.getsize(u"缩进")[0]    ######左侧缩进2字符

        title_start_x = (total_width - title_font.getsize(title_text)[0])/2    ######水平居中显示

        max_height = title_font.getsize(title_text)[1]*2 + line_num*line_height

        title_start_y = 0

        if total_height > max_height:

            #title_start_y = title_font.getsize(title_text)[1]

            title_start_y = (total_height - max_height)/2    ######垂直居中显示

        normal_start_y = title_start_y + title_font.getsize(title_text)[1]*2   

        draw.text((title_start_x, title_start_y), title_text, title_color, font=title_font)

        for i, line in enumerate(lines):

            normal_text = line.strip()

            print '    [%d]'%i, normal_text

            cure_pos_y = normal_start_y + line_height*i

            draw.text((normal_start_x, cure_pos_y), normal_text, normal_color, font=normal_font)

    new_img.show()

    print 'Start to save img...'

    new_img.save(pic_file)

    template_img.close()

    return True

if "__main__" == __name__:

    print '\n------------------------------The Start-----------------------------'

    target = os.getcwd()

    if len(sys.argv) >= 2:

        target = sys.argv[1]

    start_time = time.clock()

    #####################################################

    try:

        if os.path.isfile(target):

            print 'File', target

            Text2Pic(target)

        else:

            print 'Dir', target

            for root, dirs, files in os.walk(target):

                #print root, dirs, files

                for file in files:

                    #print file

                    Text2Pic(os.path.join(root, file))

    except Exception, err:

        #print err

        print '===> Exception'

        print str(err).decode("string_escape")

    finally:

        #print '===> Finally'

        print ''

    #####################################################

    print '------------------------------The  End-----------------------------'

    end_time = time.clock()

    print 'Time used %s senconds'%(end_time - start_time)

    sys.exit(0)

上一篇下一篇

猜你喜欢

热点阅读