diff --git a/.gitignore b/.gitignore index 496cf17..1f4bd35 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ bili.cookie .mp4 /bili.cookie /src/configs/api_config.py +/src/resources/temp diff --git a/src/clover_image/get_image.py b/src/clover_image/get_image.py index f602cd7..6285f9b 100644 --- a/src/clover_image/get_image.py +++ b/src/clover_image/get_image.py @@ -3,10 +3,9 @@ import random import requests from PIL import Image, ImageDraw,ImageFont -from src.configs.path_config import image_local_path,image_local_qq_image_path,rua_png +from src.configs.path_config import image_local_path,image_local_qq_image_path,rua_png,temp_path from src.configs.api_config import smms_token,smms_image_upload_history,ju_he_token,ju_he_image_list,app_id,bot_account - """本地图片""" def get_image_names(): image_extensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp'] # 定义常见的图片文件扩展名 @@ -134,33 +133,79 @@ class rua(): """ 图文合成 """ -def add_text_to_image(image_path, text, output_path, font_size): +async def add_text_to_image(image_path, output_path,content,font_path, font_size, text_color, position): + """ + 给图片添加文字 + :param image_path: 输入图片的路径 + :param output_path: 合成后的图片名称 + :param content: 要添加的文字内容 + :param font_path: 字体文件路径 + :param font_size: 文字的字体大小 + :param text_color: 文字颜色 (255, 0, 0) "#FF0000" "red" + :param position: 文字位置,可选值:"left", "right", "center", "top", "bottom", "top left corner", "top right corner", "bottom left corner", "bottom right corner" + :return: + """ # 打开图片 image = Image.open(image_path) # 创建一个可用于绘制的对象 draw = ImageDraw.Draw(image) - # 设置字体和字体大小 - font = ImageFont.truetype("arial.ttf", font_size) # 这里使用 Arial 字体,你可以替换为其他字体文件路径 - # 设置文本的位置和颜色 - position = (50, 50) - text_color = (255, 0, 0) # 红色 + font = ImageFont.truetype(font_path, font_size) + + wrapped_text,current_width = "",0 + + # 遍历文本中的每个字符 + for char in content: + # 获取字符的宽度 + char_width, _ = draw.textbbox((0, 0), char, font=font)[2:] + # 如果当前行的宽度加上字符宽度超过图片指定宽度,则换行 + if current_width + char_width > image.width // 2: # 这里是图片的一半 + wrapped_text += "\n" + current_width = 0 + # 将字符添加到当前行 + wrapped_text += char + # 更新当前行的宽度 + current_width += char_width + + # 获取换行后文本的宽度和高度 + text_width, text_height = draw.textbbox((0, 0), wrapped_text, font=font)[2:] + + # 根据位置参数计算文本的位置 + if position == "left": + position = (0, (image.height - text_height) // 2) + elif position == "right": + position = (image.width - text_width, (image.height - text_height) // 2) + elif position == "center": + position = ((image.width - text_width) // 2, (image.height - text_height) // 2) + elif position == "top": + position = ((image.width - text_width) // 2, 0) + elif position == "bottom": + position = ((image.width - text_width) // 2, image.height - text_height) + elif position == "top left corner": + position = (0, 0) + elif position == "top right corner": + position = (image.width - text_width, 0) + elif position == "bottom left corner": + position = (0, image.height - text_height) + elif position == "bottom right corner": + position = (image.width - text_width, image.height - text_height) # 在图片上绘制文本 - draw.text(position, text, font=font, fill=text_color) - + draw.multiline_text(position, wrapped_text, font=font, fill=text_color, align="center") # 保存合成后的图片 image.save(output_path) - print(f"合成后的图片已保存到 {output_path}") + # 关闭图片 + # image.close() + if __name__ == '__main__': - print(get_smms_image_url()) - print(get_juhe_image_url()) - print(get_image_names()) - file_path = '8A91A2F3BE5B5AF3FEC97FB5AA6D9B38.jpg' - au = rua(file_path).add_gif() - image_path = "Justice.jpg" - text = "Hello, World!" - output_path = "output.jpg" - add_text_to_image(image_path, text, output_path, font_size=48) \ No newline at end of file + # print(get_smms_image_url()) + # print(get_juhe_image_url()) + # print(get_image_names()) + # file_path = '8A91A2F3BE5B5AF3FEC97FB5AA6D9B38.jpg' + # au = rua(file_path).add_gif() + image_path = "021.png" + content = "你是很大的哈设计开发哈卡斯萨夫卡是大华饭店不是的话覆盖过海宿管会啊傻瓜金佛上帝海水淡化你是很大的哈设计开发哈卡斯萨夫卡是大华饭店不是的话覆盖u过海宿管会啊傻瓜金佛上帝海水淡化你" + output_path = "output.png" + add_text_to_image(image_path, content, output_path, "微软雅黑.ttc",text_color = (255, 0, 0),font_size=48,position="top") \ No newline at end of file diff --git a/src/configs/path_config.py b/src/configs/path_config.py index 7d09456..21cddbf 100644 --- a/src/configs/path_config.py +++ b/src/configs/path_config.py @@ -4,15 +4,22 @@ from pathlib import Path path = os.getcwd()+'/src/resources/image' -#塔罗牌图片路径 +# 塔罗牌图片路径 image_local_qq_image_path = path+'/qq_image' -#个人图片路径 +# 个人图片路径 image_local_path= path+"/MaoYuNa" -#塔罗牌图片路径 +# 塔罗牌图片路径 tarots_img_path = path+'/tarot/TarotImages/' -#摸摸头图片路径 +# 摸摸头图片路径 rua_png = path+'/rua/' +# 喜报、悲报图片路径 +good_bad = path+'/good_bad_news/' +# 字体路径 +font_path = path+'/font/' + +# 临时数据路径 +temp_path = os.getcwd()+'/src/resources/temp/' # 图片路径 @@ -21,14 +28,8 @@ IMAGE_PATH = Path() / "resources" / "image" RECORD_PATH = Path() / "resources" / "record" # 文本路径 TEXT_PATH = Path() / "resources" / "text" -# 日志路径 -LOG_PATH = Path() / "log" -# 字体路径 -FONT_PATH = Path() / "resources" / "font" # 数据路径 DATA_PATH = Path() / "data" -# 临时数据路径 -TEMP_PATH = Path() / "resources" / "temp" # 网页模板路径 TEMPLATE_PATH = Path() / "resources" / "template" diff --git a/src/plugins/good_bad_news.py b/src/plugins/good_bad_news.py index 3b2bf8f..50db662 100644 --- a/src/plugins/good_bad_news.py +++ b/src/plugins/good_bad_news.py @@ -2,43 +2,56 @@ from pathlib import Path from nonebot.rule import to_me from nonebot.plugin import on_command from nonebot.adapters.qq import Message, MessageEvent, MessageSegment, exception -import urllib.parse, requests +import urllib.parse +import requests import time import httpx +from src.clover_image.get_image import add_text_to_image +from src.configs.path_config import font_path,good_bad,temp_path -good_news = on_command("喜报", rule=to_me(), priority=10, block=True, aliases={"悲报"}) -@good_news.handle() -async def good_news_img(message: MessageEvent): - if message.get_plaintext().startswith("/喜报"): - content = message.get_plaintext().replace("/喜报", "").strip() - url = "https://cdn.uuuix.com/api/v1/xbs/xb.php?" - else: - content = message.get_plaintext().replace("/悲报", "").strip() - url = "https://cdn.uuuix.com/api/v1/xbs/biob.php?" - - params = { - 'msg': content - } - - await good_news.send("图片绘制中,请稍后~\n技术支持: JianDan大佬\nwww·uuuix·com") - - query = urllib.parse.urlencode(params) - response = requests.get(url + query).json() - - if response['code'] != 1: - await good_news.finish("请输入 /喜(悲)报+内容 哦。") - - img_url = response['url'] +# good_news = on_command("喜报", rule=to_me(), priority=10, block=True, aliases={"悲报"}) +# @good_news.handle() +# async def good_news_img(message: MessageEvent): +# if message.get_plaintext().startswith("/喜报"): +# content = message.get_plaintext().replace("/喜报", "").strip() +# url = "https://cdn.uuuix.com/api/v1/xbs/xb.php?" +# else: +# content = message.get_plaintext().replace("/悲报", "").strip() +# url = "https://cdn.uuuix.com/api/v1/xbs/biob.php?" +# +# params = { +# 'msg': content +# } +# +# await good_news.send("图片绘制中,请稍后~\n技术支持: JianDan大佬\nwww·uuuix·com") +# +# query = urllib.parse.urlencode(params) +# response = requests.get(url + query).json() +# +# if response['code'] != 1: +# await good_news.finish("请输入 /喜(悲)报+内容 哦。") +# +# img_url = response['url'] # try: # await good_news.finish(MessageSegment.clover_image(img_url)) # except BaseException: # await good_news.finish("出错啦,请重试。") - try: - await good_news.finish(MessageSegment.image(img_url)) - except exception.ActionFailed as e: - print("\033[32m" + str(time.strftime("%m-%d %H:%M:%S")) + - "\033[0m [" + "\033[31;1mFAILED\033[0m" + "]" + - "\033[31;1m nonebot.adapters.qq.exception.ActionFailed \033[0m" + str(e)) - await good_news.finish("图片发送失败,请重试。这绝对不是咱的错,绝对不是!") +good_news = on_command("喜报", rule=to_me(), priority=10, block=True, aliases={"悲报"}) +@good_news.handle() +async def function(message: MessageEvent): + value = message.get_plaintext().split(" ") + keyword,content = value[0], value[1] + if value[1] == "": + await good_news.finish("请输入 /喜(悲)报+内容 哦。") + if keyword == "/喜报": + await add_text_to_image(image_path=good_bad + "good_news.png", output_path=temp_path+"good_news.png", content=content, + font_path=font_path + "msyh.ttc", font_size=64, text_color=(255, 0, 0), + position="center") + await good_news.finish(MessageSegment.file_image(Path(temp_path+"good_news.png"))) + elif keyword == "/悲报": + await add_text_to_image(image_path=good_bad + "bad_news.png", output_path=temp_path+"bad_news.png", content=content, + font_path=font_path + "msyh.ttc", font_size=64, text_color=(128, 128, 128), + position="center") + await good_news.finish(MessageSegment.file_image(Path(temp_path+"bad_news.png"))) \ No newline at end of file diff --git a/src/resources/font/arial.ttf b/src/resources/font/arial.ttf deleted file mode 100644 index 27372d9..0000000 Binary files a/src/resources/font/arial.ttf and /dev/null differ diff --git a/src/resources/font/华文新魏.TTF b/src/resources/font/华文新魏.TTF new file mode 100644 index 0000000..afe13f4 Binary files /dev/null and b/src/resources/font/华文新魏.TTF differ diff --git a/src/resources/font/华文楷体.TTF b/src/resources/font/华文楷体.TTF new file mode 100644 index 0000000..5044116 Binary files /dev/null and b/src/resources/font/华文楷体.TTF differ diff --git a/src/resources/font/华文行楷.TTF b/src/resources/font/华文行楷.TTF new file mode 100644 index 0000000..53439a2 Binary files /dev/null and b/src/resources/font/华文行楷.TTF differ diff --git a/src/resources/font/微软雅黑.ttc b/src/resources/font/微软雅黑.ttc new file mode 100644 index 0000000..ea174b2 Binary files /dev/null and b/src/resources/font/微软雅黑.ttc differ diff --git a/src/resources/image/good_bad_news/bad_news.png b/src/resources/image/good_bad_news/bad_news.png new file mode 100644 index 0000000..e2b441c Binary files /dev/null and b/src/resources/image/good_bad_news/bad_news.png differ diff --git a/src/resources/image/good_bad_news/good_news.png b/src/resources/image/good_bad_news/good_news.png new file mode 100644 index 0000000..c2e214a Binary files /dev/null and b/src/resources/image/good_bad_news/good_news.png differ