From d20418376d76db2cf655cc7a0e5667755b03b587 Mon Sep 17 00:00:00 2001 From: KimigaiiWuyi <444835641@qq.com> Date: Tue, 21 Nov 2023 00:32:20 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=E4=B8=BA=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E7=9A=84=E5=B9=B3=E5=8F=B0=E6=B7=BB=E5=8A=A0=E6=9B=B4=E5=A4=9A?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GenshinUID/genshinuid_abyss/__init__.py | 7 +- GenshinUID/genshinuid_collection/__init__.py | 28 ++++++- .../draw_new_collection_card.py | 79 +++++++++++++++--- .../genshinuid_collection/texture2D/bg.jpg | Bin 0 -> 39020 bytes GenshinUID/genshinuid_enka/__init__.py | 71 +++++++++++++--- GenshinUID/genshinuid_etcimg/__init__.py | 11 ++- GenshinUID/genshinuid_eventlist/__init__.py | 9 +- GenshinUID/genshinuid_gachalog/__init__.py | 8 +- GenshinUID/genshinuid_gcg/__init__.py | 7 +- GenshinUID/genshinuid_guide/__init__.py | 5 +- .../genshinuid_wikitext/get_cost_pic.py | 13 +-- GenshinUID/utils/image/image_tools.py | 52 ++++++++---- 12 files changed, 232 insertions(+), 58 deletions(-) create mode 100644 GenshinUID/genshinuid_collection/texture2D/bg.jpg diff --git a/GenshinUID/genshinuid_abyss/__init__.py b/GenshinUID/genshinuid_abyss/__init__.py index 767d553a..630e80c9 100644 --- a/GenshinUID/genshinuid_abyss/__init__.py +++ b/GenshinUID/genshinuid_abyss/__init__.py @@ -3,6 +3,7 @@ import re from gsuid_core.sv import SV from gsuid_core.bot import Bot from gsuid_core.models import Event +from gsuid_core.message_models import Button from gsuid_core.utils.error_reply import UID_HINT from ..utils.convert import get_uid @@ -48,4 +49,8 @@ async def send_abyss_info(bot: Bot, ev: Event): await bot.logger.info('[查询深渊信息]深渊层数: {}'.format(floor)) im = await draw_abyss_img(user_id, uid, floor, schedule_type) - await bot.send(im) + a = Button('🔍查询深渊11', '查询深渊11') + b = Button('🔚查询上期深渊', '查询上期深渊') + c = Button('♾️深渊概览', '深渊概览') + d = Button('👾怪物阵容', '版本深渊') + await bot.send_option(im, [a, b, c, d]) diff --git a/GenshinUID/genshinuid_collection/__init__.py b/GenshinUID/genshinuid_collection/__init__.py index fe2af925..ab8a3be2 100644 --- a/GenshinUID/genshinuid_collection/__init__.py +++ b/GenshinUID/genshinuid_collection/__init__.py @@ -1,15 +1,35 @@ from gsuid_core.sv import SV from gsuid_core.bot import Bot from gsuid_core.models import Event +from gsuid_core.message_models import Button from gsuid_core.utils.error_reply import UID_HINT from ..utils.convert import get_uid +from .draw_new_collection_card import draw_explore from .draw_collection_card import draw_explora_img, draw_collection_img +sv_cp = SV('查询完成度') sv_sj = SV('查询收集') sv_ts = SV('查询探索') +@sv_cp.on_command(('查询完成度', 'wcd'), block=True) +async def send_cp_info(bot: Bot, ev: Event): + await bot.logger.info('开始执行[查询完成度信息]') + # user_id = ev.at if ev.at else ev.user_id + + # 获取uid + uid = await get_uid(bot, ev) + if uid is None: + return await bot.send(UID_HINT) + await bot.logger.info('[查询角色面板]uid: {}'.format(uid)) + + im = await draw_explore(uid) + a = Button('🔍查询探索', '查询探索') + b = Button('🔍查询收集', '查询收集') + await bot.send_option(im, [a, b]) + + @sv_sj.on_command(('查询收集', 'sj'), block=True) async def send_collection_info(bot: Bot, ev: Event): await bot.logger.info('开始执行[查询收集信息]') @@ -22,7 +42,9 @@ async def send_collection_info(bot: Bot, ev: Event): await bot.logger.info('[查询角色面板]uid: {}'.format(uid)) im = await draw_collection_img(user_id, uid) - await bot.send(im) + a = Button('🔍查询探索', '查询探索') + b = Button('🔍查询收集', '查询收集') + await bot.send_option(im, [a, b]) @sv_ts.on_command(('查询探索', 'ts'), block=True) @@ -37,4 +59,6 @@ async def send_explora_info(bot: Bot, ev: Event): await bot.logger.info('[查询角色面板]uid: {}'.format(uid)) im = await draw_explora_img(user_id, uid) - await bot.send(im) + a = Button('🔍查询探索', '查询探索') + b = Button('🔍查询收集', '查询收集') + await bot.send_option(im, [a, b]) diff --git a/GenshinUID/genshinuid_collection/draw_new_collection_card.py b/GenshinUID/genshinuid_collection/draw_new_collection_card.py index 53f1574b..296d826e 100644 --- a/GenshinUID/genshinuid_collection/draw_new_collection_card.py +++ b/GenshinUID/genshinuid_collection/draw_new_collection_card.py @@ -1,8 +1,17 @@ -from PIL import Image +from PIL import Image, ImageDraw +from gsuid_core.utils.image.convert import convert_img +from gsuid_core.utils.image.image_tools import crop_center_img from gsuid_core.utils.download_resource.download_image import get_image from ..utils.resource.RESOURCE_PATH import ICON_PATH +from ..utils.image.image_tools import shift_image_hue from .draw_collection_card import TEXT_PATH, get_base_data +from ..utils.fonts.genshin_fonts import ( + gs_font_15, + gs_font_20, + gs_font_24, + gs_font_32, +) async def draw_explore(uid: str): @@ -12,14 +21,62 @@ async def draw_explore(uid: str): ): return raw_data - worlds = raw_data['world_explorations'] - for world in worlds: - area_bg = ( - Image.open(TEXT_PATH / 'area_bg') - .resize((216, 216)) - .convert('RGBA') - ) - icon = await get_image(world['icon'], ICON_PATH) - # percent = world['exploration_percentage'] + r = 20 + half_white = (255, 255, 255, 120) + white = (255, 255, 255) + black = (2, 2, 2) - area_bg.paste(icon, (27, 27), icon) + worlds = raw_data['world_explorations'] + + image = crop_center_img(Image.open(TEXT_PATH / 'bg.jpg'), 1400, 950) + + for index, world in enumerate(worlds): + area_bg = Image.open(TEXT_PATH / 'area_bg.png') + area_bg = await shift_image_hue(area_bg, 30) + icon = await get_image(world['icon'], ICON_PATH) + icon = icon.resize((150, 150)).convert('RGBA') + + percent = world['exploration_percentage'] + name = world['name'] + if '·' in name: + name = name.split('·')[-1] + rank = f'等阶{world["level"]}' + + completion = f'探索完成度: {percent / 10}%' + + area_bg.paste(icon, (75, 36), icon) + + area_draw = ImageDraw.Draw(area_bg) + + # 标题 + area_draw.text((150, 216), name, white, gs_font_32, 'mm') + + # 等阶 + area_draw.rounded_rectangle((98, 240, 201, 270), r, (137, 14, 14)) + area_draw.text((150, 255), rank, white, gs_font_24, 'mm') + + # 进度条 + lenth = percent * 182 / 1000 + area_draw.rounded_rectangle((59, 283, 241, 295), r, half_white) + area_draw.rounded_rectangle((59, 283, 59 + lenth, 295), r, white) + area_draw.text((150, 320), completion, white, gs_font_20, 'mm') + + # 副等阶,如果有的话 + if world['offerings']: + odata = world['offerings'][0] + oicon = await get_image(odata['icon'], ICON_PATH) + oicon = oicon.resize((38, 38)).convert('RGBA') + orank = f"等阶{odata['level']}" + + area_draw.rounded_rectangle((59, 340, 241, 387), r, half_white) + area_bg.paste(oicon, (63, 343), oicon) + area_draw.text((107, 352), odata['name'], black, gs_font_20, 'lm') + area_draw.rounded_rectangle((107, 364, 173, 384), r, (137, 14, 14)) + area_draw.text((140, 374), orank, white, gs_font_15, 'mm') + + image.paste( + area_bg, + (100 + 240 * (index % 5), 25 + 450 * (index // 5)), + area_bg, + ) + return await convert_img(image) diff --git a/GenshinUID/genshinuid_collection/texture2D/bg.jpg b/GenshinUID/genshinuid_collection/texture2D/bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..693fe83c697b42ca4e956c06ea33681e95910863 GIT binary patch literal 39020 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 Fe*(M=XsiGL literal 0 HcmV?d00001 diff --git a/GenshinUID/genshinuid_enka/__init__.py b/GenshinUID/genshinuid_enka/__init__.py index cfc0d4ff..0379d97f 100644 --- a/GenshinUID/genshinuid_enka/__init__.py +++ b/GenshinUID/genshinuid_enka/__init__.py @@ -8,6 +8,7 @@ from gsuid_core.sv import SV from gsuid_core.bot import Bot from gsuid_core.models import Event from gsuid_core.logger import logger +from gsuid_core.message_models import Button from gsuid_core.utils.error_reply import UID_HINT from .to_data import switch_api @@ -50,7 +51,14 @@ async def sned_rank_pic(bot: Bot, ev: Event): if uid is None: return await bot.send(UID_HINT) logger.info(f'[排名列表]uid: {uid}') - await bot.send(await draw_rank_img(ev.user_id, uid)) + im = await draw_rank_img(ev.user_id, uid) + await bot.send_option( + im, + [ + Button('♾️角色排名公子', '角色排名公子'), + Button('♾️圣遗物双爆排名', '圣遗物排名双爆'), + ], + ) @sv_akasha.on_prefix('角色排名') @@ -68,7 +76,16 @@ async def sned_arti_rank_pic(bot: Bot, ev: Event): # 获取排序名 msg = ''.join(re.findall('[\u4e00-\u9fa5 ]', ev.text)) logger.info(f'[圣遗物排名]排序: {msg}') - await bot.send(await draw_arti_rank_img(msg)) + im = await draw_arti_rank_img(msg) + await bot.send_option( + im, + [ + Button('♾️双爆排名', '圣遗物排名双爆'), + Button('♾️暴击率排名', '圣遗物排名暴击率'), + Button('♾️元素精通排名', '圣遗物排名元素精通'), + Button('♾️暴击伤害排名', '圣遗物排名暴击伤害'), + ], + ) @sv_enka_admin.on_fullmatch('刷新全部圣遗物仓库') @@ -108,7 +125,16 @@ async def sned_aritifacts_list(bot: Bot, ev: Event): else: num = 1 - await bot.send(await draw_lib(ev.user_id, uid, num)) + im = await draw_lib(ev.user_id, uid, num) + await bot.send_option( + im, + [ + Button('♾️双爆排名', '圣遗物排名双爆'), + Button('♾️暴击率排名', '圣遗物排名暴击率'), + Button('♾️元素精通排名', '圣遗物排名元素精通'), + Button('♾️暴击伤害排名', '圣遗物排名暴击伤害'), + ], + ) @sv_get_original_pic.on_fullmatch(('原图')) @@ -128,7 +154,8 @@ async def send_change_api_info(bot: Bot, ev: Event): @sv_get_enka.on_prefix('查询') async def send_char_info(bot: Bot, ev: Event): - im = await _get_char_info(bot, ev, ev.text) + name = ev.text.strip() + im = await _get_char_info(bot, ev, name) if isinstance(im, str): await bot.send(im) elif isinstance(im, Tuple): @@ -136,7 +163,15 @@ async def send_char_info(bot: Bot, ev: Event): img = await convert_img(im[0]) else: img = im[0] - await bot.send(img) + await bot.send_option( + img, + [ + Button('🔄更换武器', f'查询{name}换'), + Button('⏫提高命座', f'查询六命{name}'), + Button('*️⃣保存面板', f'保存面板{name}为 '), + Button('🔀对比面板', f'对比面板 {name} '), + ], + ) if im[1]: with open(TEMP_PATH / f'{ev.msg_id}.jpg', 'wb') as f: f.write(im[1]) @@ -162,8 +197,10 @@ async def _get_char_info(bot: Bot, ev: Event, text: str): return im -@sv_get_enka.on_prefix('对比面板') +@sv_get_enka.on_command('对比面板') async def contrast_char_info(bot: Bot, ev: Event): + if not ev.text.strip(): + return await bot.send('参考格式: 对比面板 公子 公子换可莉圣遗物') contrast_list = ev.text.strip().split(' ') if len(contrast_list) <= 1: return await bot.send('输入格式错误...参考格式: 对比面板 公子 公子换可莉圣遗物') @@ -194,8 +231,10 @@ async def contrast_char_info(bot: Bot, ev: Event): await bot.send(await convert_img(base_img)) -@sv_get_enka.on_prefix('保存面板') +@sv_get_enka.on_command('保存面板') async def save_char_info(bot: Bot, ev: Event): + if not ev.text.strip(): + return await bot.send('后面需要跟自定义的保存名字\n例如:保存面板公子为核爆公子') save_list = ev.text.strip().split('为') if len(save_list) <= 1: return await bot.send('输入格式错误...参考格式: 保存面板公子为核爆公子') @@ -241,10 +280,16 @@ async def save_char_info(bot: Bot, ev: Event): path = SELF_PATH / f'{save_name}.json' async with aiofiles.open(path, 'wb') as file: await file.write(json.dumps(char_data).encode('utf-8')) - return await bot.send(f'保存成功!你可以使用[查询{save_name}]调用该面板!') + return await bot.send_option( + f'保存成功!你可以使用[查询{save_name}]调用该面板!', + [ + Button(f'✅查询{save_name}', f'查询{save_name}'), + Button('💖刷新面板', '刷新面板'), + ], + ) -@sv_get_enka.on_command('强制刷新') +@sv_get_enka.on_command(('强制刷新', '刷新面板')) async def send_card_info(bot: Bot, ev: Event): uid = await get_uid(bot, ev) if uid is None: @@ -254,7 +299,13 @@ async def send_card_info(bot: Bot, ev: Event): logger.info(f'UID{uid}获取角色数据成功!') if isinstance(im, Tuple): - await bot.send_option(im[0], [f'查询{i["avatarName"]}' for i in im[1]]) + buttons = [ + Button(f'✅查询{i["avatarName"]}', f'查询{i["avatarName"]}') + for i in im[1] + ] + buttons.append(Button('📦圣遗物仓库', '圣遗物仓库')) + buttons.append(Button('💖排名列表', '排名列表')) + await bot.send_option(im[0], buttons) else: await bot.send(im) diff --git a/GenshinUID/genshinuid_etcimg/__init__.py b/GenshinUID/genshinuid_etcimg/__init__.py index 21142907..361d97a2 100644 --- a/GenshinUID/genshinuid_etcimg/__init__.py +++ b/GenshinUID/genshinuid_etcimg/__init__.py @@ -3,6 +3,7 @@ from pathlib import Path from gsuid_core.sv import SV from gsuid_core.bot import Bot from gsuid_core.models import Event +from gsuid_core.message_models import Button from ..version import Genshin_version from ..utils.image.convert import convert_img @@ -28,7 +29,9 @@ async def send_primogems_data(bot: Bot, ev: Event): primogems_img = PRIMOGEMS_DATA_PATH / img await bot.logger.info('[图片][版本规划]访问图片: {}'.format(img)) primogems_img = await convert_img(primogems_img) - await bot.send(primogems_img) + a = Button('📄版本规划4.3', '版本规划4.3') + b = Button('🔔今日材料', '今日材料') + await bot.send_option(primogems_img, [a, b]) @sv_etc_img.on_fullmatch(('伤害乘区', '血量表', '抗性表', '血量排行')) @@ -36,6 +39,10 @@ async def send_img_data(bot: Bot, ev: Event): await bot.logger.info('开始执行[图片][杂图]') img = IMG_PATH / f'{ev.command}.jpg' if img.exists(): - await bot.send(await convert_img(img)) + a = Button('👾怪物血量表', '血量表') + b = Button('👾怪物抗性表', '抗性表') + c = Button('👾怪物血量排行', '血量排行') + d = Button('🤖伤害乘区', '伤害乘区') + await bot.send_option(await convert_img(img), [a, b, c, d]) else: return diff --git a/GenshinUID/genshinuid_eventlist/__init__.py b/GenshinUID/genshinuid_eventlist/__init__.py index 5c22306b..78fa171f 100644 --- a/GenshinUID/genshinuid_eventlist/__init__.py +++ b/GenshinUID/genshinuid_eventlist/__init__.py @@ -2,6 +2,7 @@ from gsuid_core.sv import SV from gsuid_core.bot import Bot from gsuid_core.models import Event from gsuid_core.aps import scheduler +from gsuid_core.message_models import Button from ..utils.image.convert import convert_img from .draw_event_img import get_event_img, get_all_event_img @@ -17,10 +18,14 @@ async def draw_event(): @sv_event_list.on_fullmatch('活动列表') async def send_events(bot: Bot, ev: Event): img = await get_event_img('EVENT') - await bot.send(await convert_img(img)) + a = Button('📢原神公告列表', '原神公告') + b = Button('💞卡池列表', '卡池列表') + await bot.send_option(await convert_img(img), [a, b]) @sv_event_list.on_fullmatch('卡池列表') async def send_gachas(bot: Bot, ev: Event): img = await get_event_img('GACHA') - await bot.send(await convert_img(img)) + a = Button('📢原神公告列表', '原神公告') + b = Button('💝活动列表', '活动列表') + await bot.send_option(await convert_img(img), [a, b]) diff --git a/GenshinUID/genshinuid_gachalog/__init__.py b/GenshinUID/genshinuid_gachalog/__init__.py index f493f58f..fc36733f 100644 --- a/GenshinUID/genshinuid_gachalog/__init__.py +++ b/GenshinUID/genshinuid_gachalog/__init__.py @@ -1,6 +1,7 @@ from gsuid_core.sv import SV from gsuid_core.bot import Bot from gsuid_core.models import Event +from gsuid_core.message_models import Button from gsuid_core.segment import MessageSegment from gsuid_core.utils.error_reply import UID_HINT from gsuid_core.utils.database.models import GsBind @@ -45,7 +46,10 @@ async def send_gacha_log_card_info(bot: Bot, ev: Event): if uid is None: return await bot.send(UID_HINT) im = await draw_gachalogs_img(uid, user_id) - await bot.send(im) + a = Button('🔁刷新抽卡记录', '刷新抽卡记录') + b = Button('🔜导出抽卡记录至提瓦特小助手', '导出抽卡记录到小助手') + c = Button('🔙从提瓦特小助手导入抽卡记录', '从小助手导入抽卡记录') + await bot.send_option(im, [[a], [b], [c]]) @sv_refresh_gacha_log.on_fullmatch(('刷新抽卡记录', '强制刷新抽卡记录')) @@ -60,7 +64,7 @@ async def send_refresh_gacha_info(bot: Bot, ev: Event): is_force = True await bot.send(f'UID{uid}开始执行[刷新抽卡记录],需要一定时间...请勿重复触发!') im = await save_gachalogs(uid, None, is_force) - await bot.send(im) + await bot.send_option(im, [Button('🃏抽卡记录', '抽卡记录')]) @sv_export_gacha_log.on_fullmatch(('导出抽卡记录')) diff --git a/GenshinUID/genshinuid_gcg/__init__.py b/GenshinUID/genshinuid_gcg/__init__.py index f0710fbb..cb0400b8 100644 --- a/GenshinUID/genshinuid_gcg/__init__.py +++ b/GenshinUID/genshinuid_gcg/__init__.py @@ -1,6 +1,7 @@ from gsuid_core.sv import SV from gsuid_core.bot import Bot from gsuid_core.models import Event +from gsuid_core.message_models import Button from gsuid_core.utils.error_reply import UID_HINT from ..utils.convert import get_uid @@ -10,7 +11,7 @@ from .draw_gcginfo import draw_gcg_info sv_gcg = SV('查询七圣') -@sv_gcg.on_command(('七圣召唤', 'qszh')) +@sv_gcg.on_command(('七圣召唤', 'qszh', '七圣数据总览')) async def send_gcg_pic(bot: Bot, ev: Event): uid = await get_uid(bot, ev) if uid is None: @@ -18,7 +19,7 @@ async def send_gcg_pic(bot: Bot, ev: Event): await bot.logger.info('[七圣召唤]uid: {}'.format(uid)) im = await draw_gcg_info(uid) - await bot.send(im) + await bot.send_option(im, [Button('✅我的卡组', '我的卡组')]) @sv_gcg.on_command(('我的卡组', '我的牌组')) @@ -34,4 +35,4 @@ async def send_deck_pic(bot: Bot, ev: Event): else: return bot.send('请输入正确的序号, 例如我的卡组1...') im = await draw_deck_img(ev.user_id, uid, deck_id) - await bot.send(im) + await bot.send_option(im, [Button('✅七圣数据总览', '七圣召唤')]) diff --git a/GenshinUID/genshinuid_guide/__init__.py b/GenshinUID/genshinuid_guide/__init__.py index cfcff039..e99c101a 100644 --- a/GenshinUID/genshinuid_guide/__init__.py +++ b/GenshinUID/genshinuid_guide/__init__.py @@ -4,6 +4,7 @@ from typing import List from gsuid_core.sv import SV from gsuid_core.bot import Bot from gsuid_core.models import Event +from gsuid_core.message_models import Button from gsuid_core.segment import MessageSegment from .get_guide import get_gs_guide @@ -25,7 +26,7 @@ async def send_guide_pic(bot: Bot, ev: Event): if im: await bot.logger.info('获得{}攻略成功!'.format(ev.text)) - await bot.send(im) + await bot.send_option(im, [Button(f'🎴参考面板{ev.text}', '参考面板{ev.text}')]) else: await bot.logger.warning('未找到{}攻略图片'.format(ev.text)) @@ -40,7 +41,7 @@ async def send_bluekun_pic(bot: Bot, ev: Event): if img.exists(): img = await convert_img(img) await bot.logger.info('获得{}参考面板图片成功!'.format(name)) - await bot.send(img) + await bot.send_option(img, [Button(f'🎴{name}攻略', f'{name}攻略')]) else: await bot.logger.warning('未找到{}参考面板图片'.format(name)) diff --git a/GenshinUID/genshinuid_wikitext/get_cost_pic.py b/GenshinUID/genshinuid_wikitext/get_cost_pic.py index 4fc86cc9..0efc2e30 100644 --- a/GenshinUID/genshinuid_wikitext/get_cost_pic.py +++ b/GenshinUID/genshinuid_wikitext/get_cost_pic.py @@ -16,6 +16,12 @@ from ..utils.get_assets import get_assets_from_ambr from ..utils.map.name_covert import name_to_avatar_id from ..utils.image.convert import str_lenth, convert_img from ..utils.resource.RESOURCE_PATH import CHAR_PATH, WIKI_COST_CHAR_PATH +from ..utils.image.image_tools import ( + get_star_png, + get_simple_bg, + get_unknown_png, + draw_pic_with_ring, +) from ..utils.fonts.genshin_fonts import ( gs_font_24, gs_font_26, @@ -23,12 +29,6 @@ from ..utils.fonts.genshin_fonts import ( gs_font_36, gs_font_44, ) -from ..utils.image.image_tools import ( - get_star_png, - get_simple_bg, - get_unknown_png, - draw_pic_with_ring, -) async def get_char_cost_wiki_img(name: str) -> Union[str, bytes]: @@ -93,6 +93,7 @@ async def draw_single_cost(title: str, data: Dict) -> Tuple[Image.Image, str]: y = 165 * (index // 5) tent_x = 34 tent_y = 23 + cost_pic = cost_pic.convert('RGBA') img.paste(cost_pic, (67 + tent_x + t, 61 + tent_y + y), cost_pic) val = str(data[cost_name]) img_draw.text( diff --git a/GenshinUID/utils/image/image_tools.py b/GenshinUID/utils/image/image_tools.py index 722af22d..c7230fe7 100644 --- a/GenshinUID/utils/image/image_tools.py +++ b/GenshinUID/utils/image/image_tools.py @@ -31,6 +31,24 @@ else: bg_path = NM_BG_PATH +async def shift_image_hue(img: Image.Image, angle: float = 30) -> Image.Image: + alpha = img.getchannel('A') + img = img.convert('HSV') + + pixels = img.load() + hue_shift = angle + + for y in range(img.height): + for x in range(img.width): + h, s, v = pixels[x, y] + h = (h + hue_shift) % 360 + pixels[x, y] = (h, s, v) + + img = img.convert('RGBA') + img.putalpha(alpha) + return img + + async def _get(url: str): async with httpx.AsyncClient(timeout=None) as client: resp = await client.get(url=url) @@ -38,9 +56,9 @@ async def _get(url: str): async def get_pic(url, size: Optional[Tuple[int, int]] = None) -> Image.Image: - """ + ''' 从网络获取图片, 格式化为RGBA格式的指定尺寸 - """ + ''' async with httpx.AsyncClient(timeout=None) as client: resp = await client.get(url=url) if resp.status_code != 200: @@ -48,7 +66,7 @@ async def get_pic(url, size: Optional[Tuple[int, int]] = None) -> Image.Image: size = (960, 600) return Image.new('RGBA', size) pic = Image.open(BytesIO(resp.read())) - pic = pic.convert("RGBA") + pic = pic.convert('RGBA') if size is not None: pic = pic.resize(size, Image.Resampling.LANCZOS) return pic @@ -74,11 +92,11 @@ def draw_text_by_line( center=False, line_space: Optional[float] = None, ): - """ + ''' 在图片上写长段文字, 自动换行 max_length单行最大长度, 单位像素 line_space 行间距, 单位像素, 默认是字体高度的0.3倍 - """ + ''' x, y = pos _, h = get_size(font, 'X') if line_space is None: @@ -86,7 +104,7 @@ def draw_text_by_line( else: y_add = math.ceil(h + line_space) draw = ImageDraw.Draw(img) - row = "" # 存储本行文字 + row = '' # 存储本行文字 length = 0 # 记录本行长度 for character in text: # 获取当前字符的宽度 @@ -100,10 +118,10 @@ def draw_text_by_line( fw, _ = get_size(font, row) x = math.ceil((img.size[0] - fw) / 2) draw.text((x, y), row, font=font, fill=fill) - row = "" + row = '' length = 0 y += y_add - if row != "": + if row != '': if center: fw, _ = get_size(font, row) x = math.ceil((img.size[0] - fw) / 2) @@ -111,32 +129,32 @@ def draw_text_by_line( def easy_paste( - im: Image.Image, im_paste: Image.Image, pos=(0, 0), direction="lt" + im: Image.Image, im_paste: Image.Image, pos=(0, 0), direction='lt' ): - """ + ''' inplace method 快速粘贴, 自动获取被粘贴图像的坐标。 pos应当是粘贴点坐标,direction指定粘贴点方位,例如lt为左上 - """ + ''' x, y = pos size_x, size_y = im_paste.size - if "d" in direction: + if 'd' in direction: y = y - size_y - if "r" in direction: + if 'r' in direction: x = x - size_x - if "c" in direction: + if 'c' in direction: x = x - int(0.5 * size_x) y = y - int(0.5 * size_y) im.paste(im_paste, (x, y, x + size_x, y + size_y), im_paste) def easy_alpha_composite( - im: Image.Image, im_paste: Image.Image, pos=(0, 0), direction="lt" + im: Image.Image, im_paste: Image.Image, pos=(0, 0), direction='lt' ) -> Image.Image: ''' 透明图像快速粘贴 ''' - base = Image.new("RGBA", im.size) + base = Image.new('RGBA', im.size) easy_paste(base, im_paste, pos, direction) base = Image.alpha_composite(im, base) return base @@ -358,7 +376,7 @@ class CustomizeImage: @staticmethod def get_dominant_color(pil_img: Image.Image) -> Tuple[int, int, int]: img = pil_img.copy() - img = img.convert("RGBA") + img = img.convert('RGBA') img = img.resize((1, 1), resample=0) dominant_color = img.getpixel((0, 0)) return dominant_color