heKaiii

最近想爬一下图片,但是爬下来发现图片下面带着文字解释,这样看起来不太有美感,想着能不能将图片的文字解释,合成一张图,放在图片下面
先看图片格式
在这里插入图片描述我想要这样的效果
在这里插入图片描述
下面的描述接在图片上面
参考大神的生成图片写的
直接上代码

#文字生成图片,得有固定的宽度和文字字符串
def make_text_image(width,text):
    #450对20号字体 
    fontsize = int(width*20/450)
    # 创建Font对象:
    font = ImageFont.truetype(\'C:\Windows\Fonts\微软雅黑\msyhl.ttc\', fontsize)
    #20号字体
    txt = Image.new(\'RGB\', (100, 100), (255, 255, 255))
    # 创建Draw对象:
    draw = ImageDraw.Draw(txt)
    # 所有文字的段落
    duanluo = ""
    # 宽度总和
    sum_width = 0
    # 几行 一开始设置俩行是因为这个有行间距的,我弄了一下午也没搞清楚行间距怎么算
    #求大神教教我
    line_count = 2
    # 行高
    line_height = 0
    #总长
    duanluoheight = 0
    for char in text:
    	#看下每个字的长和宽
        char_width, height = draw.textsize(char,font=font)
        sum_width += char_width
        if(height > line_height):
            #这个每个字符的高度不一样,找出那个最高的
            line_height = height
        #如果超过了规定的长度那就换行
        if sum_width > width-fontsize*2:
            line_count += 1
            sum_width = 0
            duanluo += \'\n\'
        #将生成一个带有换行的字符串
        duanluo += char
    #后面再加上一个换行
    if not duanluo.endswith(\'\n\'):
        duanluo += \'\n\'
    #可以求出段落的高度
    duanluoheight = line_count*line_height
    #生成图片
    image = Image.new(\'RGB\', (width, duanluoheight), (255, 255, 255))
    draw = ImageDraw.Draw(image)
    x, y = char_width/2, 0
    # 输出文字:
    draw.text((x, y), duanluo, font=font, fill=(0,0,0))
    # image.save(\'code.jpg\', \'jpeg\')
    return image,duanluoheight

合成图片看了挺多,思路都是先造一个大的,再往里面加两个小的

完整代码,得有个F盘,没有的话,改一下就好了

import urllib.request
import os
import json
import requests
import time
import re
from PIL import Image, ImageFont, ImageDraw

#今日囧图的编号,gif编号,视频编号
jinristr = "138872" 

#文字生成图片,得有固定的宽度和文字字符串
def make_text_image(width,text):
    #450对20号字体 
    fontsize = int(width*20/450)
    # 创建Font对象:
    font = ImageFont.truetype(\'C:\Windows\Fonts\微软雅黑\msyhl.ttc\', fontsize)
    #20号字体
    txt = Image.new(\'RGB\', (100, 100), (255, 255, 255))
    # 创建Draw对象:
    draw = ImageDraw.Draw(txt)
    # 所有文字的段落
    duanluo = ""
    # 宽度总和
    sum_width = 0
    # 几行 一开始设置俩行是因为这个有行间距的,我弄了一下午也没搞清楚行间距怎么算
    #求大神教教我
    line_count = 2
    # 行高
    line_height = 0
    #总长
    duanluoheight = 0
    for char in text:
    	#看下每个字的长和宽
        char_width, height = draw.textsize(char,font=font)
        sum_width += char_width
        if(height > line_height):
            #这个每个字符的高度不一样,找出那个最高的
            line_height = height
        #如果超过了规定的长度那就换行
        if sum_width > width-fontsize*2:
            line_count += 1
            sum_width = 0
            duanluo += \'\n\'
        #将生成一个带有换行的字符串
        duanluo += char
    #后面再加上一个换行
    if not duanluo.endswith(\'\n\'):
        duanluo += \'\n\'
    #可以求出段落的高度
    duanluoheight = line_count*line_height
    #生成图片
    image = Image.new(\'RGB\', (width, duanluoheight), (255, 255, 255))
    draw = ImageDraw.Draw(image)
    x, y = char_width/2, 0
    # 输出文字:
    draw.text((x, y), duanluo, font=font, fill=(0,0,0))
    # image.save(\'code.jpg\', \'jpeg\')
    return image,duanluoheight

#生成文件时要对文件名字做处理
def validateTitle(title):
    rstr = r"[\/\\\:\*\?\"\<\>\|]"  # \'/ \ : * ? " < > |\'
    new_title = re.sub(rstr, "_", title)  # 替换为下划线
    return new_title
#接口
url = "http://tu.duowan.com/index.php?r=show/getByGallery&gid="
#生成有参数的接口
url = url + jinristr + "&_=" + str(int(round(time.time() * 1000)))
resp=requests.get(url)
dataJson=json.loads(resp.content)
listdaa=dataJson[\'picInfo\']
listdaa.sort(key = lambda x:(int)(x[\'ding\']))
str = \'\'
#循环找到的数据
for i in listdaa:
    print(i[\'ding\'])
    print(i[\'add_intro\'])
    str = str+i[\'add_intro\']+"\n"
#在电脑中定义存放图片的位置并新建
path1=\'F:\\多玩爬取图片\\\'+dataJson[\'gallery_title\']
if os.path.exists(path1):
    pass
else:
    os.makedirs(path1)
#定义文件的连接
for i in listdaa:
	#后面的文件名应该是随着类型的不同而变化的
    picpath = path1+\'\\\'+validateTitle(i[\'add_intro\']+\'.jpg\')
    if not os.path.exists(picpath):
    	#下载
        urllib.request.urlretrieve(i[\'source\'], picpath)
    
#写一个文本文件,里面放着他们的文件名字,这个其实没用的
txtpath = path1 + \'\\1.txt\'
f = open(txtpath,\'w\')
f.write(str)
f.close()

#将文件名字进行拼接
for i in listdaa:
    picpath = path1+\'\\\'+validateTitle(i[\'add_intro\']+\'.jpg\')
    im = Image.open(picpath)
    immg = make_text_image(im.size[0], i[\'add_intro\'])
    zui = Image.new(im.mode, (im.size[0], im.size[1]+immg[1]))
    zui.paste(im, box=(0,0))
    zui.paste(immg[0],box=(0,im.size[1]))
    zui.save(picpath)



分类:

技术点:

相关文章:

  • 2022-02-09
  • 2021-11-19
  • 2021-06-06
  • 2021-08-02
  • 2021-12-13
  • 2021-11-21
  • 2021-09-10
猜你喜欢
  • 2022-12-23
  • 2021-09-11
  • 2022-02-22
  • 2021-06-19
  • 2021-12-17
  • 2022-02-09
相关资源
相似解决方案