[应用开发]一键直出AJ同款日历
[应用开发]一键直出AJ同款日历
[应用开发]一键直出AJ同款日历 [应用开发]一键直出AJ同款日历 Modified December 10, 2025 1157 1219 💡 作者:吵爷 AJ开始发年前征集的2025日历了,好看么???但是没入围拿不到...于是自己手搓了一个乞丐版的,有兴趣自己做日历,或者用来做社群分发的同学,可以拿过去直接用。目前需要手动修改图片,作者信息和社区信息,如果有需要也可以魔改做自己的本地数据库,根据日期直接识别。 PS. 这里设置的默认字体,英文为 Arial,中文为 Microsoft YaHei,需要调整字体在文档里查找+替换就行 下面是完整的代码,根据自己的需求修改黄色的部分即可 Code block Bash "头像.png": AVATAR PATH, "main.png": MAIN IMAGE PATH, "QRcode.png": QRCODE PATH, "logo.png": LOGO PATH } for img name, img path in required images.items(): if not os.path.exists(img path): raise ValueError(f"找不到必需的图片文件:{img name}") 获取当前日期 today = datetime.datetime.now() 动态获取中文星期 WEEKDAY CHINESE = { "Monday": "星期一", "Tuesday": "星期二", "Wednesday": "星期三", "Thursday": "星期四", "Friday": "星期五", "Saturday": "星期六", "Sunday": "星期日" } weekday chinese = WEEKDAY CHINESE[today.strftime("%A")] 自动计算农历日期 solar = Solar(today.year, today.month, today.day) lunar = Converter.Solar2Lunar(solar) 定义农历月份和日期的中文表示 LUNAR MONTHS = ["正月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "冬月", "腊月"] LUNAR DAYS = [ "初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十", "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十" ] lunar date str = f"{LUNAR MONTHS[lunar.month 1]}{LUNAR DAYS[lunar.day 1]}" class Content: """ 文案和样式的配置类 """ ===== 自定义文案文案区域 ===== USERNAME = "Joey" USER INFO = "冒牌AI艺术家,双鱼座,INTP" IMAGE DESCRIPTION = "真心为你,岁月为证" TODAY ACTIVITY = "生成式AI视频竞赛,Project Odyssey第二季" COMMUNITY UPDATE = "非常震撼!白宫发布AI时代的规则 \nOpenAI的经济蓝图显示其新地位" 注意:如果需要换行,在前面加上 \n即可 生成多行文本的函数 def generate multiline text(base x, base y, text, font family, font size, fill, line height=40): lines = text.split("\n") svg lines = [] for i, line in enumerate(lines): y position = base y + i line height svg lines.append( f'<text x="{base x}" y="{y position}" font family="{font family}" font size="{font size}" fill="{fill}" {line}</text ' ) return "\n".join(svg lines) 处理主图片:裁剪和缩放 def process main image(image path, output folder): with Image.open(image path) as img: 转换图片模式为RGB(处理PNG透明通道) if img.mode in ('RGBA', 'LA') or (img.mode == 'P' and 'transparency' in img.info): bg = Image.new('RGB', img.size, 'white') if img.mode == 'P': img = img.convert('RGBA') bg.paste(img, mask=img.split()[3] if img.mode == 'RGBA' else None) img = bg 先裁剪成正方形 width, height = img.size size = min(width, height) left = (width size) // 2 top = (height size) // 2 right = left + size bottom = top + size img = img.crop((left, top, right, bottom)) 然后缩放到700x700 img = img.resize((700, 700), Image.Resampling.LANCZOS) 保存处理后的图片 temp cropped path = os.path.join(output folder, "cropped main.png") img.save(temp cropped path, "PNG") return temp cropped path 处理主图片并获取裁剪后的图片路径 cropped main image path = process main image(MAIN IMAGE PATH, OUTPUT FOLDER) 更新SVG内容生成 svg content = f""" <svg xmlns="http://www.w3.org/2000/svg" width="1242" height="2000" viewBox="0 0 1242 2000" <! 背景 <rect width="100%" height="100%" fill="white" / <! 日期区域 <text x="80" y="240" font family="Arial" font size="240" font weight="bold" fill="black" {today.day}</text <text x="680" y="120" font family="Microsoft YaHei" font size="48" font weight="bold" text anchor="start" fill="black" {lunar date str}</text <text x="680" y="180" font family="Microsoft YaHei" font size="44" text anchor="start" fill="black" {today.strftime("%Y.%m")}</text <text x="680" y="240" font family="Microsoft YaHei" font size="48" font weight="bold" text anchor="start" fill="black" {weekday chinese}</text <! 分隔线 <line x1="80" y1="280" x2="900" y2="280" stroke="black" stroke width="6" / <! 用户信息 <circle cx="185" cy="360" r="50" fill="url( avatarPattern)" / <defs <pattern id="avatarPattern" patternUnits="objectBoundingBox" width="1" height="1" <image href="{AVATAR PATH}" x="0" y="0" width="130" height="130" preserveAspectRatio="xMidYMid slice" / </pattern </defs <text x="250" y="355" font family="Microsoft YaHei" font size="40" font weight="bold" fill="black" {Content.USERNAME}</text <text x="250" y="405" font family="Microsoft YaHei" font size="28" fill=" 666" {Content.USER INFO}</text <! 主图片(带圆角) <clipPath id="roundedRect" <rect x="140" y="450" width="700" height="700" rx="20" ry="20"/ </clipPath <image x="140" y="450" width="700" height="700" href="{cropped main image path}" clip path="url( roundedRect)"/ <! 图片描述 <text x=\"140\" y=\"1200\" font family=\"Microsoft YaHei\" font size=\"32\" font weight=\"bold\" fill=\"black\" {Content.IMAGE DESCRIPTION}</text <! Logo <image href=\"{LOGO PATH}\" x=\"140\" y=\"1215\" width=\"350\" height=\"50\" preserveAspectRatio=\"xMidYMid meet\"/ <! 活动推荐 <text x=\"140\" y=\"1310\" font family=\"Microsoft YaHei\" font size=\"32\" font weight=\"bold\" fill=\"black\" ✓ 今日活动推荐🔥</text {generate multiline text(170, 1350, Content.TODAY ACTIVITY, "Microsoft YaHei", 28, " 333")} <! 社区日报 <text x="140" y="1430" font family="Microsoft YaHei" font size="32" font weight="bold" fill="black" ✓ 社区日报更新📅</text {generate multiline text(170, 1470, Content.COMMUNITY UPDATE, "Microsoft YaHei", 28, " 333")} <! 二维码 <image href="{QRCODE PATH}" x="720" y="1400" width="180" height="180" preserveAspectRatio="xMidYMid meet"/ </svg """ 保存为SVG文件 os.makedirs(OUTPUT FOLDER, exist ok=True) with open(SVG OUTPUT, "w", encoding="utf 8") as svg file: svg file.write(svg content) print(f"生成的SVG文件已保存到:{SVG OUTPUT}") 山寨版成品,主打一个一键无脑 💡 作者:吵爷 AJ开始发年前征集的2025日历了,好看么???但是没入围拿不到...于是自己手搓了一个乞丐版的,有兴趣自己做日历,或者用来做社群分发的同学,可以拿过去直接用。目前需要手动修改图片,作者信息和社区信息,如果有需要也可以魔改做自己的本地数据库,根据日期直接识别。 PS. 这里设置的默认字体,英文为 Arial,中文为 Microsoft YaHei,需要调整字体在文档里查找+替换就行 作者:吵爷 AJ开始发年前征集的2025日历了,好看么???但是没入围拿不到...于是自己手搓了一个乞丐版的,有兴趣自己做日历,或者用来做社群分发的同学,可以拿过去直接用。目前需要手动修改图片,作者信息和社区信息,如果有需要也可以魔改做自己的本地数据库,根据日期直接识别。 PS. 这里设置的默认字体,英文为 Arial,中文为 Microsoft YaHei,需要调整字体在文档里查找+替换就行 下面是完整的代码,根据自己的需求修改黄色的部分即可 山寨版成品,主打一个一键无脑