下载地址:https://www.pan38.com/dow/share.php?code=JCnzE 提取密码:8918
这个代码实现了一个完整的抖音主页截图生成器,包含以下功能:
顶部导航栏模拟
用户信息区域(头像、用户名、ID、关注按钮)
用户数据统计(作品数、粉丝数、关注数、获赞数)
作品网格展示区
底部导航栏
自动生成水印
要运行此代码,需要安装Pillow库:pip install pillow
同时需要准备一个中文字体文件(如simhei.ttf)放在同一目录下。
import os
import random
from datetime import datetime
from PIL import Image, ImageDraw, ImageFont
class DouyinProfileGenerator:
def init(self):
self.width = 1080
self.height = 1920
self.bg_color = (255, 255, 255)
self.primary_color = (0, 0, 0)
self.secondary_color = (100, 100, 100)
self.accent_color = (255, 0, 80)
self.font_path = "simhei.ttf"
def generate_profile(self, username, followers, following, likes, avatar_path=None):
# 创建画布
img = Image.new('RGB', (self.width, self.height), self.bg_color)
draw = ImageDraw.Draw(img)
# 绘制顶部导航栏
self._draw_navbar(draw)
# 绘制用户信息区域
self._draw_user_info(draw, username, followers, following, likes, avatar_path)
# 绘制作品展示区域
self._draw_content_grid(draw)
# 添加底部导航栏
self._draw_bottom_nav(draw)
# 添加水印
self._add_watermark(draw)
return img
def _draw_navbar(self, draw):
# 绘制顶部导航栏
draw.rectangle([(0, 0), (self.width, 120)], fill=(255, 255, 255))
draw.line([(0, 120), (self.width, 120)], fill=(200, 200, 200), width=1)
# 添加返回箭头
draw.polygon([(30, 60), (60, 30), (60, 90)], fill=self.primary_color)
# 添加标题
font = ImageFont.truetype(self.font_path, 40)
draw.text((self.width/2, 60), "抖音", fill=self.primary_color, font=font, anchor="mm")
# 添加搜索图标
draw.ellipse([(self.width-100, 30), (self.width-60, 70)], outline=self.primary_color, width=2)
draw.line([(self.width-80, 70), (self.width-60, 90)], fill=self.primary_color, width=2)
def _draw_user_info(self, draw, username, followers, following, likes, avatar_path):
# 绘制头像
avatar_size = 120
avatar_x = 60
avatar_y = 180
if avatar_path and os.path.exists(avatar_path):
avatar = Image.open(avatar_path).resize((avatar_size, avatar_size))
mask = Image.new('L', (avatar_size, avatar_size), 0)
draw_mask = ImageDraw.Draw(mask)
draw_mask.ellipse([(0, 0), (avatar_size, avatar_size)], fill=255)
img.paste(avatar, (avatar_x, avatar_y), mask)
else:
draw.ellipse([(avatar_x, avatar_y), (avatar_x+avatar_size, avatar_y+avatar_size)],
fill=(200, 200, 200))
font = ImageFont.truetype(self.font_path, 60)
draw.text((avatar_x+avatar_size/2, avatar_y+avatar_size/2), "T",
fill=(100, 100, 100), font=font, anchor="mm")
# 绘制用户名
font = ImageFont.truetype(self.font_path, 40)
draw.text((avatar_x+avatar_size+30, avatar_y+20), username, fill=self.primary_color, font=font)
# 绘制用户ID
font = ImageFont.truetype(self.font_path, 30)
draw.text((avatar_x+avatar_size+30, avatar_y+70), f"抖音号: dy{random.randint(10000000, 99999999)}",
fill=self.secondary_color, font=font)
# 绘制关注按钮
follow_btn_x = self.width - 180
follow_btn_y = avatar_y + 30
draw.rounded_rectangle([(follow_btn_x, follow_btn_y),
(follow_btn_x+120, follow_btn_y+60)],
radius=30, fill=self.accent_color)
font = ImageFont.truetype(self.font_path, 30)
draw.text((follow_btn_x+60, follow_btn_y+30), "关注", fill=(255, 255, 255),
font=font, anchor="mm")
# 绘制粉丝、关注、获赞数据
stats_y = avatar_y + avatar_size + 40
stats = [
("作品", random.randint(10, 500)),
("粉丝", followers),
("关注", following),
("获赞", likes)
]
for i, (label, value) in enumerate(stats):
x = 60 + i * (self.width - 120) / 4
font = ImageFont.truetype(self.font_path, 35)
draw.text((x, stats_y), str(value), fill=self.primary_color, font=font, anchor="mt")
font = ImageFont.truetype(self.font_path, 25)
draw.text((x, stats_y+40), label, fill=self.secondary_color, font=font, anchor="mt")
# 绘制简介
bio_y = stats_y + 100
font = ImageFont.truetype(self.font_path, 30)
bio = "这个人很懒,什么都没留下~" if random.random() < 0.5 else "感谢关注,持续更新中!"
draw.text((60, bio_y), bio, fill=self.primary_color, font=font)
def _draw_content_grid(self, draw):
# 绘制作品网格
grid_start_y = 600
grid_padding = 2
item_size = (self.width - grid_padding * 2) // 3
for row in range(4):
for col in range(3):
x = col * (item_size + grid_padding)
y = grid_start_y + row * (item_size + grid_padding)
# 随机生成封面颜色
color = (random.randint(100, 200), random.randint(100, 200), random.randint(100, 200))
draw.rectangle([(x, y), (x+item_size, y+item_size)], fill=color)
# 添加播放量
views = f"{random.randint(1, 999)}.{random.randint(0, 9)}w"
font = ImageFont.truetype(self.font_path, 25)
draw.text((x+10, y+10), views, fill=(255, 255, 255), font=font)
# 添加时长
duration = f"{random.randint(0, 3)}:{random.randint(0, 59):02d}"
font = ImageFont.truetype(self.font_path, 25)
draw.text((x+item_size-60, y+item_size-40), duration, fill=(255, 255, 255), font=font)
def _draw_bottom_nav(self, draw):
# 绘制底部导航栏
nav_height = 120
nav_y = self.height - nav_height
draw.rectangle([(0, nav_y), (self.width, self.height)], fill=(255, 255, 255))
draw.line([(0, nav_y), (self.width, nav_y)], fill=(200, 200, 200), width=1)
# 绘制导航图标
icons = ["首页", "朋友", "拍摄", "消息", "我"]
for i, icon in enumerate(icons):
x = self.width / 5 * i + self.width / 10
y = nav_y + 30
font = ImageFont.truetype(self.font_path, 25)
color = self.accent_color if icon == "我" else self.secondary_color
draw.text((x, y), icon, fill=color, font=font, anchor="mt")
def _add_watermark(self, draw):
font = ImageFont.truetype(self.font_path, 20)
watermark = f"生成于 {datetime.now().strftime('%Y-%m-%d %H:%M')}"
draw.text((self.width-20, self.height-20), watermark, fill=(200, 200, 200),
font=font, anchor="rd")
if name == "main":
generator = DouyinProfileGenerator()
# 生成示例截图
profile = generator.generate_profile(
username="测试用户",
followers=12345,
following=678,
likes=98765,
avatar_path=None # 可以传入头像路径
)
# 保存图片
profile.save("douyin_profile.png")
print("抖音主页截图已生成: douyin_profile.png")