├── .github ├── ISSUE_TEMPLATE │ ├── bug.yml │ ├── config.yml │ └── feature.yml └── workflows │ └── generate_keywords.yml ├── .gitignore ├── LICENSE ├── README.md ├── auto_powershell ├── fleshlight.ps1 └── holdsign.ps1 ├── docker ├── deployment_meme-generator.md └── meme-generator.yaml ├── docs ├── file_info.xlsx ├── meme_emoji.eddx └── meme_emoji_keywords.md ├── emoji ├── adoption │ ├── __init__.py │ └── images │ │ ├── 0.png │ │ └── buckup.png ├── all_the_days │ ├── __init__.py │ └── images │ │ └── 0.png ├── anyliew_people_I_like │ ├── __init__.py │ └── images │ │ └── 0.png ├── anyliew_struggling │ ├── __init__.py │ └── images │ │ └── 0.png ├── atri_finger │ ├── __init__.py │ └── images │ │ └── 0.jpg ├── atri_like │ ├── __init__.py │ └── images │ │ └── 0.png ├── begged_me │ ├── __init__.py │ └── images │ │ └── 0.png ├── chuanmama │ ├── __init__.py │ └── images │ │ ├── 0.png │ │ └── 1.png ├── chuini │ ├── __init__.py │ └── images │ │ ├── 0.png │ │ └── 1.png ├── contract │ ├── __init__.py │ └── images │ │ └── 0.jpg ├── daoguan │ ├── __init__.py │ └── images │ │ ├── 0.png │ │ └── 1.png ├── deer_help │ ├── __init__.py │ └── images │ │ └── 0.jpg ├── dinosaur_head │ ├── __init__.py │ └── images │ │ └── 0.png ├── dog_face │ ├── __init__.py │ └── images │ │ └── 0.png ├── duidi │ ├── __init__.py │ └── images │ │ ├── 0.png │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ └── 4.png ├── durian │ ├── __init__.py │ └── images │ │ └── 0.png ├── fbi_photo │ ├── __init__.py │ └── images │ │ └── 0.png ├── fireworks_head │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_air_play │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_angel │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_cleaning_liquid │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_commemorative_edition_saint_sister │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_hoshino_alice │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_idol_heartbeat │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_jissbon │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_limited_edition_saint_sister │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_liuli_zi │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_machinery │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_mengxin_packs │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_miyuko_kamimiya │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_pure_buttocks │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_purple_spirit │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_qiaobenyouxi │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_saint_sister │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_selena │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_starter_pack │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_summer_liuli_zi │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_taimanin_asgi │ ├── __init__.py │ └── images │ │ └── 0.png ├── fleshlight_xingnai │ ├── __init__.py │ └── images │ │ └── 0.png ├── gong_xi_fa_cai │ ├── __init__.py │ └── images │ │ └── 0.png ├── hitachi_mako_together │ ├── __init__.py │ └── images │ │ └── 0.png ├── huochailu │ ├── __init__.py │ └── images │ │ ├── 0.png │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ └── 5.png ├── ice_tea_head │ ├── __init__.py │ └── images │ │ └── 0.png ├── ikun_basketball │ ├── __init__.py │ └── images │ │ └── 0.png ├── ikun_durian_head │ ├── __init__.py │ └── images │ │ └── 0.png ├── ikun_head │ ├── __init__.py │ └── images │ │ └── 0.png ├── ikun_like │ ├── __init__.py │ └── images │ │ └── 0.png ├── ikun_need_tv │ ├── __init__.py │ └── images │ │ └── 0.png ├── ikun_why_are_you │ ├── __init__.py │ └── images │ │ └── 0.jpg ├── jd_delivery_person │ ├── __init__.py │ └── images │ │ └── 0.png ├── jd_takeout │ ├── __init__.py │ └── images │ │ └── 0.png ├── kfc │ ├── __init__.py │ └── images │ │ └── 0.png ├── kfc_thursday │ ├── __init__.py │ └── images │ │ └── 0.png ├── kou │ ├── __init__.py │ └── images │ │ ├── 0.png │ │ └── 1.png ├── kurogames_carlotta_holdsign │ ├── __init__.py │ └── images │ │ └── 0.png ├── kurogames_cartethyia_holdsign │ ├── __init__.py │ └── images │ │ └── 0.png ├── kurogames_changli_finger │ ├── __init__.py │ └── images │ │ └── 0.png ├── kurogames_gugu_blowfish_small_classes │ ├── __init__.py │ └── images │ │ └── 0.jpg ├── kurogames_lingyang_holdsign │ ├── __init__.py │ └── images │ │ └── 0.png ├── kurogames_mortefi_holdsign │ ├── __init__.py │ └── images │ │ └── 0.png ├── kurogames_mp │ ├── __init__.py │ └── images │ │ └── 0.png ├── kurogames_phoebe_ score_sheet │ ├── __init__.py │ └── images │ │ └── 0.png ├── kurogames_phoebe_say │ ├── __init__.py │ └── images │ │ └── 0.jpg ├── kurogames_rover_head │ ├── __init__.py │ └── images │ │ └── 0.png ├── kurogames_rover_holdsign │ ├── __init__.py │ └── images │ │ └── 0.png ├── kurogames_songlun │ ├── __init__.py │ └── images │ │ └── 0.png ├── kurogames_songlun_holdsign │ ├── __init__.py │ └── images │ │ └── 0.jpg ├── kurogames_verina_holdsign │ ├── __init__.py │ └── images │ │ ├── 0.png │ │ └── backup.png ├── kurogames_zhezhi_holdsign │ ├── __init__.py │ └── images │ │ └── 0.png ├── mahiro_fuck │ ├── __init__.py │ └── images │ │ └── 0.png ├── mi_monkey │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_amber_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_barbara_pegg_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_barbatos_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_caribert_alberich_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_chasca_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_citlali_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_editorial_society_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_elysia_come │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_funina_card │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_funina_death_penalty │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_funina_finger │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_funina_holdsign │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_funina_round_head │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_funina_square_head │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_gemini_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_genshin_impact_op │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_genshin_impact_players │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_guoba_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_hilichurl_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_hutao_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_kaveh_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_klee_duduke_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_klee_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_klee_hat_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_kujou_sara_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_kuki_shinobu_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_lce_slime_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_liuwei_holdsign │ ├── __init__.py │ └── images │ │ └── 0.jpg ├── mihoyo_lynette_holdsign │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_outlander_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_paimon_crown │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_paimon_emergency_food_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_paimon_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_shikanoin_heizou_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_tartaglia_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_tepetlisauri_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_thunderbolt_slime_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_traveler_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_wind_slime_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── mihoyo_yanfei_frame │ ├── __init__.py │ └── images │ │ └── 0.png ├── miss_in_my_sleep │ ├── __init__.py │ └── images │ │ └── 0.png ├── mygo_sakiko_togawa │ ├── __init__.py │ └── images │ │ └── 0.png ├── naruro_s_ninja │ ├── __init__.py │ └── images │ │ └── 0.png ├── orange │ ├── __init__.py │ └── images │ │ └── 0.png ├── shikanoko_noko │ ├── __init__.py │ └── images │ │ └── 0.png ├── shuai │ ├── __init__.py │ └── images │ │ ├── 0.png │ │ ├── 1.png │ │ ├── 2.png │ │ └── 3.png ├── spend_christmas │ ├── __init__.py │ └── images │ │ └── 0.png ├── swimsuit_group_photo │ ├── __init__.py │ └── images │ │ └── 0.png ├── together_two │ ├── __init__.py │ └── images │ │ └── 0.jpg ├── torture_yourself │ ├── __init__.py │ └── images │ │ └── 0.png ├── xinxi_news │ ├── __init__.py │ └── images │ │ └── 0.png ├── yuzu_soft_ayachi_nene │ ├── __init__.py │ └── images │ │ └── 0.png ├── yuzu_soft_holdsign │ ├── __init__.py │ └── images │ │ └── 0.jpg ├── yuzu_soft_mako_hitachi_holdsign │ ├── __init__.py │ └── images │ │ └── 0.png ├── yuzu_soft_murasame_blackboard │ ├── __init__.py │ └── images │ │ └── 0.jpg ├── yuzu_soft_murasame_clothes │ ├── __init__.py │ └── images │ │ └── 0.jpg ├── yuzu_soft_murasame_dislike │ ├── __init__.py │ └── images │ │ └── 0.png ├── yuzu_soft_murasame_finger │ ├── __init__.py │ └── images │ │ └── 0.png ├── yuzu_soft_murasame_husband │ ├── __init__.py │ └── images │ │ └── 0.png ├── yuzu_soft_murasame_like │ ├── __init__.py │ └── images │ │ └── 0.png ├── yuzu_soft_murasame_say │ ├── __init__.py │ └── images │ │ └── 0.jpg └── yuzu_soft_shocked │ ├── __init__.py │ └── images │ └── 0.png ├── meme_emoji_keywords.py └── picture ├── Phone.png ├── logo.png ├── meme_emoji.jpg └── partner.jpg /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: meme_emoji 4 | url: https://github.com/anyliew/meme_emoji 5 | about: 基于meme-generator做的扩展表情包仓库 -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature.yml: -------------------------------------------------------------------------------- 1 | name: 素材投稿 2 | description: 对本项目提出一个素材投稿 3 | title: "[素材投稿]: " 4 | labels: ["enhancement"] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | 感谢提出素材投稿,我们将仔细考虑能否做成一个表情包! 10 | - type: textarea 11 | id: related-problem 12 | attributes: 13 | label: 你的素材投稿图片出自哪里,表达了什么内容 14 | description: 清晰并简洁地描述素材来源是什么,例如图片的角色出自库洛制作的游戏《鸣潮》的登场角色菲比,表达了恪守教义、自我约束的圣职者,仍然存有着为所爱之物欢欣雀跃的真挚之心。 15 | validations: 16 | required: false 17 | - type: textarea 18 | id: desired-solution 19 | attributes: 20 | label: 你希望看到做成怎样的表情包? 21 | description: 清晰并简洁地描述你希望发生的事情。 22 | validations: 23 | required: true 24 | - type: textarea 25 | id: alternatives 26 | attributes: 27 | label: 你是否检查meme-generator和meme-generator-contrib存在相同或者类似的表情包? 28 | description: 清晰并简洁地描述你是否检查过。 29 | validations: 30 | required: false 31 | - type: textarea 32 | id: additional-context 33 | attributes: 34 | label: 你有考虑过投稿可能被鸽,等待时间长?毕竟Anyliew很爱躺平歇逼~ 35 | description: 在此处添加有关功能请求的任何其他上下文或截图。 36 | validations: 37 | required: false 38 | - type: checkboxes 39 | attributes: 40 | label: 意向参与投稿贡献 41 | options: 42 | - label: 我有意向参与meme_emoji的投稿素材制作实现有趣的表情包并将代码以及素材贡献到https://github.com/anyliew/meme_emoji仓库里! 43 | required: false -------------------------------------------------------------------------------- /.github/workflows/generate_keywords.yml: -------------------------------------------------------------------------------- 1 | name: Generate Meme Keywords 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | workflow_dispatch: 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | permissions: 13 | contents: write 14 | steps: 15 | - name: Checkout repository 16 | uses: actions/checkout@v4 17 | 18 | - name: Set up Python 19 | uses: actions/setup-python@v5 20 | with: 21 | python-version: '3.10' 22 | 23 | - name: Install dependencies 24 | run: pip install --upgrade pip 25 | 26 | - name: Run meme_emoji_keywords.py 27 | run: python meme_emoji_keywords.py 28 | 29 | - name: Check if meme_emoji_keywords.md changed 30 | id: check_diff 31 | run: | 32 | git add docs/meme_emoji_keywords.md 33 | if git diff --cached --quiet; then 34 | echo "No changes detected." 35 | echo "changed=false" >> $GITHUB_OUTPUT 36 | else 37 | echo "Changes detected." 38 | echo "changed=true" >> $GITHUB_OUTPUT 39 | fi 40 | 41 | - name: Commit and push changes 42 | if: steps.check_diff.outputs.changed == 'true' 43 | run: | 44 | git config user.name "github-actions[bot]" 45 | git config user.email "41898282+github-actions[bot]@users.noreply.github.com" 46 | git commit -m "🤖 Git 机器人自动更新表情包清单列表 Auto-generate meme_emoji_keywords.md" 47 | git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/anyliew/meme_emoji.git 48 | git push origin main 49 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *__pycache__/ 2 | dist/ 3 | .vscode/ 4 | .idea/ 5 | venv/ 6 | .venv/ 7 | node_modules/ 8 | meme_emoji_keywords.md/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 MeetWq 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /auto_powershell/fleshlight.ps1: -------------------------------------------------------------------------------- 1 | # 定义目录路径 2 | $directory = "D:\meme\meme_emoji\emoji" 3 | 4 | # 获取所有包含"aircraft_cup"的文件夹 5 | $folders = Get-ChildItem -Path $directory -Directory -Recurse | Where-Object { $_.Name -like "*aircraft_cup*" } 6 | 7 | # 遍历并重命名文件夹 8 | foreach ($folder in $folders) { 9 | $newName = $folder.Name -replace "aircraft_cup", "fleshlight" 10 | $newPath = Join-Path -Path $folder.Parent.FullName -ChildPath $newName 11 | 12 | try { 13 | Rename-Item -Path $folder.FullName -NewName $newName -ErrorAction Stop 14 | Write-Host "已重命名: $($folder.FullName) -> $newName" 15 | } 16 | catch { 17 | Write-Host "重命名失败: $($folder.FullName) - $_" -ForegroundColor Red 18 | } 19 | } 20 | 21 | Write-Host "操作完成" -------------------------------------------------------------------------------- /auto_powershell/holdsign.ps1: -------------------------------------------------------------------------------- 1 | # 定义目标目录 2 | $rootDir = "D:\meme\meme_emoji\emoji" 3 | 4 | # 获取所有名称包含 "hold_sigh" 的文件夹(递归搜索) 5 | $foldersToRename = Get-ChildItem -Path $rootDir -Directory -Recurse | 6 | Where-Object { $_.Name -like "*hold_sigh*" } 7 | 8 | # 遍历并重命名 9 | foreach ($folder in $foldersToRename) { 10 | $newName = $folder.Name -replace "hold_sigh", "holdsign" 11 | $newPath = Join-Path -Path $folder.Parent.FullName -ChildPath $newName 12 | 13 | try { 14 | Rename-Item -Path $folder.FullName -NewName $newName -ErrorAction Stop 15 | Write-Host "[成功] 已重命名: $($folder.FullName) -> $newName" -ForegroundColor Green 16 | } 17 | catch { 18 | Write-Host "[失败] 无法重命名: $($folder.FullName) (原因: $_)" -ForegroundColor Red 19 | } 20 | } 21 | 22 | Write-Host "`n操作完成!共处理 $($foldersToRename.Count) 个文件夹。" -ForegroundColor Cyan -------------------------------------------------------------------------------- /docker/deployment_meme-generator.md: -------------------------------------------------------------------------------- 1 | # Docker-compose 部署 meme-generator 2 | 3 | 4 | 5 | ## meme-generator 6 | 7 | *✨ 表情包生成器,用于制作各种沙雕表情包 ✨* 8 | 9 | 10 | 11 | ## Docker-compose 部署过程 12 | 13 | 14 | 15 | #### 拉取镜像 16 | 17 | ```bash 18 | docker pull meetwq/meme-generator:main 19 | ``` 20 | 21 | 22 | 23 | ### 创建Docker-compose文件以及内容 24 | 25 | 创建文件 26 | 27 | ```bash 28 | vim /opt/meme/meme-generator.yaml 29 | ``` 30 | 31 | 文件内容 32 | 33 | ```yaml 34 | version: '3' 35 | services: 36 | meme-generator: 37 | image: meetwq/meme-generator:main 38 | container_name: meme-generator 39 | restart: always 40 | ports: 41 | - "2233:2233" 42 | volumes: 43 | #额外表情路径 44 | - :/data 45 | environment: 46 | - MEME_DIRS='["/data/memes"]' 47 | - MEME_DISABLED_LIST='[]' 48 | - GIF_MAX_SIZE=10.0 49 | - GIF_MAX_FRAMES=100 50 | - BAIDU_TRANS_APPID= 51 | - BAIDU_TRANS_APIKEY= 52 | - LOG_LEVEL=INFO 53 | ``` 54 | 55 | ### 运行容器 56 | 57 | ```bash 58 | docker-compose -f /opt/meme/meme-generator.yaml up -d 59 | ``` 60 | 61 | -------------------------------------------------------------------------------- /docker/meme-generator.yaml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | meme-generator: 4 | image: meetwq/meme-generator:main 5 | container_name: meme-generator 6 | restart: always 7 | ports: 8 | - "2233:2233" 9 | volumes: 10 | #额外表情路径 11 | - :/data 12 | environment: 13 | - MEME_DIRS='["/data/memes"]' 14 | - MEME_DISABLED_LIST='[]' 15 | - GIF_MAX_SIZE=10.0 16 | - GIF_MAX_FRAMES=100 17 | - BAIDU_TRANS_APPID= 18 | - BAIDU_TRANS_APIKEY= 19 | - LOG_LEVEL=INFO -------------------------------------------------------------------------------- /docs/file_info.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/docs/file_info.xlsx -------------------------------------------------------------------------------- /docs/meme_emoji.eddx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/docs/meme_emoji.eddx -------------------------------------------------------------------------------- /emoji/adoption/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def adoption(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"请收养{name}" 26 | try: 27 | frame.draw_text( 28 | (96, 585, 521, 782), 29 | text, 30 | fill=(57,49,46), 31 | max_fontsize=100, 32 | lines_align="center", 33 | font_families=["FZShaoEr-M11S"], 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((310, 310)) 40 | return frame.copy().paste(img, (293, 90), alpha=True,below=True) 41 | 42 | return make_png_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "adoption", 47 | adoption, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["收养"], 53 | date_created=datetime(2025, 3, 24), 54 | date_modified=datetime(2025, 3, 24), 55 | ) 56 | -------------------------------------------------------------------------------- /emoji/adoption/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/adoption/images/0.png -------------------------------------------------------------------------------- /emoji/adoption/images/buckup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/adoption/images/buckup.png -------------------------------------------------------------------------------- /emoji/all_the_days/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from meme_generator import add_meme 5 | from pil_utils import BuildImage 6 | 7 | img_dir = Path(__file__).parent / "images" 8 | 9 | 10 | def all_the_days(images: list[BuildImage], texts, args): 11 | frame = BuildImage.open(img_dir / "0.png") 12 | frame.paste( 13 | images[1].convert("RGBA").circle().resize((95, 95)), (255, 255), alpha=True 14 | ).paste( 15 | images[0].convert("RGBA").circle().resize((95, 95)), (425, 210), alpha=True 16 | ) 17 | return frame.save_jpg() 18 | 19 | 20 | add_meme( 21 | "all_the_days", 22 | all_the_days, 23 | min_images=2, 24 | max_images=2, 25 | keywords=["一生一世"], 26 | date_created=datetime(2025, 3, 14), 27 | date_modified=datetime(2025, 3, 14), 28 | ) 29 | -------------------------------------------------------------------------------- /emoji/all_the_days/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/all_the_days/images/0.png -------------------------------------------------------------------------------- /emoji/anyliew_people_I_like/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def anyliew_people_i_like(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"だいじなひと{name}👩‍❤️‍💋‍👨" 26 | try: 27 | frame.draw_text( 28 | (0, 614, 638, 761), 29 | text, 30 | fill="black", 31 | max_fontsize=100, 32 | min_fontsize=20, 33 | valign="bottom", 34 | font_families=["FZKaTong-M19S"], 35 | ) 36 | except ValueError: 37 | raise TextOverLength(name) 38 | 39 | def make(imgs: list[BuildImage]) -> BuildImage: 40 | img = imgs[0].convert("RGBA").resize((330, 330)) 41 | return frame.copy().paste(img, (330, 140), alpha=True,below=True) 42 | 43 | return make_jpg_or_gif(images, make) 44 | 45 | 46 | add_meme( 47 | "anyliew_people_i_like", 48 | anyliew_people_i_like, 49 | min_images=1, 50 | max_images=1, 51 | min_texts=0, 52 | max_texts=1, 53 | keywords=["挚爱"], 54 | date_created=datetime(2025, 5, 26), 55 | date_modified=datetime(2025, 5, 26), 56 | ) 57 | -------------------------------------------------------------------------------- /emoji/anyliew_people_I_like/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/anyliew_people_I_like/images/0.png -------------------------------------------------------------------------------- /emoji/anyliew_struggling/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def anyliew_struggling(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | def make(imgs: list[BuildImage]) -> BuildImage: 17 | #头像尺寸 18 | img = imgs[0].convert("RGBA").circle().resize((300, 300)) 19 | img = img.rotate(25, expand=True) 20 | #头像坐标 21 | return frame.copy().paste(img, (275, 28), alpha=True,below=True) 22 | 23 | return make_jpg_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "anyliew_struggling", 28 | anyliew_struggling, 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["挣扎"], 34 | date_created=datetime(2025, 5, 26), 35 | date_modified=datetime(2025, 5, 26), 36 | ) 37 | -------------------------------------------------------------------------------- /emoji/anyliew_struggling/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/anyliew_struggling/images/0.png -------------------------------------------------------------------------------- /emoji/atri_finger/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def atri_finger(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.jpg") 15 | 16 | ta = "anyliew" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "anyliew" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"{name},你和夏先生一样笨得可爱" 26 | 27 | try: 28 | frame.draw_text( 29 | (0, 588, 1171, 720), 30 | text, 31 | fill=(0, 0, 0), 32 | allow_wrap=True, 33 | max_fontsize=150, 34 | min_fontsize=15, 35 | lines_align="left", 36 | font_families=["FZShaoEr-M11S"], 37 | ) 38 | except ValueError: 39 | raise TextOverLength(name) 40 | 41 | def make(imgs: list[BuildImage]) -> BuildImage: 42 | img = imgs[0].convert("RGBA").circle().resize((300, 300)) 43 | return frame.copy().paste(img, (600, 140), alpha=True) 44 | 45 | return make_jpg_or_gif(images, make) 46 | 47 | 48 | add_meme( 49 | "atri_finger", 50 | atri_finger, 51 | min_images=1, 52 | max_images=1, 53 | min_texts=0, 54 | max_texts=1, 55 | keywords=["亚托莉指"], 56 | date_created=datetime(2025, 3, 24), 57 | date_modified=datetime(2025, 3, 24), 58 | ) 59 | -------------------------------------------------------------------------------- /emoji/atri_finger/images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/atri_finger/images/0.jpg -------------------------------------------------------------------------------- /emoji/atri_like/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | from meme_generator.utils import make_jpg_or_gif 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | default_text = "亚托莉喜欢这个" 14 | 15 | 16 | def atri_like(images: list[BuildImage], texts: list[str], args): 17 | text = texts[0] if texts else default_text 18 | frame = BuildImage.open(img_dir / "0.png") 19 | try: 20 | frame.draw_text( 21 | (5, frame.height - 60, frame.width - 5, frame.height - 10), 22 | text, 23 | max_fontsize=40, 24 | fill="white", 25 | stroke_fill="black", 26 | stroke_ratio=0.06, 27 | ) 28 | except ValueError: 29 | raise TextOverLength(text) 30 | 31 | def make(imgs: list[BuildImage]) -> BuildImage: 32 | img = imgs[0].convert("RGBA").resize((305, 235), keep_ratio=True) 33 | return frame.copy().paste(img, (106, 72), below=True) 34 | 35 | return make_jpg_or_gif(images, make) 36 | 37 | 38 | add_meme( 39 | "atri_like", 40 | atri_like, 41 | min_images=1, 42 | max_images=1, 43 | min_texts=0, 44 | max_texts=1, 45 | default_texts=[default_text], 46 | keywords=["亚托莉喜欢"], 47 | tags=MemeTags.atri, 48 | date_created=datetime(2025, 5, 25), 49 | date_modified=datetime(2025, 5, 25), 50 | ) 51 | -------------------------------------------------------------------------------- /emoji/atri_like/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/atri_like/images/0.png -------------------------------------------------------------------------------- /emoji/begged_me/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def begged_me(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "她" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"" 26 | try: 27 | frame.draw_text( 28 | (235, 615, 478, 659), 29 | text, 30 | max_fontsize=100, 31 | min_fontsize=20, 32 | valign="bottom", 33 | ) 34 | except ValueError: 35 | raise TextOverLength(name) 36 | 37 | def make(imgs: list[BuildImage]) -> BuildImage: 38 | #头像尺寸 39 | img = imgs[0].convert("RGBA").circle().resize((1720, 1720)) 40 | # 头像旋转15度(顺时针方向) 41 | img = img.rotate(-15, expand=True) 42 | #头像坐标320, 855 43 | return frame.copy().paste(img, (125, 655), alpha=True, below=True ) 44 | 45 | return make_jpg_or_gif(images, make) 46 | 47 | 48 | add_meme( 49 | "begged_me", 50 | begged_me, 51 | min_images=1, 52 | max_images=1, 53 | max_texts=1, 54 | keywords=["求我"], 55 | date_created=datetime(2025, 3, 10), 56 | date_modified=datetime(2025, 3, 10), 57 | ) 58 | -------------------------------------------------------------------------------- /emoji/begged_me/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/begged_me/images/0.png -------------------------------------------------------------------------------- /emoji/chuanmama/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from PIL.Image import Image as IMG 5 | from pil_utils import BuildImage 6 | 7 | from meme_generator import add_meme 8 | from meme_generator.utils import save_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def chuanmama(images: list[BuildImage], texts, args): 14 | img = images[0].convert("RGBA").square().resize((110, 110)).circle() 15 | frames: list[IMG] = [] 16 | locs = [ 17 | (192, 192, 91, 23), 18 | (192, 192, 91, 23), 19 | 20 | ] 21 | for i in range(2): 22 | frame = BuildImage.open(img_dir / f"{i}.png") 23 | w, h, x, y = locs[i] 24 | frame.paste(img.resize((w, h)), (x, y), below=True) 25 | frames.append(frame.image) 26 | return save_gif(frames, 0.05) 27 | 28 | 29 | add_meme( 30 | "chuanmama", 31 | chuanmama, 32 | min_images=1, 33 | max_images=1, 34 | keywords=["川妈妈"], 35 | date_created=datetime(2025, 5, 27), 36 | date_modified=datetime(2025, 5, 27), 37 | ) -------------------------------------------------------------------------------- /emoji/chuanmama/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/chuanmama/images/0.png -------------------------------------------------------------------------------- /emoji/chuanmama/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/chuanmama/images/1.png -------------------------------------------------------------------------------- /emoji/chuini/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from PIL.Image import Image as IMG 5 | from pil_utils import BuildImage 6 | 7 | from meme_generator import add_meme 8 | from meme_generator.utils import save_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def chuini(images: list[BuildImage], texts, args): 14 | img = images[0].convert("RGBA").square().resize((110, 110)) 15 | frames: list[IMG] = [] 16 | locs = [ 17 | (56, 50, 23, 142), 18 | (49, 34, 21, 158), 19 | 20 | ] 21 | for i in range(2): 22 | frame = BuildImage.open(img_dir / f"{i}.png") 23 | w, h, x, y = locs[i] 24 | frame.paste(img.resize((w, h)), (x, y), below=True) 25 | frames.append(frame.image) 26 | return save_gif(frames, 0.05) 27 | 28 | 29 | add_meme( 30 | "chuini", 31 | chuini, 32 | min_images=1, 33 | max_images=1, 34 | keywords=["捶你"], 35 | date_created=datetime(2025, 5, 27), 36 | date_modified=datetime(2025, 5, 27), 37 | ) -------------------------------------------------------------------------------- /emoji/chuini/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/chuini/images/0.png -------------------------------------------------------------------------------- /emoji/chuini/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/chuini/images/1.png -------------------------------------------------------------------------------- /emoji/contract/images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/contract/images/0.jpg -------------------------------------------------------------------------------- /emoji/daoguan/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from PIL.Image import Image as IMG 5 | from pil_utils import BuildImage 6 | 7 | from meme_generator import add_meme 8 | from meme_generator.utils import save_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def dao(images: list[BuildImage], texts, args): 14 | img = images[0].convert("RGBA").square().resize((110, 110)).circle() 15 | frames: list[IMG] = [] 16 | locs = [ 17 | (207, 178, 156, 17), 18 | (194, 172, 159, 27), 19 | 20 | ] 21 | for i in range(2): 22 | frame = BuildImage.open(img_dir / f"{i}.png") 23 | w, h, x, y = locs[i] 24 | frame.paste(img.resize((w, h)), (x, y), below=True) 25 | frames.append(frame.image) 26 | return save_gif(frames, 0.05) 27 | 28 | 29 | add_meme( 30 | "dao", 31 | dao, 32 | min_images=1, 33 | max_images=1, 34 | keywords=["导"], 35 | date_created=datetime(2025, 5, 27), 36 | date_modified=datetime(2025, 5, 27), 37 | ) -------------------------------------------------------------------------------- /emoji/daoguan/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/daoguan/images/0.png -------------------------------------------------------------------------------- /emoji/daoguan/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/daoguan/images/1.png -------------------------------------------------------------------------------- /emoji/deer_help/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from meme_generator import add_meme 5 | from pil_utils import BuildImage 6 | 7 | img_dir = Path(__file__).parent / "images" 8 | 9 | 10 | def deer_help(images: list[BuildImage], texts, args): 11 | frame = BuildImage.open(img_dir / "0.jpg") 12 | frame.paste( 13 | #人类角色 14 | images[1].convert("RGBA").circle().resize((180, 180)), (605, 200), alpha=True 15 | ).paste( 16 | #鹿头角色 17 | images[0].convert("RGBA").circle().resize((180, 180)), (300, 190), alpha=True 18 | ) 19 | return frame.save_jpg() 20 | 21 | 22 | add_meme( 23 | "deer_help", 24 | deer_help, 25 | min_images=2, 26 | max_images=2, 27 | keywords=["帮鹿","帮🦌"], 28 | date_created=datetime(2025, 5, 25), 29 | date_modified=datetime(2025, 5, 25), 30 | ) 31 | -------------------------------------------------------------------------------- /emoji/deer_help/images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/deer_help/images/0.jpg -------------------------------------------------------------------------------- /emoji/dinosaur_head/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def dinosaur_head(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "她" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"" 26 | #{name}恐龙头 27 | try: 28 | frame.draw_text( 29 | (27, 73, 374, 136), 30 | text, 31 | max_fontsize=100, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").resize((620, 620)) 40 | return frame.copy().paste(img, (215, 245), alpha=True, below=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "dinosaur_head", 47 | dinosaur_head, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["恐龙头"], 53 | date_created=datetime(2024, 7, 26), 54 | date_modified=datetime(2024, 7, 26), 55 | ) 56 | -------------------------------------------------------------------------------- /emoji/dinosaur_head/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/dinosaur_head/images/0.png -------------------------------------------------------------------------------- /emoji/dog_face/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | 8 | img_dir = Path(__file__).parent / "images" 9 | 10 | 11 | def dog_face(images: list[BuildImage], texts, args): 12 | img = images[0].convert("RGBA").square().resize((180, 180)) 13 | frame = BuildImage.open(img_dir / "0.png") 14 | frame.paste(img, (312, 115), below=True) 15 | return frame.save_jpg() 16 | 17 | 18 | add_meme( 19 | "dog_face", 20 | dog_face, 21 | min_images=1, 22 | max_images=1, 23 | keywords=["🐶","狗"], 24 | date_created=datetime(2025, 5, 25), 25 | date_modified=datetime(2025, 5, 25), 26 | ) 27 | -------------------------------------------------------------------------------- /emoji/dog_face/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/dog_face/images/0.png -------------------------------------------------------------------------------- /emoji/duidi/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from PIL.Image import Image as IMG 5 | from pil_utils import BuildImage 6 | 7 | from meme_generator import add_meme 8 | from meme_generator.utils import save_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def duidi(images: list[BuildImage], texts, args): 14 | img = images[0].convert("RGBA").square().resize((110, 110)).circle() 15 | frames: list[IMG] = [] 16 | locs = [ 17 | (92, 75, 22, 6), 18 | (93, 76, 20, 6), 19 | (92, 76, 23, 10), 20 | (92, 76, 22, 5), 21 | (94, 77, 23, 2), 22 | 23 | ] 24 | for i in range(5): 25 | frame = BuildImage.open(img_dir / f"{i}.png") 26 | w, h, x, y = locs[i] 27 | frame.paste(img.resize((w, h)), (x, y), below=True) 28 | frames.append(frame.image) 29 | return save_gif(frames, 0.05) 30 | 31 | 32 | add_meme( 33 | "duidi", 34 | duidi, 35 | min_images=1, 36 | max_images=1, 37 | keywords=["怼地","怼"], 38 | date_created=datetime(2025, 5, 27), 39 | date_modified=datetime(2025, 5, 27), 40 | ) -------------------------------------------------------------------------------- /emoji/duidi/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/duidi/images/0.png -------------------------------------------------------------------------------- /emoji/duidi/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/duidi/images/1.png -------------------------------------------------------------------------------- /emoji/duidi/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/duidi/images/2.png -------------------------------------------------------------------------------- /emoji/duidi/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/duidi/images/3.png -------------------------------------------------------------------------------- /emoji/duidi/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/duidi/images/4.png -------------------------------------------------------------------------------- /emoji/durian/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def durian(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | def make(imgs: list[BuildImage]) -> BuildImage: 17 | #头像尺寸 18 | img = imgs[0].convert("RGBA").circle().resize((475, 475)) 19 | img = img.rotate(-10, expand=True) 20 | #头像坐标 21 | return frame.copy().paste(img, (200, 425), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "durian", 28 | durian, 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=1, 33 | keywords=["榴莲"], 34 | date_created=datetime(2025, 5, 29), 35 | date_modified=datetime(2025, 5, 29), 36 | ) 37 | -------------------------------------------------------------------------------- /emoji/durian/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/durian/images/0.png -------------------------------------------------------------------------------- /emoji/fbi_photo/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def fbi_photo(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "她" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"Name : {name}" 26 | try: 27 | frame.draw_text( 28 | (800, 690, 1200, 790), 29 | text, 30 | max_fontsize=70, 31 | min_fontsize=20, 32 | valign="bottom", 33 | ) 34 | except ValueError: 35 | raise TextOverLength(name) 36 | 37 | def make(imgs: list[BuildImage]) -> BuildImage: 38 | img = imgs[0].convert("RGBA").resize((220, 220)) 39 | return frame.copy().paste(img, (985, 400), alpha=True) 40 | 41 | return make_jpg_or_gif(images, make) 42 | 43 | 44 | add_meme( 45 | "fbi_photo", 46 | fbi_photo, 47 | min_images=1, 48 | max_images=1, 49 | min_texts=0, 50 | max_texts=1, 51 | keywords=["fbi","FBI"], 52 | date_created=datetime(2024, 7, 26), 53 | date_modified=datetime(2024, 7, 26), 54 | ) 55 | -------------------------------------------------------------------------------- /emoji/fbi_photo/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fbi_photo/images/0.png -------------------------------------------------------------------------------- /emoji/fireworks_head/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def fireworks_head(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "她" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"" 26 | try: 27 | frame.draw_text( 28 | (235, 615, 478, 659), 29 | text, 30 | max_fontsize=100, 31 | min_fontsize=20, 32 | valign="bottom", 33 | ) 34 | except ValueError: 35 | raise TextOverLength(name) 36 | 37 | def make(imgs: list[BuildImage]) -> BuildImage: 38 | #头像尺寸 39 | img = imgs[0].convert("RGBA").circle().resize((320, 320)) 40 | #头像坐标 41 | return frame.copy().paste(img, (340, 165), alpha=True, below=True ) 42 | 43 | return make_jpg_or_gif(images, make) 44 | 45 | 46 | add_meme( 47 | "fireworks_head", 48 | fireworks_head, 49 | min_images=1, 50 | max_images=1, 51 | min_texts=0, 52 | max_texts=1, 53 | keywords=["烟花头像"], 54 | date_created=datetime(2025, 1, 28), 55 | date_modified=datetime(2025, 1, 28), 56 | ) 57 | -------------------------------------------------------------------------------- /emoji/fireworks_head/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fireworks_head/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_air_play/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def fleshlight_air_play(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"{name}の❤️最愛" 26 | #{name}挚爱❤️👩‍❤️‍💋‍👨{name}愛のカップ。 27 | try: 28 | frame.draw_text( 29 | (313, 40, 623, 104), 30 | text, 31 | fill="white", 32 | max_fontsize=100, 33 | min_fontsize=20, 34 | valign="bottom", 35 | ) 36 | except ValueError: 37 | raise TextOverLength(name) 38 | 39 | def make(imgs: list[BuildImage]) -> BuildImage: 40 | img = imgs[0].convert("RGBA").circle().resize((165, 165)) 41 | return frame.copy().paste(img, (325, 110), alpha=True) 42 | 43 | return make_jpg_or_gif(images, make) 44 | 45 | 46 | add_meme( 47 | "fleshlight_air_play", 48 | fleshlight_air_play, 49 | min_images=1, 50 | max_images=1, 51 | min_texts=0, 52 | max_texts=1, 53 | keywords=["空气玩法"], 54 | date_created=datetime(2025, 3, 24), 55 | date_modified=datetime(2025, 3, 24), 56 | ) 57 | -------------------------------------------------------------------------------- /emoji/fleshlight_air_play/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_air_play/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_angel/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def fleshlight_angel(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"{name}の❤️最愛" 26 | #{name}挚爱❤️👩‍❤️‍💋‍👨{name}愛のカップ。 27 | try: 28 | frame.draw_text( 29 | (533, 39, 779, 140 ), 30 | text, 31 | fill="white", 32 | max_fontsize=100, 33 | min_fontsize=20, 34 | lines_align="center", 35 | font_families=["FZShaoEr-M11S"], 36 | ) 37 | except ValueError: 38 | raise TextOverLength(name) 39 | 40 | def make(imgs: list[BuildImage]) -> BuildImage: 41 | img = imgs[0].convert("RGBA").circle().resize((675, 675)) 42 | return frame.copy().paste(img, (65, 105), alpha=True,below=True) 43 | 44 | return make_jpg_or_gif(images, make) 45 | 46 | 47 | add_meme( 48 | "fleshlight_angel", 49 | fleshlight_angel, 50 | min_images=1, 51 | max_images=1, 52 | min_texts=0, 53 | max_texts=1, 54 | keywords=["天使心"], 55 | date_created=datetime(2025, 3, 24), 56 | date_modified=datetime(2025, 3, 24), 57 | ) 58 | -------------------------------------------------------------------------------- /emoji/fleshlight_angel/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_angel/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_cleaning_liquid/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def fleshlight_cleaning_liquid(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"" 26 | #{name}挚爱❤️👩‍❤️‍💋‍👨{name}愛のカップ。 27 | try: 28 | frame.draw_text( 29 | (0, 1037, 339, 1106), 30 | text, 31 | max_fontsize=100, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((920, 920)) 40 | return frame.copy().paste(img, (290, 20), alpha=True, below=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "fleshlight_cleaning_liquid", 47 | fleshlight_cleaning_liquid, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["清洗液"], 53 | date_created=datetime(2025, 3, 13), 54 | #time 2025年3月13日 16:50:41 55 | #By Anyliew 56 | date_modified=datetime(2025, 3, 13), 57 | ) 58 | -------------------------------------------------------------------------------- /emoji/fleshlight_cleaning_liquid/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_cleaning_liquid/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_commemorative_edition_saint_sister/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_commemorative_edition_saint_sister/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_hoshino_alice/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def fleshlight_hoshino_alice(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"" 26 | #{name}挚爱❤️👩‍❤️‍💋‍👨{name}愛のカップ。 27 | try: 28 | frame.draw_text( 29 | (0, 1037, 339, 1106), 30 | text, 31 | max_fontsize=100, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((920, 920)) 40 | return frame.copy().paste(img, (130, 180), alpha=True, below=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "fleshlight_hoshino_alice", 47 | fleshlight_hoshino_alice, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["拉拉队偶像"], 53 | date_created=datetime(2025, 3, 13), 54 | #time 2025年3月13日 16:50:41 55 | #By Anyliew 56 | date_modified=datetime(2025, 3, 13), 57 | ) 58 | -------------------------------------------------------------------------------- /emoji/fleshlight_hoshino_alice/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_hoshino_alice/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_idol_heartbeat/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def fleshlight_idol_heartbeat(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"{name}の❤️最愛" 26 | #{name}挚爱❤️👩‍❤️‍💋‍👨{name}愛のカップ。 27 | try: 28 | frame.draw_text( 29 | (53, 140, 811, 280), 30 | text, 31 | max_fontsize=100, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((920, 920)) 40 | return frame.copy().paste(img, (340, 340), alpha=True, below=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "fleshlight_idol_heartbeat", 47 | fleshlight_idol_heartbeat, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["偶像心跳"], 53 | date_created=datetime(2024, 12, 21), 54 | #time 2024年12月21日 21:31:25 55 | #By Anyliew 56 | date_modified=datetime(2024, 12, 21), 57 | ) 58 | -------------------------------------------------------------------------------- /emoji/fleshlight_idol_heartbeat/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_idol_heartbeat/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_jissbon/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def fleshlight_jissbon(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"{name}の深情❤️推荐" 26 | #{name}挚爱❤️👩‍❤️‍💋‍👨{name}愛のカップ。 27 | try: 28 | frame.draw_text( 29 | (261, 31, 758, 91), 30 | text, 31 | max_fontsize=120, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((180, 180)) 40 | return frame.copy().paste(img, (475, 180), alpha=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "fleshlight_jissbon", 47 | fleshlight_jissbon, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["杰士邦"], 53 | date_created=datetime(2024, 12, 21), 54 | #time 2024年12月21日 21:31:25 55 | #By Anyliew 56 | date_modified=datetime(2024, 12, 21), 57 | ) 58 | -------------------------------------------------------------------------------- /emoji/fleshlight_jissbon/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_jissbon/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_limited_edition_saint_sister/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_limited_edition_saint_sister/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_liuli_zi/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def fleshlight_liuli_zi(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"{name}の❤️最愛" 26 | #{name}挚爱❤️👩‍❤️‍💋‍👨{name}愛のカップ。 27 | try: 28 | frame.draw_text( 29 | (26, 74, 380, 141), 30 | text, 31 | max_fontsize=100, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((500, 500)) 40 | return frame.copy().paste(img, (145, 180), alpha=True, below=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "fleshlight_liuli_zi", 47 | fleshlight_liuli_zi, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["琉璃子"], 53 | date_created=datetime(2024, 12, 21), 54 | #time 2024年12月21日 21:31:25 55 | #By Anyliew 56 | date_modified=datetime(2024, 12, 21), 57 | ) 58 | -------------------------------------------------------------------------------- /emoji/fleshlight_liuli_zi/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_liuli_zi/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_machinery/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_machinery/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_mengxin_packs/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def fleshlight_mengxin_packs(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"{name}喜爱的萌新礼包" 26 | try: 27 | frame.draw_text( 28 | (43, 403, 328, 485), 29 | text, 30 | max_fontsize=100, 31 | min_fontsize=20, 32 | lines_align="center", 33 | font_families=["FZShaoEr-M11S"], 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((350, 350)) 40 | return frame.copy().paste(img, (15, 115), alpha=True, below=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "fleshlight_mengxin_packs", 47 | fleshlight_mengxin_packs, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["萌新礼包"], 53 | date_created=datetime(2025, 6, 1), 54 | date_modified=datetime(2025, 6, 1), 55 | ) 56 | -------------------------------------------------------------------------------- /emoji/fleshlight_mengxin_packs/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_mengxin_packs/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_miyuko_kamimiya/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_miyuko_kamimiya/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_pure_buttocks/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_pure_buttocks/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_purple_spirit/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_purple_spirit/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_qiaobenyouxi/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def fleshlight_qiaobenyouxi(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"{name}の❤️最爱" 26 | #{name}挚爱❤️👩‍❤️‍💋‍👨{name}愛のカップ。 27 | try: 28 | frame.draw_text( 29 | (52, 692, 334, 755), 30 | text, 31 | max_fontsize=100, 32 | min_fontsize=20, 33 | lines_align="center", 34 | font_families=["FZShaoEr-M11S"], 35 | ) 36 | except ValueError: 37 | raise TextOverLength(name) 38 | 39 | def make(imgs: list[BuildImage]) -> BuildImage: 40 | img = imgs[0].convert("RGBA").circle().resize((630, 630)) 41 | return frame.copy().paste(img, (105, 75), alpha=True, below=True) 42 | 43 | return make_jpg_or_gif(images, make) 44 | 45 | 46 | add_meme( 47 | "fleshlight_qiaobenyouxi", 48 | fleshlight_qiaobenyouxi, 49 | min_images=1, 50 | max_images=1, 51 | min_texts=0, 52 | max_texts=1, 53 | keywords=["桥本友希"], 54 | date_created=datetime(2025, 5, 30), 55 | date_modified=datetime(2025, 5, 30), 56 | ) 57 | -------------------------------------------------------------------------------- /emoji/fleshlight_qiaobenyouxi/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_qiaobenyouxi/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_saint_sister/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def fleshlight_saint_sister(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"{name}の❤️最愛" 26 | #{name}挚爱❤️👩‍❤️‍💋‍👨{name}愛のカップ。 27 | try: 28 | frame.draw_text( 29 | (40, 110, 374, 207), 30 | text, 31 | max_fontsize=100, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((770, 770)) 40 | return frame.copy().paste(img, (202, 252), alpha=True, below=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "fleshlight_saint_sister", 47 | fleshlight_saint_sister, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["圣修女"], 53 | date_created=datetime(2024, 12, 21), 54 | #time 2024年12月21日 21:31:25 55 | #By Anyliew 56 | date_modified=datetime(2024, 12, 21), 57 | ) 58 | -------------------------------------------------------------------------------- /emoji/fleshlight_saint_sister/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_saint_sister/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_selena/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def fleshlight_selena(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"{name}の❤️最愛" 26 | #{name}挚爱❤️👩‍❤️‍💋‍👨{name}愛のカップ。 27 | try: 28 | frame.draw_text( 29 | (0, 1037, 339, 1106), 30 | text, 31 | max_fontsize=100, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((920, 920)) 40 | return frame.copy().paste(img, (140, 195), alpha=True, below=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "fleshlight_selena", 47 | fleshlight_selena, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["魔女之森"], 53 | date_created=datetime(2025, 3, 13), 54 | #time 2025年3月13日 16:50:41 55 | #By Anyliew 56 | date_modified=datetime(2025, 3, 13), 57 | ) 58 | -------------------------------------------------------------------------------- /emoji/fleshlight_selena/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_selena/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_starter_pack/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def fleshlight_starter_pack(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"{name}の❤️新手礼包" 26 | try: 27 | frame.draw_text( 28 | (93, 688, 493, 769), 29 | text, 30 | max_fontsize=100, 31 | min_fontsize=20, 32 | lines_align="center", 33 | font_families=["FZShaoEr-M11S"], 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((580, 580)) 40 | return frame.copy().paste(img, (15, 185), alpha=True, below=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "fleshlight_starter_pack", 47 | fleshlight_starter_pack, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["新手礼包"], 53 | date_created=datetime(2025, 5, 30), 54 | date_modified=datetime(2025, 5, 30), 55 | ) 56 | -------------------------------------------------------------------------------- /emoji/fleshlight_starter_pack/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_starter_pack/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_summer_liuli_zi/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def fleshlight_summer_liuli_zi(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"{name}の❤️最愛" 26 | #{name}挚爱❤️👩‍❤️‍💋‍👨{name}愛のカップ。 27 | try: 28 | frame.draw_text( 29 | (35, 111, 428, 210), 30 | text, 31 | max_fontsize=100, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((770, 770)) 40 | return frame.copy().paste(img, (210, 265), alpha=True, below=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "fleshlight_summer_liuli_zi", 47 | fleshlight_summer_liuli_zi, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["夏日琉璃子"], 53 | date_created=datetime(2024, 12, 21), 54 | #time 2024年12月21日 21:31:25 55 | #By Anyliew 56 | date_modified=datetime(2024, 12, 21), 57 | ) 58 | -------------------------------------------------------------------------------- /emoji/fleshlight_summer_liuli_zi/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_summer_liuli_zi/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_taimanin_asgi/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def fleshlight_taimanin_asgi(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"{name}の❤️最愛" 26 | #{name}挚爱❤️👩‍❤️‍💋‍👨{name}愛のカップ。 27 | try: 28 | frame.draw_text( 29 | (35, 111, 428, 210), 30 | text, 31 | max_fontsize=100, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((780, 780)) 40 | return frame.copy().paste(img, (215, 222), alpha=True, below=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "fleshlight_taimanin_asgi", 47 | fleshlight_taimanin_asgi, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["对魔忍"], 53 | date_created=datetime(2024, 12, 21), 54 | #time 2024年12月21日 21:31:25 55 | #By Anyliew 56 | date_modified=datetime(2024, 12, 21), 57 | ) 58 | -------------------------------------------------------------------------------- /emoji/fleshlight_taimanin_asgi/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_taimanin_asgi/images/0.png -------------------------------------------------------------------------------- /emoji/fleshlight_xingnai/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def fleshlight_xingnai(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"{name}の❤️最爱" 26 | #{name}挚爱❤️👩‍❤️‍💋‍👨{name}愛のカップ。 27 | try: 28 | frame.draw_text( 29 | (22, 638, 739, 737), 30 | text, 31 | max_fontsize=100, 32 | min_fontsize=20, 33 | lines_align="center", 34 | font_families=["FZShaoEr-M11S"], 35 | ) 36 | except ValueError: 37 | raise TextOverLength(name) 38 | 39 | def make(imgs: list[BuildImage]) -> BuildImage: 40 | img = imgs[0].convert("RGBA").circle().resize((475, 475)) 41 | return frame.copy().paste(img, (130, 150), alpha=True, below=True) 42 | 43 | return make_jpg_or_gif(images, make) 44 | 45 | 46 | add_meme( 47 | "fleshlight_xingnai", 48 | fleshlight_xingnai, 49 | min_images=1, 50 | max_images=1, 51 | min_texts=0, 52 | max_texts=1, 53 | keywords=["杏奈"], 54 | date_created=datetime(2025, 5, 30), 55 | date_modified=datetime(2025, 5, 30), 56 | ) 57 | -------------------------------------------------------------------------------- /emoji/fleshlight_xingnai/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/fleshlight_xingnai/images/0.png -------------------------------------------------------------------------------- /emoji/gong_xi_fa_cai/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def gong_xi_fa_cai(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "她" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"" 26 | try: 27 | frame.draw_text( 28 | (50, 20, 700, 130), 29 | text, 30 | max_fontsize=70, 31 | min_fontsize=20, 32 | valign="bottom", 33 | ) 34 | except ValueError: 35 | raise TextOverLength(name) 36 | 37 | def make(imgs: list[BuildImage]) -> BuildImage: 38 | img = imgs[0].convert("RGBA").circle().resize((800, 800)) 39 | return frame.copy().paste(img, (1035, 700), alpha=True) 40 | 41 | return make_jpg_or_gif(images, make) 42 | 43 | 44 | add_meme( 45 | "gong_xi_fa_cai", 46 | gong_xi_fa_cai, 47 | min_images=1, 48 | max_images=1, 49 | min_texts=0, 50 | max_texts=1, 51 | keywords=["恭喜发财"], 52 | date_created=datetime(2024, 7, 26), 53 | date_modified=datetime(2024, 7, 26), 54 | ) 55 | -------------------------------------------------------------------------------- /emoji/gong_xi_fa_cai/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/gong_xi_fa_cai/images/0.png -------------------------------------------------------------------------------- /emoji/hitachi_mako_together/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def hitachi_mako_together(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "她" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"{name}:我要和四季夏目永远在一起" 26 | try: 27 | frame.draw_text( 28 | (170, 20, 900, 100), 29 | text, 30 | max_fontsize=70, 31 | min_fontsize=20, 32 | valign="bottom", 33 | ) 34 | except ValueError: 35 | raise TextOverLength(name) 36 | 37 | def make(imgs: list[BuildImage]) -> BuildImage: 38 | img = imgs[0].convert("RGBA").circle().resize((180, 180)) 39 | return frame.copy().paste(img, (665, 180), alpha=True) 40 | 41 | return make_jpg_or_gif(images, make) 42 | 43 | 44 | add_meme( 45 | "hitachi_mako_together", 46 | hitachi_mako_together, 47 | min_images=1, 48 | max_images=1, 49 | min_texts=0, 50 | max_texts=1, 51 | keywords=["和她在一起"], 52 | date_created=datetime(2024, 7, 26), 53 | date_modified=datetime(2024, 7, 26), 54 | ) 55 | -------------------------------------------------------------------------------- /emoji/hitachi_mako_together/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/hitachi_mako_together/images/0.png -------------------------------------------------------------------------------- /emoji/huochailu/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from PIL.Image import Image as IMG 5 | from pil_utils import BuildImage 6 | from meme_generator.tags import MemeTags 7 | from meme_generator import add_meme 8 | from meme_generator.utils import save_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def huochailu(images: list[BuildImage], texts, args): 14 | img = images[0].convert("RGBA").square().resize((110, 110)).circle() 15 | frames: list[IMG] = [] 16 | locs = [ 17 | (155, 155, 63, 28), 18 | (155, 155, 63, 28), 19 | (155, 155, 83, 38), 20 | (155, 155, 94, 40), 21 | (155, 155, 97, 45), 22 | (155, 155, 97, 45), 23 | ] 24 | for i in range(6): 25 | frame = BuildImage.open(img_dir / f"{i}.png") 26 | w, h, x, y = locs[i] 27 | frame.paste(img.resize((w, h)), (x, y), below=True) 28 | frames.append(frame.image) 29 | return save_gif(frames, 0.05) 30 | 31 | 32 | add_meme( 33 | "huochailu", 34 | huochailu, 35 | min_images=1, 36 | max_images=1, 37 | keywords=["火柴撸"], 38 | tags=MemeTags.stickman, 39 | date_created=datetime(2025, 5, 27), 40 | date_modified=datetime(2025, 5, 27), 41 | ) -------------------------------------------------------------------------------- /emoji/huochailu/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/huochailu/images/0.png -------------------------------------------------------------------------------- /emoji/huochailu/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/huochailu/images/1.png -------------------------------------------------------------------------------- /emoji/huochailu/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/huochailu/images/2.png -------------------------------------------------------------------------------- /emoji/huochailu/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/huochailu/images/3.png -------------------------------------------------------------------------------- /emoji/huochailu/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/huochailu/images/4.png -------------------------------------------------------------------------------- /emoji/huochailu/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/huochailu/images/5.png -------------------------------------------------------------------------------- /emoji/ice_tea_head/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def ice_tea_head(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "她" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"" 26 | try: 27 | frame.draw_text( 28 | (235, 615, 478, 659), 29 | text, 30 | max_fontsize=100, 31 | min_fontsize=20, 32 | valign="bottom", 33 | ) 34 | except ValueError: 35 | raise TextOverLength(name) 36 | 37 | def make(imgs: list[BuildImage]) -> BuildImage: 38 | #头像尺寸 39 | img = imgs[0].convert("RGBA").circle().resize((500, 500)) 40 | #头像坐标 41 | return frame.copy().paste(img, (320,35), alpha=True) 42 | 43 | return make_jpg_or_gif(images, make) 44 | 45 | 46 | add_meme( 47 | "ice_tea_head", 48 | ice_tea_head, 49 | min_images=1, 50 | max_images=1, 51 | min_texts=0, 52 | max_texts=1, 53 | keywords=["冰红茶"], 54 | date_created=datetime(2025, 3, 25), 55 | date_modified=datetime(2025, 3, 25), 56 | ) 57 | -------------------------------------------------------------------------------- /emoji/ice_tea_head/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/ice_tea_head/images/0.png -------------------------------------------------------------------------------- /emoji/ikun_basketball/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def ikun_basketball(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | def make(imgs: list[BuildImage]) -> BuildImage: 17 | #头像尺寸 18 | img = imgs[0].convert("RGBA").circle().resize((250, 250)) 19 | img = img.rotate(10, expand=True) 20 | #头像坐标 21 | return frame.copy().paste(img, (322, 129), alpha=True,below=True) 22 | 23 | return make_jpg_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "ikun_basketball", 28 | ikun_basketball, 29 | min_images=1, 30 | max_images=1, 31 | keywords=["篮球","🏀"], 32 | date_created=datetime(2025, 5, 29), 33 | date_modified=datetime(2025, 5, 29), 34 | ) 35 | -------------------------------------------------------------------------------- /emoji/ikun_basketball/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/ikun_basketball/images/0.png -------------------------------------------------------------------------------- /emoji/ikun_durian_head/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def ikun_durian_head(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "她" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"" 26 | try: 27 | frame.draw_text( 28 | (235, 615, 478, 659), 29 | text, 30 | max_fontsize=100, 31 | min_fontsize=20, 32 | valign="bottom", 33 | ) 34 | except ValueError: 35 | raise TextOverLength(name) 36 | 37 | def make(imgs: list[BuildImage]) -> BuildImage: 38 | #头像尺寸 39 | img = imgs[0].convert("RGBA").resize((180, 180)) 40 | #头像坐标 41 | return frame.copy().paste(img, (62, 93), alpha=True, below=True ) 42 | 43 | return make_jpg_or_gif(images, make) 44 | 45 | 46 | add_meme( 47 | "ikun_durian_head", 48 | ikun_durian_head, 49 | min_images=1, 50 | max_images=1, 51 | min_texts=0, 52 | max_texts=1, 53 | keywords=["榴莲坤头"], 54 | date_created=datetime(2025, 3, 29), 55 | date_modified=datetime(2025, 3, 29), 56 | ) 57 | -------------------------------------------------------------------------------- /emoji/ikun_durian_head/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/ikun_durian_head/images/0.png -------------------------------------------------------------------------------- /emoji/ikun_head/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def ikun_head(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "她" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"" 26 | try: 27 | frame.draw_text( 28 | (235, 615, 478, 659), 29 | text, 30 | max_fontsize=100, 31 | min_fontsize=20, 32 | valign="bottom", 33 | ) 34 | except ValueError: 35 | raise TextOverLength(name) 36 | 37 | def make(imgs: list[BuildImage]) -> BuildImage: 38 | #头像尺寸 39 | img = imgs[0].convert("RGBA").circle().resize((220, 220)) 40 | #头像坐标 41 | return frame.copy().paste(img, (73, 75), alpha=True, below=True ) 42 | 43 | return make_jpg_or_gif(images, make) 44 | 45 | 46 | add_meme( 47 | "ikun_head", 48 | ikun_head, 49 | min_images=1, 50 | max_images=1, 51 | min_texts=0, 52 | max_texts=1, 53 | keywords=["小黑子"], 54 | date_created=datetime(2025, 3, 25), 55 | date_modified=datetime(2025, 3, 25), 56 | ) 57 | -------------------------------------------------------------------------------- /emoji/ikun_head/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/ikun_head/images/0.png -------------------------------------------------------------------------------- /emoji/ikun_like/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | from meme_generator.utils import make_jpg_or_gif 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | default_text = "坤坤喜欢这个" 14 | 15 | 16 | def ikun_like(images: list[BuildImage], texts: list[str], args): 17 | text = texts[0] if texts else default_text 18 | frame = BuildImage.open(img_dir / "0.png") 19 | try: 20 | frame.draw_text( 21 | (5, frame.height - 60, frame.width - 5, frame.height - 10), 22 | text, 23 | max_fontsize=40, 24 | fill="white", 25 | stroke_fill="black", 26 | stroke_ratio=0.06, 27 | ) 28 | except ValueError: 29 | raise TextOverLength(text) 30 | 31 | def make(imgs: list[BuildImage]) -> BuildImage: 32 | img = imgs[0].convert("RGBA").resize((305, 235), keep_ratio=True) 33 | return frame.copy().paste(img, (106, 72), below=True) 34 | 35 | return make_jpg_or_gif(images, make) 36 | 37 | 38 | add_meme( 39 | "ikun_like", 40 | ikun_like, 41 | min_images=1, 42 | max_images=1, 43 | min_texts=0, 44 | max_texts=1, 45 | default_texts=[default_text], 46 | keywords=["坤坤喜欢"], 47 | tags=["ikun","坤坤","真爱粉","喜欢"], 48 | date_created=datetime(2025, 5, 25), 49 | date_modified=datetime(2025, 5, 25), 50 | ) 51 | -------------------------------------------------------------------------------- /emoji/ikun_like/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/ikun_like/images/0.png -------------------------------------------------------------------------------- /emoji/ikun_need_tv/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def ikun_need_tv(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | def make(imgs: list[BuildImage]) -> BuildImage: 17 | #头像尺寸 18 | img = imgs[0].convert("RGBA").resize((510, 510)) 19 | #头像坐标 20 | return frame.copy().paste(img, (620, 120), alpha=True,below=True) 21 | 22 | return make_jpg_or_gif(images, make) 23 | 24 | 25 | add_meme( 26 | "ikun_need_tv", 27 | ikun_need_tv, 28 | min_images=1, 29 | max_images=1, 30 | min_texts=0, 31 | max_texts=0, 32 | keywords=["坤坤想要","蔡徐坤想要","爱坤想要"], 33 | date_created=datetime(2025, 5, 30), 34 | date_modified=datetime(2025, 5, 30), 35 | ) 36 | -------------------------------------------------------------------------------- /emoji/ikun_need_tv/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/ikun_need_tv/images/0.png -------------------------------------------------------------------------------- /emoji/ikun_why_are_you/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def ikun_why_are_you(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.jpg") 15 | 16 | def make(imgs: list[BuildImage]) -> BuildImage: 17 | #头像尺寸 18 | img = imgs[0].convert("RGBA").circle().resize((120, 120)) 19 | img = img.rotate(-10, expand=True) 20 | #头像坐标 21 | return frame.copy().paste(img, (275, 75), alpha=True) 22 | 23 | 24 | return make_jpg_or_gif(images, make) 25 | 26 | 27 | add_meme( 28 | "ikun_why_are_you", 29 | ikun_why_are_you, 30 | min_images=1, 31 | max_images=1, 32 | min_texts=0, 33 | max_texts=1, 34 | keywords=["你干嘛","你干吗"], 35 | date_created=datetime(2024, 7, 26), 36 | date_modified=datetime(2024, 7, 26), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/ikun_why_are_you/images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/ikun_why_are_you/images/0.jpg -------------------------------------------------------------------------------- /emoji/jd_delivery_person/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/jd_delivery_person/images/0.png -------------------------------------------------------------------------------- /emoji/jd_takeout/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def jd_takeout(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | def make(imgs: list[BuildImage]) -> BuildImage: 17 | #头像尺寸 18 | img = imgs[0].convert("RGBA").circle().resize((230, 230)) 19 | img = img.rotate(10, expand=True) 20 | #头像坐标 21 | return frame.copy().paste(img, (625, 5), alpha=True,below=True) 22 | 23 | return make_jpg_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "jd_takeout", 28 | jd_takeout, 29 | min_images=1, 30 | max_images=1, 31 | keywords=["京东外卖"], 32 | date_created=datetime(2025, 5, 29), 33 | date_modified=datetime(2025, 5, 29), 34 | ) 35 | -------------------------------------------------------------------------------- /emoji/jd_takeout/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/jd_takeout/images/0.png -------------------------------------------------------------------------------- /emoji/kfc/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def kfc(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | def make(imgs: list[BuildImage]) -> BuildImage: 17 | #头像尺寸 18 | img = imgs[0].convert("RGBA").circle().resize((500, 500)) 19 | img = img.rotate(15, expand=True) 20 | #头像坐标 21 | return frame.copy().paste(img, (65, 65), alpha=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "kfc", 28 | kfc, 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["kfc","KFC","肯德基"], 34 | date_created=datetime(2025, 5, 29), 35 | date_modified=datetime(2025, 5, 29), 36 | ) 37 | -------------------------------------------------------------------------------- /emoji/kfc/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kfc/images/0.png -------------------------------------------------------------------------------- /emoji/kfc_thursday/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def kfc_thursday(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | def make(imgs: list[BuildImage]) -> BuildImage: 17 | #头像尺寸 18 | img = imgs[0].convert("RGBA").circle().resize((450, 450)) 19 | #头像坐标 20 | return frame.copy().paste(img, (775, 390), alpha=True) 21 | 22 | return make_jpg_or_gif(images, make) 23 | 24 | 25 | add_meme( 26 | "kfc_thursday", 27 | kfc_thursday, 28 | min_images=1, 29 | max_images=1, 30 | keywords=["星期四","疯狂星期四"], 31 | date_created=datetime(2025, 5, 29), 32 | date_modified=datetime(2025, 5, 29), 33 | ) 34 | -------------------------------------------------------------------------------- /emoji/kfc_thursday/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kfc_thursday/images/0.png -------------------------------------------------------------------------------- /emoji/kou/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from meme_generator import add_meme 5 | from meme_generator.utils import save_gif 6 | from PIL.Image import Image as IMG 7 | from pil_utils import BuildImage 8 | 9 | img_dir = Path(__file__).parent / "images" 10 | 11 | def kou(images: list[BuildImage], texts, args): 12 | # 坐标参数保持不变 13 | self_locs = [(30, 37), (36, 42)] # 己方头像位置 (x,y) 14 | user_locs = [(67, 99), (71, 98)] # 对方头像位置 (x,y) 15 | 16 | # 处理己方头像(添加旋转) 17 | self_head = ( 18 | images[0] 19 | .convert("RGBA") 20 | .resize((58, 58), keep_ratio=True) 21 | .circle() 22 | .rotate(15) # 保持15度旋转 23 | ) 24 | 25 | # 处理对方头像(移除旋转) 26 | user_head = ( 27 | images[1] 28 | .convert("RGBA") 29 | .resize((48, 48), keep_ratio=True) 30 | .circle() # 移除rotate(90) 31 | ) 32 | 33 | frames: list[IMG] = [] 34 | for i in range(2): 35 | # 获取模板尺寸 36 | template = BuildImage.open(img_dir / f"{i}.png") 37 | 38 | # 创建透明画布(与模板同尺寸) 39 | frame = BuildImage.new("RGBA", template.size) 40 | 41 | # 先贴两个头像(底层) 42 | frame.paste(user_head, user_locs[i], alpha=True) # 对方头像 43 | frame.paste(self_head, self_locs[i], alpha=True) # 己方头像 44 | 45 | # 最后覆盖模板图(上层) 46 | frame.paste(template, (0, 0), alpha=True) # 关键修改点 47 | 48 | frames.append(frame.image) 49 | 50 | return save_gif(frames, 0.05) # 保持原帧率 51 | 52 | add_meme( 53 | "kou", 54 | kou, 55 | min_images=2, 56 | max_images=2, 57 | keywords=["口"], 58 | date_created=datetime(2025, 5, 27), 59 | date_modified=datetime(2025, 5, 27), 60 | ) -------------------------------------------------------------------------------- /emoji/kou/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kou/images/0.png -------------------------------------------------------------------------------- /emoji/kou/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kou/images/1.png -------------------------------------------------------------------------------- /emoji/kurogames_carlotta_holdsign/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def kurogames_carlotta_holdsign(images, texts: list[str], args): 14 | text = texts[0] 15 | frame = BuildImage.open(img_dir / "0.png") 16 | try: 17 | frame.draw_text( 18 | (196, 552, 785, 920), 19 | text, 20 | fill=(0, 0, 0), 21 | allow_wrap=True, 22 | max_fontsize=120, 23 | min_fontsize=30, 24 | lines_align="center", 25 | font_families=["FZSJ-QINGCRJ"], 26 | ) 27 | except ValueError: 28 | raise TextOverLength(text) 29 | return frame.save_jpg() 30 | 31 | 32 | add_meme( 33 | "kurogames_carlotta_holdsign", 34 | kurogames_carlotta_holdsign, 35 | min_texts=1, 36 | max_texts=1, 37 | default_texts=["十连三金"], 38 | keywords=["珂莱塔举牌"], 39 | date_created=datetime(2025, 5, 17), 40 | date_modified=datetime(2025, 5, 17), 41 | ) -------------------------------------------------------------------------------- /emoji/kurogames_carlotta_holdsign/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kurogames_carlotta_holdsign/images/0.png -------------------------------------------------------------------------------- /emoji/kurogames_cartethyia_holdsign/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def kurogames_cartethyia_holdsign(images, texts: list[str], args): 14 | text = texts[0] 15 | frame = BuildImage.open(img_dir / "0.png") 16 | try: 17 | frame.draw_text( 18 | (190, 565, 780, 945), 19 | text, 20 | fill=(0, 0, 0), 21 | allow_wrap=True, 22 | max_fontsize=120, 23 | min_fontsize=30, 24 | lines_align="center", 25 | font_families=["FZShaoEr-M11S"], 26 | ) 27 | except ValueError: 28 | raise TextOverLength(text) 29 | return frame.save_jpg() 30 | 31 | 32 | add_meme( 33 | "kurogames_cartethyia_holdsign", 34 | kurogames_cartethyia_holdsign, 35 | min_texts=1, 36 | max_texts=1, 37 | default_texts=["一份青枝月桂沙拉谢谢"], 38 | keywords=["卡提举牌", "卡提希娅举牌", "卡提西亚举牌"], 39 | tags=MemeTags.bronya, 40 | date_created=datetime(2025, 5, 17), 41 | date_modified=datetime(2025, 5, 17), 42 | ) 43 | -------------------------------------------------------------------------------- /emoji/kurogames_cartethyia_holdsign/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kurogames_cartethyia_holdsign/images/0.png -------------------------------------------------------------------------------- /emoji/kurogames_changli_finger/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def kurogames_changli_finger(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").resize((100, 100)) 20 | #头像坐标 21 | return frame.copy().paste(img, (243, 103), alpha=True, below=True ) 22 | 23 | return make_jpg_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "kurogames_changli_finger", 28 | kurogames_changli_finger, 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=1, 33 | keywords=["长离指"], 34 | tags=MemeTags.wuthering_waves, 35 | date_created=datetime(2025, 5, 10), 36 | date_modified=datetime(2025, 5, 10), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/kurogames_changli_finger/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kurogames_changli_finger/images/0.png -------------------------------------------------------------------------------- /emoji/kurogames_gugu_blowfish_small_classes/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def kurogames_gugu_blowfish_small_classes(images, texts: list[str], args): 15 | text = texts[0] 16 | frame = BuildImage.open(img_dir / "0.jpg") 17 | try: 18 | frame.draw_text( 19 | (65, 173, 1301, 897), 20 | text, 21 | fill=(0, 0, 0), 22 | allow_wrap=True, 23 | max_fontsize=150, 24 | min_fontsize=20, 25 | lines_align="left", 26 | font_families=["FZShaoEr-M11S"], 27 | ) 28 | except ValueError: 29 | raise TextOverLength(text) 30 | return frame.save_jpg() 31 | 32 | 33 | add_meme( 34 | "kurogames_gugu_blowfish_small_classes", 35 | kurogames_gugu_blowfish_small_classes, 36 | min_texts=1, 37 | max_texts=1, 38 | default_texts=["松伦哥,不要再涩涩了"], 39 | keywords=["咕咕河豚小课堂","小课堂"], 40 | tags=MemeTags.wuthering_waves, 41 | date_created=datetime(2025, 6, 1), 42 | date_modified=datetime(2025, 6, 1), 43 | ) -------------------------------------------------------------------------------- /emoji/kurogames_gugu_blowfish_small_classes/images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kurogames_gugu_blowfish_small_classes/images/0.jpg -------------------------------------------------------------------------------- /emoji/kurogames_lingyang_holdsign/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def kurogames_lingyang_holdsign(images, texts: list[str], args): 14 | text = texts[0] 15 | frame = BuildImage.open(img_dir / "0.png") 16 | try: 17 | frame.draw_text( 18 | (13, 503, 563, 805), 19 | text, 20 | fill=(0, 0, 0), 21 | allow_wrap=True, 22 | max_fontsize=120, 23 | min_fontsize=30, 24 | lines_align="center", 25 | font_families=["FZShaoEr-M11S"], 26 | ) 27 | except ValueError: 28 | raise TextOverLength(text) 29 | return frame.save_png() 30 | 31 | 32 | add_meme( 33 | "kurogames_lingyang_holdsign", 34 | kurogames_lingyang_holdsign, 35 | min_texts=1, 36 | max_texts=1, 37 | default_texts=["你必定歪我"], 38 | keywords=["凌阳举牌", "雪豹举牌"], 39 | tags=MemeTags.wuthering_waves, 40 | date_created=datetime(2025, 5, 25), 41 | date_modified=datetime(2025, 5, 25), 42 | ) -------------------------------------------------------------------------------- /emoji/kurogames_lingyang_holdsign/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kurogames_lingyang_holdsign/images/0.png -------------------------------------------------------------------------------- /emoji/kurogames_mortefi_holdsign/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def kurogames_mortefi_holdsign(images, texts: list[str], args): 14 | text = texts[0] 15 | frame = BuildImage.open(img_dir / "0.png") 16 | try: 17 | frame.draw_text( 18 | (56, 286, 202, 473), 19 | text, 20 | fill=(255, 255, 255), 21 | allow_wrap=True, 22 | max_fontsize=120, 23 | min_fontsize=30, 24 | lines_align="center", 25 | font_families=["FZXS14"], 26 | ) 27 | except ValueError: 28 | raise TextOverLength(text) 29 | return frame.save_png() 30 | 31 | 32 | add_meme( 33 | "kurogames_mortefi_holdsign", 34 | kurogames_mortefi_holdsign, 35 | min_texts=1, 36 | max_texts=1, 37 | default_texts=["今汐令尹万岁!"], 38 | keywords=["莫特斐举牌"], 39 | tags=MemeTags.wuthering_waves, 40 | date_created=datetime(2025, 5, 26), 41 | date_modified=datetime(2025, 5, 26), 42 | ) -------------------------------------------------------------------------------- /emoji/kurogames_mortefi_holdsign/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kurogames_mortefi_holdsign/images/0.png -------------------------------------------------------------------------------- /emoji/kurogames_mp/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def kurogames_mp(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | ta = "她" 18 | name = ta 19 | if texts: 20 | name = texts[0] 21 | elif args.user_infos: 22 | info = args.user_infos[0] 23 | ta = "他" if info.gender == "male" else "她" 24 | name = info.name or ta 25 | 26 | text = f"" 27 | try: 28 | frame.draw_text( 29 | (50, 20, 700, 130), 30 | text, 31 | max_fontsize=70, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((130, 130)) 40 | img_rotated = img.rotate(25, expand=True) # 向左旋转18度 41 | return frame.copy().paste(img_rotated, (300, 2), alpha=True) 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "kurogames_mp", 47 | kurogames_mp, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["鸣批","鸣P","鸣p","鸣潮玩家","鸣潮男"], 53 | tags=MemeTags.wuthering_waves, 54 | date_created=datetime(2025, 3, 7), 55 | date_modified=datetime(2025, 3, 7), 56 | ) 57 | -------------------------------------------------------------------------------- /emoji/kurogames_mp/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kurogames_mp/images/0.png -------------------------------------------------------------------------------- /emoji/kurogames_phoebe_ score_sheet/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kurogames_phoebe_ score_sheet/images/0.png -------------------------------------------------------------------------------- /emoji/kurogames_phoebe_say/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def kurogames_phoebe_say(images, texts: list[str], args): 14 | text = texts[0] 15 | frame = BuildImage.open(img_dir / "0.jpg") 16 | try: 17 | frame.draw_text( 18 | (15, 29, 954, 387), 19 | text, 20 | fill=(0, 0, 0), 21 | allow_wrap=True, 22 | max_fontsize=120, 23 | min_fontsize=50, 24 | lines_align="center", 25 | font_families=["FZShaoEr-M11S"], 26 | ) 27 | except ValueError: 28 | raise TextOverLength(text) 29 | return frame.save_jpg() 30 | 31 | 32 | add_meme( 33 | "kurogames_phoebe_say", 34 | kurogames_phoebe_say, 35 | min_texts=1, 36 | max_texts=1, 37 | default_texts=["嘟嘟嘟说什么呢"], 38 | keywords=["菲比说"], 39 | tags=MemeTags.wuthering_waves, 40 | date_created=datetime(2025, 5, 10), 41 | date_modified=datetime(2025, 5, 10), 42 | ) 43 | -------------------------------------------------------------------------------- /emoji/kurogames_phoebe_say/images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kurogames_phoebe_say/images/0.jpg -------------------------------------------------------------------------------- /emoji/kurogames_rover_head/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def kurogames_rover_head(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((1200, 1200)) 20 | img = img.rotate(10, expand=True) 21 | #头像坐标 22 | return frame.copy().paste(img, (248, 250), alpha=True,below=True) 23 | 24 | return make_png_or_gif(images, make) 25 | 26 | 27 | add_meme( 28 | "kurogames_rover_head", 29 | kurogames_rover_head, 30 | min_images=1, 31 | max_images=1, 32 | min_texts=0, 33 | max_texts=1, 34 | keywords=["漂泊者头像框"], 35 | tags=MemeTags.wuthering_waves, 36 | date_created=datetime(2025, 5, 25), 37 | date_modified=datetime(2025, 5, 25), 38 | ) 39 | -------------------------------------------------------------------------------- /emoji/kurogames_rover_head/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kurogames_rover_head/images/0.png -------------------------------------------------------------------------------- /emoji/kurogames_rover_holdsign/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def kurogames_rover_holdsign(images, texts: list[str], args): 14 | text = texts[0] 15 | frame = BuildImage.open(img_dir / "0.png") 16 | try: 17 | frame.draw_text( 18 | (279, 791, 625, 1134), 19 | text, 20 | fill=(0, 0, 0), 21 | allow_wrap=True, 22 | max_fontsize=120, 23 | min_fontsize=30, 24 | lines_align="center", 25 | font_families=["FZShaoEr-M11S"], 26 | ) 27 | except ValueError: 28 | raise TextOverLength(text) 29 | return frame.save_jpg() 30 | 31 | 32 | add_meme( 33 | "kurogames_rover_holdsign", 34 | kurogames_rover_holdsign, 35 | min_texts=1, 36 | max_texts=1, 37 | default_texts=["不可以色色"], 38 | keywords=["漂泊者举牌"], 39 | tags=MemeTags.wuthering_waves, 40 | date_created=datetime(2025, 5, 17), 41 | date_modified=datetime(2025, 5, 17), 42 | ) -------------------------------------------------------------------------------- /emoji/kurogames_rover_holdsign/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kurogames_rover_holdsign/images/0.png -------------------------------------------------------------------------------- /emoji/kurogames_songlun/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def kurogames_songlun(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | ta = "她" 18 | name = ta 19 | if texts: 20 | name = texts[0] 21 | elif args.user_infos: 22 | info = args.user_infos[0] 23 | ta = "他" if info.gender == "male" else "她" 24 | name = info.name or ta 25 | 26 | text = f"" 27 | try: 28 | frame.draw_text( 29 | (50, 20, 700, 130), 30 | text, 31 | max_fontsize=70, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((180, 180)) 40 | return frame.copy().paste(img, (500, 100), alpha=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "kurogames_songlun", 47 | kurogames_songlun, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["松伦哥指", "潮批"], 53 | tags=MemeTags.wuthering_waves, 54 | date_created=datetime(2025, 3, 7), 55 | date_modified=datetime(2025, 3, 7), 56 | ) 57 | -------------------------------------------------------------------------------- /emoji/kurogames_songlun/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kurogames_songlun/images/0.png -------------------------------------------------------------------------------- /emoji/kurogames_songlun_holdsign/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def kurogames_songlun_holdsign (images, texts: list[str], args): 14 | text = texts[0] 15 | frame = BuildImage.open(img_dir / "0.jpg") 16 | try: 17 | frame.draw_text( 18 | (186, 672, 843, 930), 19 | text, 20 | fill=(0, 0, 0), 21 | allow_wrap=True, 22 | max_fontsize=120, 23 | min_fontsize=30, 24 | lines_align="center", 25 | font_families=["FZSJ-QINGCRJ"], 26 | ) 27 | except ValueError: 28 | raise TextOverLength(text) 29 | return frame.save_jpg() 30 | 31 | 32 | add_meme( 33 | "kurogames_songlun_holdsign", 34 | kurogames_songlun_holdsign, 35 | min_texts=1, 36 | max_texts=1, 37 | default_texts=["你必歪雪豹"], 38 | keywords=["李松伦举牌","松伦举牌","松伦哥举牌"], 39 | tags=MemeTags.wuthering_waves, 40 | date_created=datetime(2025, 5, 17), 41 | date_modified=datetime(2025, 5, 17), 42 | ) -------------------------------------------------------------------------------- /emoji/kurogames_songlun_holdsign/images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kurogames_songlun_holdsign/images/0.jpg -------------------------------------------------------------------------------- /emoji/kurogames_verina_holdsign/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def kurogames_verina_holdsign(images, texts: list[str], args): 14 | text = texts[0] 15 | frame = BuildImage.open(img_dir / "0.png") 16 | try: 17 | frame.draw_text( 18 | (475, 525, 790, 775), 19 | text, 20 | fill=(0, 0, 0), 21 | allow_wrap=True, 22 | max_fontsize=120, 23 | min_fontsize=30, 24 | lines_align="center", 25 | font_families=["FZShaoEr-M11S"], 26 | ) 27 | except ValueError: 28 | raise TextOverLength(text) 29 | return frame.save_png() 30 | 31 | 32 | add_meme( 33 | "kurogames_verina_holdsign", 34 | kurogames_verina_holdsign, 35 | min_texts=1, 36 | max_texts=1, 37 | default_texts=["不可以色色"], 38 | keywords=["小维举牌", "维里奈举牌"], 39 | tags=MemeTags.wuthering_waves, 40 | date_created=datetime(2025, 5, 17), 41 | date_modified=datetime(2025, 5, 17), 42 | ) -------------------------------------------------------------------------------- /emoji/kurogames_verina_holdsign/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kurogames_verina_holdsign/images/0.png -------------------------------------------------------------------------------- /emoji/kurogames_verina_holdsign/images/backup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kurogames_verina_holdsign/images/backup.png -------------------------------------------------------------------------------- /emoji/kurogames_zhezhi_holdsign/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def kurogames_zhezhi_holdsign (images, texts: list[str], args): 14 | text = texts[0] 15 | frame = BuildImage.open(img_dir / "0.png") 16 | try: 17 | frame.draw_text( 18 | (319, 505, 1053, 993), 19 | text, 20 | fill=(0, 0, 0), 21 | allow_wrap=True, 22 | max_fontsize=120, 23 | min_fontsize=30, 24 | lines_align="center", 25 | font_families=["FZSJ-QINGCRJ"], 26 | ) 27 | except ValueError: 28 | raise TextOverLength(text) 29 | return frame.save_jpg() 30 | 31 | 32 | add_meme( 33 | "kurogames_zhezhi_holdsign", 34 | kurogames_zhezhi_holdsign, 35 | min_texts=1, 36 | max_texts=1, 37 | default_texts=["祝你鸣潮玩的开心"], 38 | keywords=["折枝举牌"], 39 | tags=MemeTags.wuthering_waves, 40 | date_created=datetime(2025, 5, 17), 41 | date_modified=datetime(2025, 5, 17), 42 | ) -------------------------------------------------------------------------------- /emoji/kurogames_zhezhi_holdsign/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/kurogames_zhezhi_holdsign/images/0.png -------------------------------------------------------------------------------- /emoji/mahiro_fuck/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def mahiro_fuck(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "她" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"" 26 | try: 27 | frame.draw_text( 28 | (50, 20, 700, 130), 29 | text, 30 | max_fontsize=70, 31 | min_fontsize=20, 32 | valign="bottom", 33 | ) 34 | except ValueError: 35 | raise TextOverLength(name) 36 | 37 | def make(imgs: list[BuildImage]) -> BuildImage: 38 | img = imgs[0].convert("RGBA").circle().resize((180, 180)) 39 | return frame.copy().paste(img, (430, 40), alpha=True) 40 | 41 | return make_jpg_or_gif(images, make) 42 | 43 | 44 | add_meme( 45 | "mahiro_fuck", 46 | mahiro_fuck, 47 | min_images=1, 48 | max_images=1, 49 | min_texts=0, 50 | max_texts=1, 51 | keywords=["真寻中指","中指","🖕🏻"], 52 | date_created=datetime(2024, 7, 26), 53 | date_modified=datetime(2024, 7, 26), 54 | ) 55 | -------------------------------------------------------------------------------- /emoji/mahiro_fuck/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mahiro_fuck/images/0.png -------------------------------------------------------------------------------- /emoji/mi_monkey/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def mi_monkey(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "她" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"" 26 | try: 27 | frame.draw_text( 28 | (50, 20, 700, 130), 29 | text, 30 | max_fontsize=70, 31 | min_fontsize=20, 32 | valign="bottom", 33 | ) 34 | except ValueError: 35 | raise TextOverLength(name) 36 | 37 | def make(imgs: list[BuildImage]) -> BuildImage: 38 | img = imgs[0].convert("RGBA").circle().resize((180, 180)) 39 | return frame.copy().paste(img, (500, 100), alpha=True) 40 | 41 | return make_jpg_or_gif(images, make) 42 | 43 | 44 | add_meme( 45 | "mi_monkey", 46 | mi_monkey, 47 | min_images=1, 48 | max_images=1, 49 | min_texts=0, 50 | max_texts=1, 51 | keywords=["米猴", "🐒", "🐵"], 52 | date_created=datetime(2024, 7, 26), 53 | date_modified=datetime(2024, 7, 26), 54 | ) 55 | -------------------------------------------------------------------------------- /emoji/mi_monkey/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mi_monkey/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_amber_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_amber_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (36, 40), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_amber_frame", 28 | mihoyo_amber_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["安柏相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_amber_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_amber_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_barbara_pegg_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_barbara_pegg_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (36, 42), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_barbara_pegg_frame", 28 | mihoyo_barbara_pegg_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["芭芭拉相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_barbara_pegg_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_barbara_pegg_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_barbatos_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_barbatos_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (36, 40), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_barbatos_frame", 28 | mihoyo_barbatos_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["巴巴托斯","风神相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_barbatos_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_barbatos_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_caribert_alberich_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_caribert_alberich_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((490, 490)) 20 | #头像坐标 21 | return frame.copy().paste(img, (72, 80), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_caribert_alberich_frame", 28 | mihoyo_caribert_alberich_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["卡利贝尔相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_caribert_alberich_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_caribert_alberich_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_chasca_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_chasca_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (40, 42), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_chasca_frame", 28 | mihoyo_chasca_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["恰斯卡相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_chasca_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_chasca_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_citlali_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_citlali_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((270, 270)) 20 | #头像坐标 21 | return frame.copy().paste(img, (30, 30), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_citlali_frame", 28 | mihoyo_citlali_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["茜特菈莉相框","奶奶相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_citlali_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_citlali_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_editorial_society_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_editorial_society_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (36, 42), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_editorial_society_frame", 28 | mihoyo_editorial_society_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["编辑协会相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_editorial_society_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_editorial_society_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_elysia_come/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from meme_generator import add_meme 5 | from pil_utils import BuildImage 6 | from meme_generator.tags import MemeTags 7 | 8 | img_dir = Path(__file__).parent / "images" 9 | 10 | 11 | def mihoyo_elysia_come(images: list[BuildImage], texts, args): 12 | frame = BuildImage.open(img_dir / "0.png") 13 | frame.paste( 14 | #男右 15 | images[1].convert("RGBA").circle().resize((190, 190)), (410, 380), alpha=True,below=True 16 | ).paste( 17 | #爱莉希雅左 18 | images[0].convert("RGBA").circle().resize((130, 130)), (92, 310), alpha=True,below=True 19 | ) 20 | return frame.save_jpg() 21 | 22 | 23 | add_meme( 24 | "mihoyo_elysia_come", 25 | mihoyo_elysia_come, 26 | min_images=2, 27 | max_images=2, 28 | keywords=["爱莉希雅降临"], 29 | tags=MemeTags.mihoyo, 30 | date_created=datetime(2025, 5, 25), 31 | date_modified=datetime(2025, 5, 25), 32 | ) 33 | -------------------------------------------------------------------------------- /emoji/mihoyo_elysia_come/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_elysia_come/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_funina_card/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def mihoyo_funina_card (images, texts: list[str], args): 14 | text = texts[0] 15 | frame = BuildImage.open(img_dir / "0.png") 16 | try: 17 | frame.draw_text( 18 | (361, 274, 1392, 940), 19 | text, 20 | fill=(0, 0, 0), 21 | allow_wrap=True, 22 | max_fontsize=120, 23 | min_fontsize=30, 24 | lines_align="center", 25 | font_families=["FZShaoEr-M11S"], 26 | ) 27 | except ValueError: 28 | raise TextOverLength(text) 29 | return frame.save_jpg() 30 | 31 | 32 | add_meme( 33 | "mihoyo_funina_card", 34 | mihoyo_funina_card, 35 | min_texts=1, 36 | max_texts=1, 37 | default_texts=["曾经我是戴上假面的演员,只想要掩饰真相…"], 38 | keywords=["芙芙卡片","芙宁娜卡片","芙芙酱卡片"], 39 | tags=MemeTags.genshin, 40 | date_created=datetime(2025, 5, 17), 41 | date_modified=datetime(2025, 5, 26), 42 | ) -------------------------------------------------------------------------------- /emoji/mihoyo_funina_card/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_funina_card/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_funina_death_penalty/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_funina_death_penalty/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_funina_finger/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_funina_finger(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | ta = "她" 18 | name = ta 19 | if texts: 20 | name = texts[0] 21 | elif args.user_infos: 22 | info = args.user_infos[0] 23 | ta = "他" if info.gender == "male" else "她" 24 | name = info.name or ta 25 | 26 | text = f"" 27 | try: 28 | frame.draw_text( 29 | (50, 20, 700, 130), 30 | text, 31 | max_fontsize=70, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((500, 500)) 40 | return frame.copy().paste(img, (1400, 650), alpha=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "mihoyo_funina_finger", 47 | mihoyo_funina_finger, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["芙芙指","芙宁娜指","芙芙酱指"], 53 | tags=MemeTags.genshin, 54 | date_created=datetime(2025, 5, 25), 55 | date_modified=datetime(2025, 5, 25), 56 | ) 57 | -------------------------------------------------------------------------------- /emoji/mihoyo_funina_finger/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_funina_finger/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_funina_holdsign/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def mihoyo_funina_holdsign (images, texts: list[str], args): 14 | text = texts[0] 15 | frame = BuildImage.open(img_dir / "0.png") 16 | try: 17 | frame.draw_text( 18 | (451, 258, 736, 477), 19 | text, 20 | fill=(0, 0, 0), 21 | allow_wrap=True, 22 | max_fontsize=120, 23 | min_fontsize=30, 24 | lines_align="left", 25 | font_families=["FZSJ-QINGCRJ"], 26 | ) 27 | except ValueError: 28 | raise TextOverLength(text) 29 | return frame.save_png() 30 | 31 | 32 | add_meme( 33 | "mihoyo_funina_holdsign", 34 | mihoyo_funina_holdsign, 35 | min_texts=1, 36 | max_texts=1, 37 | default_texts=["大伟丘,你的声音太尖锐了"], 38 | keywords=["芙宁娜举牌","芙芙举牌","芙芙酱举牌"], 39 | tags=MemeTags.mihoyo, 40 | date_created=datetime(2025, 6, 1), 41 | date_modified=datetime(2025, 6, 1), 42 | ) -------------------------------------------------------------------------------- /emoji/mihoyo_funina_holdsign/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_funina_holdsign/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_funina_round_head/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_funina_round_head(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | ta = "她" 18 | name = ta 19 | if texts: 20 | name = texts[0] 21 | elif args.user_infos: 22 | info = args.user_infos[0] 23 | ta = "他" if info.gender == "male" else "她" 24 | name = info.name or ta 25 | 26 | text = f"" 27 | try: 28 | frame.draw_text( 29 | (235, 615, 478, 659), 30 | text, 31 | max_fontsize=100, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | #头像尺寸 40 | img = imgs[0].convert("RGBA").circle().resize((500, 500)) 41 | #头像坐标 42 | return frame.copy().paste(img, (68, 68), alpha=True, below=True ) 43 | 44 | return make_jpg_or_gif(images, make) 45 | 46 | 47 | add_meme( 48 | "mihoyo_funina_round_head", 49 | mihoyo_funina_round_head, 50 | min_images=1, 51 | max_images=1, 52 | min_texts=0, 53 | max_texts=1, 54 | keywords=["芙芙圆形头像","芙宁娜圆形头像"], 55 | tags=MemeTags.genshin, 56 | date_created=datetime(2025, 3, 29), 57 | date_modified=datetime(2025, 3, 29), 58 | ) 59 | -------------------------------------------------------------------------------- /emoji/mihoyo_funina_round_head/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_funina_round_head/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_funina_square_head/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_funina_square_head/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_gemini_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_gemini_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (38, 40), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_gemini_frame", 28 | mihoyo_gemini_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["双子相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_gemini_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_gemini_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_genshin_impact_op/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_genshin_impact_op(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | ta = "她" 18 | name = ta 19 | if texts: 20 | name = texts[0] 21 | elif args.user_infos: 22 | info = args.user_infos[0] 23 | ta = "他" if info.gender == "male" else "她" 24 | name = info.name or ta 25 | 26 | text = f"" 27 | try: 28 | frame.draw_text( 29 | (50, 20, 700, 130), 30 | text, 31 | max_fontsize=70, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((180, 180)) 40 | return frame.copy().paste(img, (500, 100), alpha=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "mihoyo_genshin_impact_op", 47 | mihoyo_genshin_impact_op, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["OP","op", "Op","oP"], 53 | tags=MemeTags.genshin, 54 | date_created=datetime(2024, 7, 26), 55 | date_modified=datetime(2024, 7, 26), 56 | ) 57 | -------------------------------------------------------------------------------- /emoji/mihoyo_genshin_impact_op/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_genshin_impact_op/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_genshin_impact_players/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_genshin_impact_players/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_guoba_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_guoba_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (44,42), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_guoba_frame", 28 | mihoyo_guoba_frame, 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["锅巴相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_guoba_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_guoba_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_hilichurl_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_hilichurl_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((240, 240)) 20 | #头像坐标 21 | return frame.copy().paste(img, (40, 40), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_hilichurl_frame", 28 | mihoyo_hilichurl_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["丘丘人相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_hilichurl_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_hilichurl_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_hutao_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_hutao_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (36, 42), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_hutao_frame", 28 | mihoyo_hutao_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["胡桃相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_hutao_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_hutao_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_kaveh_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_kaveh_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (36, 42), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_kaveh_frame", 28 | mihoyo_kaveh_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["卡维相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_kaveh_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_kaveh_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_klee_duduke_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_klee_duduke_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (36, 42), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_klee_duduke_frame", 28 | mihoyo_klee_duduke_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["可莉嘟嘟可相框","嘟嘟可"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_klee_duduke_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_klee_duduke_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_klee_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_klee_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (36, 42), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_klee_frame", 28 | mihoyo_klee_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["可莉相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_klee_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_klee_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_klee_hat_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_klee_hat_frame(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((240, 240)) 20 | #头像坐标 21 | return frame.copy().paste(img, (40, 40), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_klee_hat_frame", 28 | mihoyo_klee_hat_frame, 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["可莉帽子相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_klee_hat_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_klee_hat_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_kujou_sara_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_kujou_sara_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (36, 42), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_kujou_sara_frame", 28 | mihoyo_kujou_sara_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["九条裟罗相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_kujou_sara_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_kujou_sara_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_kuki_shinobu_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_kuki_shinobu_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (38, 40), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_kuki_shinobu_frame", 28 | mihoyo_kuki_shinobu_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["久岐忍相框","阿忍相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_kuki_shinobu_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_kuki_shinobu_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_lce_slime_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_lce_slime_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (40, 38), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_lce_slime_frame", 28 | mihoyo_lce_slime_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["冰史莱姆相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_lce_slime_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_lce_slime_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_liuwei_holdsign/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def mihoyo_liuwei_holdsign (images, texts: list[str], args): 14 | text = texts[0] 15 | frame = BuildImage.open(img_dir / "0.jpg") 16 | try: 17 | frame.draw_text( 18 | (204, 596, 763, 918), 19 | text, 20 | fill=(0, 0, 0), 21 | allow_wrap=True, 22 | max_fontsize=120, 23 | min_fontsize=30, 24 | lines_align="center", 25 | font_families=["FZSJ-QINGCRJ"], 26 | ) 27 | except ValueError: 28 | raise TextOverLength(text) 29 | return frame.save_jpg() 30 | 31 | 32 | add_meme( 33 | "mihoyo_liuwei_holdsign", 34 | mihoyo_liuwei_holdsign, 35 | min_texts=1, 36 | max_texts=1, 37 | default_texts=["你的声音太尖锐了"], 38 | keywords=["刘伟举牌","大伟举牌","大伟哥举牌"], 39 | tags=MemeTags.mihoyo, 40 | date_created=datetime(2025, 5, 17), 41 | date_modified=datetime(2025, 5, 17), 42 | ) -------------------------------------------------------------------------------- /emoji/mihoyo_liuwei_holdsign/images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_liuwei_holdsign/images/0.jpg -------------------------------------------------------------------------------- /emoji/mihoyo_lynette_holdsign/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def mihoyo_lynette_holdsign(images, texts: list[str], args): 14 | text = texts[0] 15 | frame = BuildImage.open(img_dir / "0.png") 16 | try: 17 | frame.draw_text( 18 | (564, 1488, 1330, 1909), 19 | text, 20 | fill=(0, 0, 0), 21 | allow_wrap=True, 22 | max_fontsize=120, 23 | min_fontsize=30, 24 | lines_align="center", 25 | font_families=["FZShaoEr-M11S"], 26 | ) 27 | except ValueError: 28 | raise TextOverLength(text) 29 | return frame.save_png() 30 | 31 | 32 | add_meme( 33 | "mihoyo_lynette_holdsign", 34 | mihoyo_lynette_holdsign, 35 | min_texts=1, 36 | max_texts=1, 37 | default_texts=["林尼大笨蛋"], 38 | keywords=["琳妮特举牌"], 39 | tags=MemeTags.mihoyo, 40 | date_created=datetime(2025, 5, 26), 41 | date_modified=datetime(2025, 5, 26), 42 | ) -------------------------------------------------------------------------------- /emoji/mihoyo_lynette_holdsign/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_lynette_holdsign/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_outlander_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_outlander_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (36, 42), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_outlander_frame", 28 | mihoyo_outlander_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["异乡人相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_outlander_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_outlander_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_paimon_crown/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_paimon_crown (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((490, 490)) 20 | #头像坐标 21 | return frame.copy().paste(img, (72, 84), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_paimon_crown", 28 | mihoyo_paimon_crown, 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["派蒙王冠","派蒙皇冠","👑"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_paimon_crown/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_paimon_crown/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_paimon_emergency_food_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_paimon_emergency_food_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((490, 490)) 20 | #头像坐标 21 | return frame.copy().paste(img, (72, 84), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_paimon_emergency_food_frame", 28 | mihoyo_paimon_emergency_food_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["应急食品相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_paimon_emergency_food_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_paimon_emergency_food_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_paimon_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_paimon_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (40, 38), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_paimon_frame", 28 | mihoyo_paimon_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["派蒙相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_paimon_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_paimon_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_shikanoin_heizou_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_shikanoin_heizou_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (36, 42), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_shikanoin_heizou_frame", 28 | mihoyo_shikanoin_heizou_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["鹿野院平藏相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_shikanoin_heizou_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_shikanoin_heizou_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_tartaglia_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_tartaglia_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (36, 40), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_tartaglia_frame", 28 | mihoyo_tartaglia_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["达达利亚相框","阿贾克斯相框","公子相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_tartaglia_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_tartaglia_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_tepetlisauri_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_tepetlisauri_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (36, 45), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_tepetlisauri_frame", 28 | mihoyo_tepetlisauri_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["嵴锋龙相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_tepetlisauri_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_tepetlisauri_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_thunderbolt_slime_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_thunderbolt_slime_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (40, 38), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_thunderbolt_slime_frame", 28 | mihoyo_thunderbolt_slime_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["雷史莱姆相框","雷电史莱姆相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_thunderbolt_slime_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_thunderbolt_slime_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_traveler_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_traveler_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (36, 40), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_traveler_frame", 28 | mihoyo_traveler_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["旅行者相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_traveler_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_traveler_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_wind_slime_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_wind_slime_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (38, 38), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_wind_slime_frame", 28 | mihoyo_wind_slime_frame , 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["风史莱姆相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_wind_slime_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_wind_slime_frame/images/0.png -------------------------------------------------------------------------------- /emoji/mihoyo_yanfei_frame/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def mihoyo_yanfei_frame (images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | def make(imgs: list[BuildImage]) -> BuildImage: 18 | #头像尺寸 19 | img = imgs[0].convert("RGBA").circle().resize((245, 245)) 20 | #头像坐标 21 | return frame.copy().paste(img, (36, 38), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mihoyo_yanfei_frame", 28 | mihoyo_yanfei_frame, 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["烟绯相框"], 34 | tags=MemeTags.genshin, 35 | date_created=datetime(2025, 6, 1), 36 | date_modified=datetime(2025, 6, 1), 37 | ) 38 | -------------------------------------------------------------------------------- /emoji/mihoyo_yanfei_frame/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mihoyo_yanfei_frame/images/0.png -------------------------------------------------------------------------------- /emoji/miss_in_my_sleep/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def miss_in_my_sleep(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "她" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"" 26 | try: 27 | frame.draw_text( 28 | (235, 615, 478, 659), 29 | text, 30 | max_fontsize=100, 31 | min_fontsize=20, 32 | valign="bottom", 33 | ) 34 | except ValueError: 35 | raise TextOverLength(name) 36 | 37 | def make(imgs: list[BuildImage]) -> BuildImage: 38 | #头像尺寸 39 | img = imgs[0].convert("RGBA").circle().resize((250, 250)) 40 | #头像坐标 41 | return frame.copy().paste(img, (125, 45), alpha=True) 42 | 43 | return make_jpg_or_gif(images, make) 44 | 45 | 46 | add_meme( 47 | "miss_in_my_sleep", 48 | miss_in_my_sleep, 49 | min_images=1, 50 | max_images=1, 51 | min_texts=0, 52 | max_texts=1, 53 | keywords=["睡梦中想念"], 54 | date_created=datetime(2024, 7, 26), 55 | date_modified=datetime(2024, 7, 26), 56 | ) 57 | -------------------------------------------------------------------------------- /emoji/miss_in_my_sleep/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/miss_in_my_sleep/images/0.png -------------------------------------------------------------------------------- /emoji/mygo_sakiko_togawa/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def mygo_sakiko_togawa(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | def make(imgs: list[BuildImage]) -> BuildImage: 17 | #头像尺寸 18 | img = imgs[0].convert("RGBA").resize((150, 150)) 19 | img = img.rotate(-5, expand=True) 20 | #头像坐标 21 | return frame.copy().paste(img, (105, 70), alpha=True,below=True) 22 | 23 | return make_png_or_gif(images, make) 24 | 25 | 26 | add_meme( 27 | "mygo_sakiko_togawa", 28 | mygo_sakiko_togawa, 29 | min_images=1, 30 | max_images=1, 31 | min_texts=0, 32 | max_texts=0, 33 | keywords=["丰川祥子","祥子","豊川祥子"], 34 | date_created=datetime(2025, 5, 30), 35 | date_modified=datetime(2025, 5, 30), 36 | ) 37 | -------------------------------------------------------------------------------- /emoji/mygo_sakiko_togawa/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/mygo_sakiko_togawa/images/0.png -------------------------------------------------------------------------------- /emoji/naruro_s_ninja/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def naruro_s_ninja(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "她" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"" 26 | try: 27 | frame.draw_text( 28 | (235, 615, 478, 659), 29 | text, 30 | max_fontsize=100, 31 | min_fontsize=20, 32 | valign="bottom", 33 | ) 34 | except ValueError: 35 | raise TextOverLength(name) 36 | 37 | def make(imgs: list[BuildImage]) -> BuildImage: 38 | #头像尺寸 39 | img = imgs[0].convert("RGBA").resize((1000, 1000)) 40 | #头像坐标 41 | return frame.copy().paste(img, (1, 1), alpha=True, below=True ) 42 | 43 | return make_jpg_or_gif(images, make) 44 | 45 | 46 | add_meme( 47 | "naruro_s_ninja", 48 | naruro_s_ninja, 49 | min_images=1, 50 | max_images=1, 51 | min_texts=0, 52 | max_texts=1, 53 | keywords=["S忍","s忍"], 54 | date_created=datetime(2024, 7, 26), 55 | date_modified=datetime(2025, 5, 25), 56 | ) 57 | -------------------------------------------------------------------------------- /emoji/naruro_s_ninja/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/naruro_s_ninja/images/0.png -------------------------------------------------------------------------------- /emoji/orange/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_png_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def orange(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | def make(imgs: list[BuildImage]) -> BuildImage: 17 | #头像尺寸 18 | img = imgs[0].convert("RGBA").circle().resize((475, 475)) 19 | #头像坐标 20 | return frame.copy().paste(img, (185, 445), alpha=True,below=True) 21 | 22 | return make_png_or_gif(images, make) 23 | 24 | 25 | add_meme( 26 | "orange", 27 | orange, 28 | min_images=1, 29 | max_images=1, 30 | min_texts=0, 31 | max_texts=1, 32 | keywords=["🍊","橘","橘子"], 33 | date_created=datetime(2025, 5, 29), 34 | date_modified=datetime(2025, 5, 29), 35 | ) 36 | -------------------------------------------------------------------------------- /emoji/orange/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/orange/images/0.png -------------------------------------------------------------------------------- /emoji/shikanoko_noko/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def shikanoko_noko(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | def make(imgs: list[BuildImage]) -> BuildImage: 17 | #头像尺寸 18 | img = imgs[0].convert("RGBA").circle().resize((290, 290)) 19 | #头像坐标 20 | return frame.copy().paste(img, (360, 3), alpha=True,below=True) 21 | 22 | return make_jpg_or_gif(images, make) 23 | 24 | 25 | add_meme( 26 | "shikanoko_noko", 27 | shikanoko_noko, 28 | min_images=1, 29 | max_images=1, 30 | min_texts=0, 31 | max_texts=1, 32 | keywords=["鹿乃子乃子","鹿乃子"], 33 | date_created=datetime(2025, 5, 25), 34 | date_modified=datetime(2025, 5, 25), 35 | ) 36 | -------------------------------------------------------------------------------- /emoji/shikanoko_noko/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/shikanoko_noko/images/0.png -------------------------------------------------------------------------------- /emoji/shuai/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from PIL.Image import Image as IMG 5 | from pil_utils import BuildImage 6 | 7 | from meme_generator import add_meme 8 | from meme_generator.utils import save_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def shuai(images: list[BuildImage], texts, args): 14 | img = images[0].convert("RGBA").square().resize((110, 110)).circle() 15 | frames: list[IMG] = [] 16 | locs = [ 17 | (83, 69, 43, 135), 18 | (53, 45, 49, 103), 19 | (53, 44, 138, 100), 20 | (61, 62, 149, 125), 21 | 22 | 23 | ] 24 | for i in range(4): 25 | frame = BuildImage.open(img_dir / f"{i}.png") 26 | w, h, x, y = locs[i] 27 | frame.paste(img.resize((w, h)), (x, y), below=True) 28 | frames.append(frame.image) 29 | return save_gif(frames, 0.05) 30 | 31 | 32 | add_meme( 33 | "shuai", 34 | shuai, 35 | min_images=1, 36 | max_images=1, 37 | keywords=["甩"], 38 | date_created=datetime(2025, 5, 27), 39 | date_modified=datetime(2025, 5, 27), 40 | ) -------------------------------------------------------------------------------- /emoji/shuai/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/shuai/images/0.png -------------------------------------------------------------------------------- /emoji/shuai/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/shuai/images/1.png -------------------------------------------------------------------------------- /emoji/shuai/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/shuai/images/2.png -------------------------------------------------------------------------------- /emoji/shuai/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/shuai/images/3.png -------------------------------------------------------------------------------- /emoji/spend_christmas/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def spend_christmas(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "他" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"{name}❤️,我们一起过圣诞" 26 | #{name}挚爱❤️👩‍❤️‍💋‍👨{name}愛のカップ。 27 | try: 28 | frame.draw_text( 29 | (173, 193, 728, 374), 30 | text, 31 | max_fontsize=100, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((255, 255)) 40 | return frame.copy().paste(img, (120, 535), alpha=True, below=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "spend_christmas", 47 | spend_christmas, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["一起圣诞"], 53 | date_created=datetime(2024, 12, 21), 54 | #time 2024年12月21日 21:31:25 55 | #By Anyliew 56 | date_modified=datetime(2024, 12, 21), 57 | ) 58 | -------------------------------------------------------------------------------- /emoji/spend_christmas/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/spend_christmas/images/0.png -------------------------------------------------------------------------------- /emoji/swimsuit_group_photo/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from meme_generator import add_meme 5 | from pil_utils import BuildImage 6 | 7 | img_dir = Path(__file__).parent / "images" 8 | 9 | 10 | def swimsuit_group_photo(images: list[BuildImage], texts, args): 11 | frame = BuildImage.open(img_dir / "0.png") 12 | frame.paste( 13 | # 客 右边1830, 436 14 | images[1].convert("RGBA").circle().resize((350, 350)), (1800, 280), alpha=True 15 | ).paste( 16 | #主 左边 17 | images[0].convert("RGBA").circle().resize((350, 350)), (758, 280), alpha=True 18 | ) 19 | return frame.save_jpg() 20 | 21 | 22 | add_meme( 23 | "swimsuit_group_photo", 24 | swimsuit_group_photo, 25 | min_images=2, 26 | max_images=2, 27 | keywords=["泳衣合影"], 28 | date_created=datetime(2025, 5, 25), 29 | date_modified=datetime(2025, 5, 25), 30 | ) 31 | -------------------------------------------------------------------------------- /emoji/swimsuit_group_photo/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/swimsuit_group_photo/images/0.png -------------------------------------------------------------------------------- /emoji/together_two/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from meme_generator import add_meme 5 | from pil_utils import BuildImage 6 | 7 | img_dir = Path(__file__).parent / "images" 8 | 9 | 10 | def together_two(images: list[BuildImage], texts, args): 11 | frame = BuildImage.open(img_dir / "0.jpg") 12 | frame.paste( 13 | images[1].convert("RGBA").circle().resize((200, 200)), (280, 90), alpha=True 14 | ).paste( 15 | images[0].convert("RGBA").circle().resize((200, 200)), (680, 20), alpha=True 16 | ) 17 | return frame.save_jpg() 18 | 19 | 20 | add_meme( 21 | "together_two", 22 | together_two, 23 | min_images=2, 24 | max_images=2, 25 | keywords=["在一起"], 26 | date_created=datetime(2025, 5, 25), 27 | date_modified=datetime(2025, 5, 25), 28 | ) 29 | -------------------------------------------------------------------------------- /emoji/together_two/images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/together_two/images/0.jpg -------------------------------------------------------------------------------- /emoji/torture_yourself/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from meme_generator import add_meme 5 | from pil_utils import BuildImage 6 | 7 | img_dir = Path(__file__).parent / "images" 8 | 9 | 10 | def torture_yourself(images: list[BuildImage], texts, args): 11 | frame = BuildImage.open(img_dir / "0.png") 12 | # 13 | frame.paste( 14 | #被打人747, 822 15 | images[1].convert("RGBA").circle().resize((200, 200)), (725, 780), alpha=True 16 | ).paste( 17 | #主人70, 283 18 | images[0].convert("RGBA").resize((400, 400)), (70, 283), alpha=True, below=True 19 | ) 20 | return frame.save_jpg() 21 | 22 | 23 | add_meme( 24 | "torture_yourself", 25 | torture_yourself, 26 | min_images=2, 27 | max_images=2, 28 | keywords=["折磨自己"], 29 | date_created=datetime(2025, 5, 25), 30 | date_modified=datetime(2025, 5, 25), 31 | ) 32 | -------------------------------------------------------------------------------- /emoji/torture_yourself/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/torture_yourself/images/0.png -------------------------------------------------------------------------------- /emoji/xinxi_news/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def xinxi_news(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 14 | frame = BuildImage.open(img_dir / "0.png") 15 | 16 | ta = "她" 17 | name = ta 18 | if texts: 19 | name = texts[0] 20 | elif args.user_infos: 21 | info = args.user_infos[0] 22 | ta = "他" if info.gender == "male" else "她" 23 | name = info.name or ta 24 | 25 | text = f"{name}" 26 | #{name}喜报人名字❤️👩‍❤️‍💋‍👨 27 | try: 28 | frame.draw_text( 29 | (235, 615, 478, 659), 30 | text, 31 | max_fontsize=100, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | #头像尺寸 40 | img = imgs[0].convert("RGBA").circle().resize((300, 300)) 41 | #头像坐标 42 | return frame.copy().paste(img, (210, 270), alpha=True, below=True ) 43 | 44 | return make_jpg_or_gif(images, make) 45 | 46 | 47 | add_meme( 48 | "xinxi_news", 49 | xinxi_news, 50 | min_images=1, 51 | max_images=1, 52 | min_texts=0, 53 | max_texts=1, 54 | keywords=["新喜报"], 55 | date_created=datetime(2024, 7, 26), 56 | date_modified=datetime(2024, 7, 26), 57 | ) 58 | -------------------------------------------------------------------------------- /emoji/xinxi_news/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/xinxi_news/images/0.png -------------------------------------------------------------------------------- /emoji/yuzu_soft_ayachi_nene/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/yuzu_soft_ayachi_nene/images/0.png -------------------------------------------------------------------------------- /emoji/yuzu_soft_holdsign/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def yuzu_soft_holdsign(images, texts: list[str], args): 15 | text = texts[0] 16 | frame = BuildImage.open(img_dir / "0.jpg") 17 | try: 18 | frame.draw_text( 19 | (1150, 896, 3024, 1240), 20 | text, 21 | fill=(0, 0, 0), 22 | allow_wrap=True, 23 | max_fontsize=300, 24 | min_fontsize=30, 25 | lines_align="left", 26 | font_families=["PangMenZhengDao-Cu"], 27 | ) 28 | except ValueError: 29 | raise TextOverLength(text) 30 | return frame.save_jpg() 31 | 32 | 33 | add_meme( 34 | "yuzu_soft_holdsign", 35 | yuzu_soft_holdsign, 36 | min_texts=1, 37 | max_texts=1, 38 | default_texts=["不要再涩涩了"], 39 | keywords=["柚子厨举牌"], 40 | tags=MemeTags.yuzu_soft, 41 | date_created=datetime(2024, 12, 21), 42 | #By Anyliew 2024年12月21日 22:10:12 43 | date_modified=datetime(2024, 12, 21), 44 | ) -------------------------------------------------------------------------------- /emoji/yuzu_soft_holdsign/images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/yuzu_soft_holdsign/images/0.jpg -------------------------------------------------------------------------------- /emoji/yuzu_soft_mako_hitachi_holdsign/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | img_dir = Path(__file__).parent / "images" 11 | 12 | 13 | def yuzu_soft_mako_hitachi_holdsign(images, texts: list[str], args): 14 | text = texts[0] 15 | frame = BuildImage.open(img_dir / "0.png") 16 | try: 17 | frame.draw_text( 18 | (50, 309, 474, 598), 19 | text, 20 | fill=(0, 0, 0), 21 | allow_wrap=True, 22 | max_fontsize=120, 23 | min_fontsize=25, 24 | lines_align="center", 25 | font_families=["FZSJ-QINGCRJ"], 26 | ) 27 | except ValueError: 28 | raise TextOverLength(text) 29 | return frame.save_jpg() 30 | 31 | 32 | add_meme( 33 | "yuzu_soft_mako_hitachi_holdsign", 34 | yuzu_soft_mako_hitachi_holdsign, 35 | min_texts=1, 36 | max_texts=1, 37 | default_texts=["Ciallo~"], 38 | keywords=["常陸茉子举牌","茉子举牌","常陆茉子举牌"], 39 | tags=MemeTags.yuzu_soft, 40 | date_created=datetime(2025, 5, 17), 41 | date_modified=datetime(2025, 5, 17), 42 | ) -------------------------------------------------------------------------------- /emoji/yuzu_soft_mako_hitachi_holdsign/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/yuzu_soft_mako_hitachi_holdsign/images/0.png -------------------------------------------------------------------------------- /emoji/yuzu_soft_murasame_blackboard/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def yuzu_soft_murasame_blackboard(images, texts: list[str], args): 15 | text = texts[0] 16 | frame = BuildImage.open(img_dir / "0.jpg") 17 | try: 18 | frame.draw_text( 19 | (351, 128, 1119, 326), 20 | text, 21 | fill=(255, 255, 255), 22 | allow_wrap=True, 23 | max_fontsize=150, 24 | min_fontsize=20, 25 | lines_align="left", 26 | font_families=["FZSJ-QINGCRJ"], 27 | ) 28 | except ValueError: 29 | raise TextOverLength(text) 30 | return frame.save_jpg() 31 | 32 | 33 | add_meme( 34 | "yuzu_soft_murasame_blackboard", 35 | yuzu_soft_murasame_blackboard, 36 | min_texts=1, 37 | max_texts=1, 38 | default_texts=["不要再涩涩了"], 39 | keywords=["丛雨黑板"], 40 | tags=MemeTags.yuzu_soft, 41 | date_created=datetime(2024, 12, 21), 42 | date_modified=datetime(2024, 12, 21), 43 | ) -------------------------------------------------------------------------------- /emoji/yuzu_soft_murasame_blackboard/images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/yuzu_soft_murasame_blackboard/images/0.jpg -------------------------------------------------------------------------------- /emoji/yuzu_soft_murasame_clothes/images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/yuzu_soft_murasame_clothes/images/0.jpg -------------------------------------------------------------------------------- /emoji/yuzu_soft_murasame_dislike/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | from meme_generator.utils import make_jpg_or_gif 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | default_text = "丛雨讨厌这个" 14 | 15 | 16 | def yuzu_soft_murasame_dislike(images: list[BuildImage], texts: list[str], args): 17 | text = texts[0] if texts else default_text 18 | frame = BuildImage.open(img_dir / "0.png") 19 | try: 20 | frame.draw_text( 21 | (5, frame.height - 60, frame.width - 5, frame.height - 10), 22 | text, 23 | max_fontsize=40, 24 | fill="white", 25 | stroke_fill="black", 26 | stroke_ratio=0.06, 27 | ) 28 | except ValueError: 29 | raise TextOverLength(text) 30 | 31 | def make(imgs: list[BuildImage]) -> BuildImage: 32 | img = imgs[0].convert("RGBA").resize((305, 235), keep_ratio=True) 33 | return frame.copy().paste(img, (106, 72), below=True) 34 | 35 | return make_jpg_or_gif(images, make) 36 | 37 | 38 | add_meme( 39 | "yuzu_soft_murasame_dislike", 40 | yuzu_soft_murasame_dislike, 41 | min_images=1, 42 | max_images=1, 43 | min_texts=0, 44 | max_texts=1, 45 | default_texts=[default_text], 46 | keywords=["丛雨讨厌"], 47 | tags=MemeTags.yuzu_soft, 48 | date_created=datetime(2025, 5, 25), 49 | date_modified=datetime(2025, 5, 25), 50 | ) 51 | -------------------------------------------------------------------------------- /emoji/yuzu_soft_murasame_dislike/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/yuzu_soft_murasame_dislike/images/0.png -------------------------------------------------------------------------------- /emoji/yuzu_soft_murasame_finger/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/yuzu_soft_murasame_finger/images/0.png -------------------------------------------------------------------------------- /emoji/yuzu_soft_murasame_husband/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def yuzu_soft_murasame_husband(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | ta = "她" 18 | name = ta 19 | if texts: 20 | name = texts[0] 21 | elif args.user_infos: 22 | info = args.user_infos[0] 23 | ta = "他" if info.gender == "male" else "她" 24 | name = info.name or ta 25 | 26 | text = f"" 27 | try: 28 | frame.draw_text( 29 | (50, 20, 700, 130), 30 | text, 31 | max_fontsize=70, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((200, 200)) 40 | return frame.copy().paste(img, (160, 40), alpha=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "yuzu_soft_murasame_husband", 47 | yuzu_soft_murasame_husband, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["丛雨老公"], 53 | tags=MemeTags.yuzu_soft, 54 | date_created=datetime(2024, 7, 26), 55 | date_modified=datetime(2025, 5, 25), 56 | ) 57 | -------------------------------------------------------------------------------- /emoji/yuzu_soft_murasame_husband/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/yuzu_soft_murasame_husband/images/0.png -------------------------------------------------------------------------------- /emoji/yuzu_soft_murasame_like/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | from meme_generator.utils import make_jpg_or_gif 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | default_text = "丛雨喜欢这个" 14 | 15 | 16 | def yuzu_soft_murasame_like(images: list[BuildImage], texts: list[str], args): 17 | text = texts[0] if texts else default_text 18 | frame = BuildImage.open(img_dir / "0.png") 19 | try: 20 | frame.draw_text( 21 | (5, frame.height - 60, frame.width - 5, frame.height - 10), 22 | text, 23 | max_fontsize=40, 24 | fill="white", 25 | stroke_fill="black", 26 | stroke_ratio=0.06, 27 | ) 28 | except ValueError: 29 | raise TextOverLength(text) 30 | 31 | def make(imgs: list[BuildImage]) -> BuildImage: 32 | img = imgs[0].convert("RGBA").resize((305, 235), keep_ratio=True) 33 | return frame.copy().paste(img, (106, 72), below=True) 34 | 35 | return make_jpg_or_gif(images, make) 36 | 37 | 38 | add_meme( 39 | "yuzu_soft_murasame_like", 40 | yuzu_soft_murasame_like, 41 | min_images=1, 42 | max_images=1, 43 | min_texts=0, 44 | max_texts=1, 45 | default_texts=[default_text], 46 | keywords=["丛雨喜欢"], 47 | tags=MemeTags.yuzu_soft, 48 | date_created=datetime(2025, 5, 25), 49 | date_modified=datetime(2025, 5, 25), 50 | ) 51 | -------------------------------------------------------------------------------- /emoji/yuzu_soft_murasame_like/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/yuzu_soft_murasame_like/images/0.png -------------------------------------------------------------------------------- /emoji/yuzu_soft_murasame_say/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.tags import MemeTags 9 | 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def yuzu_soft_murasame_say(images, texts: list[str], args): 15 | text = texts[0] 16 | frame = BuildImage.open(img_dir / "0.jpg") 17 | try: 18 | frame.draw_text( 19 | (922, 0, 1275, 659), 20 | text, 21 | fill=(0, 0, 0), 22 | allow_wrap=True, 23 | max_fontsize=150, 24 | min_fontsize=20, 25 | lines_align="left", 26 | font_families=["FZKaTong-M19S"], 27 | ) 28 | except ValueError: 29 | raise TextOverLength(text) 30 | return frame.save_jpg() 31 | 32 | 33 | add_meme( 34 | "yuzu_soft_murasame_say", 35 | yuzu_soft_murasame_say, 36 | min_texts=1, 37 | max_texts=1, 38 | default_texts=["非酋,不要再涩涩了"], 39 | keywords=["丛雨说"], 40 | tags=MemeTags.yuzu_soft, 41 | date_created=datetime(2024, 12, 21), 42 | date_modified=datetime(2024, 12, 21), 43 | ) -------------------------------------------------------------------------------- /emoji/yuzu_soft_murasame_say/images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/yuzu_soft_murasame_say/images/0.jpg -------------------------------------------------------------------------------- /emoji/yuzu_soft_shocked/__init__.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from pathlib import Path 3 | 4 | from pil_utils import BuildImage 5 | 6 | from meme_generator import MemeArgsModel, add_meme 7 | from meme_generator.exception import TextOverLength 8 | from meme_generator.utils import make_jpg_or_gif 9 | from meme_generator.tags import MemeTags 10 | 11 | img_dir = Path(__file__).parent / "images" 12 | 13 | 14 | def yuzu_soft_shocked(images: list[BuildImage], texts: list[str], args: MemeArgsModel): 15 | frame = BuildImage.open(img_dir / "0.png") 16 | 17 | ta = "她" 18 | name = ta 19 | if texts: 20 | name = texts[0] 21 | elif args.user_infos: 22 | info = args.user_infos[0] 23 | ta = "他" if info.gender == "male" else "她" 24 | name = info.name or ta 25 | 26 | text = f"{name},你是柚...柚子厨?!" 27 | try: 28 | frame.draw_text( 29 | (34, 100, 257, 133), 30 | text, 31 | max_fontsize=70, 32 | min_fontsize=20, 33 | valign="bottom", 34 | ) 35 | except ValueError: 36 | raise TextOverLength(name) 37 | 38 | def make(imgs: list[BuildImage]) -> BuildImage: 39 | img = imgs[0].convert("RGBA").circle().resize((33, 33)) 40 | return frame.copy().paste(img, (0, 100), alpha=True) 41 | 42 | return make_jpg_or_gif(images, make) 43 | 44 | 45 | add_meme( 46 | "yuzu_soft_shocked", 47 | yuzu_soft_shocked, 48 | min_images=1, 49 | max_images=1, 50 | min_texts=0, 51 | max_texts=1, 52 | keywords=["震惊柚子厨"], 53 | tags=MemeTags.yuzu_soft, 54 | date_created=datetime(2024, 7, 26), 55 | date_modified=datetime(2025, 5, 25), 56 | ) 57 | -------------------------------------------------------------------------------- /emoji/yuzu_soft_shocked/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/emoji/yuzu_soft_shocked/images/0.png -------------------------------------------------------------------------------- /picture/Phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/picture/Phone.png -------------------------------------------------------------------------------- /picture/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/picture/logo.png -------------------------------------------------------------------------------- /picture/meme_emoji.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/picture/meme_emoji.jpg -------------------------------------------------------------------------------- /picture/partner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anyliew/meme_emoji/860c63de32a74987066b670f7f2ca9ecfa0bac58/picture/partner.jpg --------------------------------------------------------------------------------