PythonのPILイメージ基本イメージのステッチ、ラウンドカット、テキストを追加

テキストを追加した合成画像を用いた画像パッケージ。

私たちは今、映像パケットPY PIL合成、削減を使用して一例として説明し、テキストを追加します。

オリジナル写真4

合成画像後:

合成画像の.jpg

画像処理

画像ステッチ

# 创建空白图片
target = Image.new('RGBA', (width, hight+504), (255, 255, 255))

# 创建header Image对象,paste拼接到空白图片指定位置target.paste(img_h, (0, 0))
img_h = img_header(os.path.join(tasktheme_img_path, task_img))
# 图片合成paste 参数中img_h表示Image对象,(0, 0)表示x,y轴位置 单位像素 target的左上角为原点 y轴向下 
target.paste(img_h, (0, 0))

円形画像を生成します

広場としてアバター画像なので、円形画像を切断し、スプライスする必要があります。
原理は、正方形にカット内接円、画素位置に対応する背景ピクセルの四隅示されている
円形の画像をバックグラウンド画像の四隅に対応する削減を

# 因为是要圆形,所以需要正方形的图片
    r2 = min(size[0], size[1])
    if size[0] != size[1]:
        ima = ima.resize((r2, r2), Image.ANTIALIAS)
 
    # 最后生成圆的半径
    r3 = r2/2
    imb = Image.new('RGBA', (r3*2, r3*2),(255,255,255,0))
    pima = ima.load()  # 像素的访问对象
    pimb = imb.load()
    pim_back = img_back.load()
    r = float(r2/2) #圆心横坐标
 
    for i in range(r2):
        for j in range(r2):
            lx = abs(i-r) #到圆心距离的横坐标
            ly = abs(j-r)#到圆心距离的纵坐标
            l  = (pow(lx,2) + pow(ly,2))** 0.5  # 三角函数 半径
 
            if l < r3-4:
                pimb[i-(r-r3),j-(r-r3)] = pima[i,j]
            elif l > r3:
                # 大于半径的像素为背景图位置对应的像素,这样显示圆形头像四个角才能正常显示,pim_back为背景image对象
                pimb[i-(r-r3),j-(r-r3)] = pim_back[i+35,j+327-50]
    return imb

テキスト、行を追加します。

それ以外の場合は厄介になり、中国語フォントのサポートsimsun.ttcのlinuxをインポートする必要性に
テキストの追加を開始するdraw.text指定された場所
draw.lineはラインを描画を開始する場所を指定

font = ImageFont.truetype(os.path.join(os.getcwd(),'data','simsun.ttc'),26)
text = u'长按小程序码'
draw.text((457, hight+331), text,fill='#999',font=font)

text = u'立即阅读文章详情'
draw.text((457, hight+366), text,fill='#999',font=font)

draw.line((10, hight+251, width-10, hight+251), fill='#eee')

完全なコード

from PIL import Image,ImageFont,ImageDraw
reload(sys)  
sys.setdefaultencoding('utf8')

def img_author(fpath, img_back):
    ima = Image.open(fpath).convert("RGBA")
    ima = ima.resize((130, 130), Image.ANTIALIAS)
    size = ima.size

    # 因为是要圆形,所以需要正方形的图片
    r2 = min(size[0], size[1])
    if size[0] != size[1]:
        ima = ima.resize((r2, r2), Image.ANTIALIAS)
 
    # 最后生成圆的半径
    r3 = r2/2
    imb = Image.new('RGBA', (r3*2, r3*2),(255,255,255,0))
    pima = ima.load()  # 像素的访问对象
    pimb = imb.load()
    pim_back = img_back.load()
    r = float(r2/2) #圆心横坐标
 
    for i in range(r2):
        for j in range(r2):
            lx = abs(i-r) #到圆心距离的横坐标
            ly = abs(j-r)#到圆心距离的纵坐标
            l  = (pow(lx,2) + pow(ly,2))** 0.5  # 三角函数 半径
 
            if l < r3-4:
                pimb[i-(r-r3),j-(r-r3)] = pima[i,j]
            elif l > r3:
                pimb[i-(r-r3),j-(r-r3)] = pim_back[i+35,j+327-50]
    return imb


def img_header(fpath):
    img = Image.open(fpath)
    img = img.resize((718,327))
    img = img.convert("RGBA")
    return img

def img_logo(fpath):
    img = Image.open(fpath)
    img = img.resize((160,160))
    im = Image.new('RGBA', img.size, (255,255,255))
    x,y = img.size
    im.paste(img, (0, 0, x, y), img)
    return im

def img_applicationcode(fpath):
    img = Image.open(fpath)
    img = img.resize((180,180))
    img = img.convert("RGBA")
    return img

def wx_get_share_img(data):
    task_img = data['task_img']
    author_img = data['author_img']
    author_name = data['author_name']
    task_name = data['task_name']
    roud_name = data['roud_name']
    aid = data['aid']
    tid = data['tid']
    width = 718
    hight = 327
    save_name = str(aid)+'.jpg'
    if os.path.exists(os.path.join(wx_share_path,save_name)):
        return {'img':wx_share_url+save_name}
    try:
        target = Image.new('RGBA', (width, hight+504), (255, 255, 255))
        img_h = img_header(os.path.join(tasktheme_img_path, task_img))
        target.paste(img_h, (0, 0))

        img_a = img_author(os.path.join(avatar_img_path, author_img),target)
        target.paste(img_a, (35, hight-50))


        img_l = img_logo(os.path.join(img_dir,'logo.png'))
        target.paste(img_l, (30,hight+296))

        
        # 获取动态小程序码
        #img_l = img_applicationcode(os.path.join(img_dir,'applicationcode.jpg'))
        img_l = miniprogram.getCodeUnlimit('aid=%s&tid=%s'%(aid,tid),'pages/index/story_detail/story_detail')
        img_l = img_l.resize((160,160))
        target.paste(img_l, (30+160+40,hight+296))

        draw = ImageDraw.Draw(target)
        font = ImageFont.truetype(os.path.join(os.getcwd(),'data','simsun.ttc'),32)
        draw.text((30+130+15, hight+34), author_name.decode('utf-8'),fill='#009696',font=font)


        font = ImageFont.truetype(os.path.join(os.getcwd(),'data','simsun.ttc'),34)

        draw.text((30, hight+125), task_name.decode('utf-8'),fill='#000000',font=font)

        font = ImageFont.truetype(os.path.join(os.getcwd(),'data','simsun.ttc'),30)
        draw.text((30, hight+176), roud_name.decode('utf-8'),fill='#555',font=font)

        font = ImageFont.truetype(os.path.join(os.getcwd(),'data','simsun.ttc'),26)
        text = u'长按小程序码'
        draw.text((457, hight+331), text,fill='#999',font=font)

        text = u'立即阅读文章详情'
        draw.text((457, hight+366), text,fill='#999',font=font)

        draw.line((10, hight+251, width-10, hight+251), fill='#eee')
        # print help(draw)
        target = target.convert("RGB")
        target.save(os.path.join(wx_share_path, save_name))
        return {'img':wx_share_url+save_name}
    except Exception as e:
        traceback.print_exc()
        return {}

おすすめ

転載: www.cnblogs.com/i-love-python/p/11518459.html