尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AI图像生成与塔罗牌融合:Midjourney技术实践指南

AI图像生成与塔罗牌融合:Midjourney技术实践指南 Iris Tarot | mj随缘传讯AI占卜与图像生成的创新融合实践在数字创意与技术融合的浪潮中AI图像生成与传统文化元素的结合正成为新的探索方向。本文将以Iris Tarot | mj随缘传讯为主题深入解析如何将塔罗牌占卜与Midjourney图像生成技术相结合打造独特的数字艺术体验。无论你是对AI绘画感兴趣的开发者还是想要探索传统文化数字化创新的创作者都能从本文获得完整的实践方案。1. 项目背景与核心概念1.1 什么是Iris Tarot项目Iris Tarot是一个将传统塔罗牌占卜与现代AI图像生成技术相结合的创新项目。该项目利用Midjourney简称mj的强大图像生成能力为每一张塔罗牌创建独特的视觉呈现同时结合随机算法实现随缘传讯的占卜体验。传统塔罗牌占卜依赖于固定的牌面图案和释义而Iris Tarot项目通过AI技术为每次占卜生成独一无二的牌面图像使每次占卜体验都充满新鲜感和独特性。这种创新不仅保留了塔罗牌的神秘特质还融入了数字艺术的现代元素。1.2 技术融合的价值与意义将AI图像生成与塔罗牌结合的技术方案具有多重价值。首先它为传统文化注入了新的生命力使古老的占卜艺术以数字化形式呈现。其次通过AI的随机生成特性每次占卜结果都对应独特的视觉呈现增强了体验的个性化和神秘感。从技术角度看这种融合展示了AI在创意领域的应用潜力。Midjourney作为领先的文本到图像生成模型能够根据详细的提示词生成高质量的视觉内容这为创建多样化、个性化的塔罗牌面提供了技术基础。1.3 目标用户与应用场景Iris Tarot项目主要面向两类用户群体一是对塔罗牌和神秘学感兴趣的普通用户他们可以通过这个项目获得新颖的占卜体验二是数字艺术创作者和开发者他们可以借鉴这种技术融合模式开发类似的创意应用。应用场景包括个人娱乐、艺术创作、心理疗愈辅助工具等。在社交媒体时代这种能够生成独特视觉内容的占卜工具还具有很强的分享价值适合集成到社交平台或独立应用中。2. 技术架构与环境准备2.1 核心技术支持Iris Tarot项目的技术实现主要依赖以下几个核心组件Midjourney图像生成API作为项目的视觉引擎负责根据塔罗牌的关键词生成对应的牌面图像。Midjourney的优势在于能够理解复杂的描述性文本并生成具有艺术感的图像。随机算法系统用于模拟塔罗牌的随机抽取过程确保每次占卜的随机性和公平性。这个系统需要能够处理78张标准塔罗牌包括22张大阿卡纳和56张小阿卡纳的随机选择逻辑。塔罗牌知识库包含每张塔罗牌的传统含义、正逆位解释、关联元素等基础信息。这个知识库为AI生成提供内容基础确保生成的图像和解释符合塔罗牌的传统体系。2.2 开发环境配置要实现类似Iris Tarot的项目需要准备以下开发环境Python开发环境# 基础依赖包 python_version 3.8 required_packages [ requests2.28.0, # API调用 pillow9.0.0, # 图像处理 numpy1.21.0, # 数值计算 python-dotenv0.19.0 # 环境变量管理 ]Midjourney API配置# config.py - API配置类 class MidjourneyConfig: def __init__(self): self.api_key os.getenv(MIDJOURNEY_API_KEY) self.base_url https://api.midjourney.com/v1 self.timeout 30 self.max_retries 3 def get_headers(self): return { Authorization: fBearer {self.api_key}, Content-Type: application/json }项目目录结构iris_tarot_project/ ├── src/ │ ├── __init__.py │ ├── main.py # 主程序入口 │ ├── tarot/ │ │ ├── __init__.py │ │ ├── deck.py # 牌组管理 │ │ └── interpreter.py # 牌意解释 │ ├── image_generator/ │ │ ├── __init__.py │ │ └── midjourney.py # MJ接口封装 │ └── utils/ │ ├── __init__.py │ └── randomizer.py # 随机算法 ├── data/ │ ├── tarot_cards.json # 牌库数据 │ └── prompts/ # 提示词模板 ├── tests/ # 测试文件 ├── requirements.txt # 依赖列表 └── README.md # 项目说明2.3 第三方服务接入项目需要接入Midjourney的API服务具体配置流程如下申请API密钥访问Midjourney官方开发者平台创建账户并申请API访问权限。设置请求频率限制根据服务条款配置合理的请求间隔避免频繁调用导致的限制。配置回调处理由于图像生成是异步过程需要设置webhook接收生成完成的通知。# api_integration.py - API集成示例 import requests import time import json class MidjourneyClient: def __init__(self, config): self.config config self.session requests.Session() self.session.headers.update(config.get_headers()) def generate_tarot_image(self, card_name, style_prompt): 生成塔罗牌图像 prompt self._build_prompt(card_name, style_prompt) payload { prompt: prompt, aspect_ratio: 1:1, style_preset: fantasy_art, steps: 50 } response self.session.post( f{self.config.base_url}/generate, jsonpayload, timeoutself.config.timeout ) if response.status_code 202: return response.json()[task_id] else: raise Exception(fAPI请求失败: {response.status_code}) def _build_prompt(self, card_name, style_prompt): 构建生成提示词 base_prompt fTarot card for {card_name}, mystical, symbolic, intricate details return f{base_prompt}, {style_prompt}, fantasy art style, vibrant colors --ar 1:1 --v 53. 核心功能实现详解3.1 塔罗牌组管理系统塔罗牌组管理是项目的基础模块需要完整实现78张牌的数据结构和抽牌逻辑。牌组数据结构的实现# deck.py - 牌组管理类 import json from enum import Enum from typing import List, Dict, Optional class CardType(Enum): MAJOR_ARCANA major MINOR_ARCANA minor class Suit(Enum): WANDS wands CUPS cups SWORDS swords PENTACLES pentacles class TarotCard: def __init__(self, card_id: int, name: str, card_type: CardType, suit: Optional[Suit] None, number: Optional[int] None): self.card_id card_id self.name name self.card_type card_type self.suit suit self.number number self.upright_meaning self.reversed_meaning self.keywords [] self.element def to_dict(self): return { id: self.card_id, name: self.name, type: self.card_type.value, suit: self.suit.value if self.suit else None, number: self.number, keywords: self.keywords } class TarotDeck: def __init__(self): self.cards: List[TarotCard] [] self._initialize_deck() def _initialize_deck(self): 初始化78张塔罗牌 # 大阿卡纳牌0-21 major_arcana_names [ The Fool, The Magician, The High Priestess, The Empress, The Emperor, The Hierophant, The Lovers, The Chariot, Strength, The Hermit, Wheel of Fortune, Justice, The Hanged Man, Death, Temperance, The Devil, The Tower, The Star, The Moon, The Sun, Judgement, The World ] for i, name in enumerate(major_arcana_names): card TarotCard(i, name, CardType.MAJOR_ARCANA) self.cards.append(card) # 小阿卡纳牌 suits [Suit.WANDS, Suit.CUPS, Suit.SWORDS, Suit.PENTACLES] minor_start_id 22 for suit in suits: for number in range(1, 15): # 1-10 4张宫廷牌 card_id minor_start_id (list(suits).index(suit) * 14) (number - 1) name f{number} of {suit.value} if number 10 else \ f{[Page, Knight, Queen, King][number-11]} of {suit.value} card TarotCard(card_id, name, CardType.MINOR_ARCANA, suit, number) self.cards.append(card) def draw_random_cards(self, count: int 1) - List[TarotCard]: 随机抽取指定数量的牌 import random if count len(self.cards): raise ValueError(抽牌数量不能超过牌组总数) drawn_cards random.sample(self.cards, count) return drawn_cards def get_card_by_id(self, card_id: int) - Optional[TarotCard]: 根据ID获取牌 for card in self.cards: if card.card_id card_id: return card return None3.2 Midjourney提示词工程提示词的质量直接决定生成图像的效果。针对塔罗牌图像生成需要设计专业的提示词模板。塔罗牌专用提示词构建器# prompt_engineer.py - 提示词工程 class TarotPromptBuilder: def __init__(self): self.style_presets { traditional: traditional Rider-Waite style, symbolic imagery, clear symbolism, fantasy: high fantasy art, magical atmosphere, detailed illustration, modern: contemporary art style, minimalist design, modern symbolism, mystical: mystical atmosphere, ethereal lighting, spiritual symbolism } self.color_themes { wands: fiery colors, reds, oranges, golds, passion and creativity, cups: watery colors, blues, silvers, emotions and relationships, swords: airy colors, yellows, grays, intellect and challenges, pentacles: earthy colors, greens, browns, material world and prosperity } def build_prompt(self, card: TarotCard, style: str fantasy) - str: 为特定塔罗牌构建生成提示词 base_description self._get_card_base_description(card) style_desc self.style_presets.get(style, self.style_presets[fantasy]) color_desc self._get_color_theme(card) prompt_parts [ fTarot card artwork for {card.name}, base_description, style_desc, color_desc, intricate details, symbolic elements, mystical atmosphere, high quality illustration, professional artwork, tarot card composition, centered subject, --ar 1:1 --v 5 --style raw ] return , .join([part for part in prompt_parts if part]) def _get_card_base_description(self, card: TarotCard) - str: 获取牌的基础描述 # 这里可以扩展为每张牌的具体描述 descriptions { The Fool: a youthful figure beginning a journey, cliff edge, small dog, bundle on a staff, The Magician: a figure with one hand pointing upward, tools on a table, infinity symbol above head, The High Priestess: a seated figure between two pillars, crescent moon, scroll in lap, mysterious veil # ... 其他牌的描述 } return descriptions.get(card.name, symbolic tarot card imagery) def _get_color_theme(self, card: TarotCard) - str: 根据牌的花色获取颜色主题 if card.suit: return self.color_themes.get(card.suit.value, mystical colors, vibrant and symbolic) return mystical colors, deep blues and purples, gold accents3.3 图像生成与处理流程完整的图像生成流程包括提示词生成、API调用、结果处理和本地存储。完整的图像生成流水线# image_pipeline.py - 图像生成流水线 import os from pathlib import Path from PIL import Image import io class TarotImagePipeline: def __init__(self, midjourney_client, prompt_builder): self.client midjourney_client self.prompt_builder prompt_builder self.output_dir Path(generated_images) self.output_dir.mkdir(exist_okTrue) def generate_card_image(self, card: TarotCard, style: str fantasy) - str: 生成单张牌图像并返回文件路径 try: # 构建提示词 prompt self.prompt_builder.build_prompt(card, style) print(f生成提示词: {prompt}) # 调用Midjourney API task_id self.client.generate_tarot_image(card.name, prompt) print(f任务已提交: {task_id}) # 等待生成完成实际项目中应该使用webhook image_url self._wait_for_completion(task_id) # 下载并保存图像 image_path self._download_image(image_url, card) return image_path except Exception as e: print(f图像生成失败: {e}) return None def _wait_for_completion(self, task_id: str, max_wait: int 300) - str: 等待任务完成简化版实际应使用webhook import time wait_interval 10 for i in range(max_wait // wait_interval): time.sleep(wait_interval) # 这里应该查询任务状态 # status self.client.get_task_status(task_id) # if status completed: # return self.client.get_image_url(task_id) raise TimeoutError(图像生成超时) def _download_image(self, image_url: str, card: TarotCard) - str: 下载图像并保存到本地 response requests.get(image_url) if response.status_code 200: # 创建文件名 filename f{card.card_id:02d}_{card.name.replace( , _).lower()}.png filepath self.output_dir / filename # 保存图像 with open(filepath, wb) as f: f.write(response.content) # 可选使用PIL进行后期处理 self._post_process_image(filepath) return str(filepath) else: raise Exception(f图像下载失败: {response.status_code}) def _post_process_image(self, image_path: str): 图像后期处理 try: with Image.open(image_path) as img: # 调整图像尺寸为标准塔罗牌比例 tarot_size (825, 1500) # 标准塔罗牌比例 if img.size ! tarot_size: img img.resize(tarot_size, Image.Resampling.LANCZOS) img.save(image_path, quality95) except Exception as e: print(f图像处理失败: {e})4. 随缘传讯算法实现4.1 随机抽牌算法随缘传讯的核心是公平的随机抽牌算法需要确保每张牌被抽中的概率均等。高级随机算法实现# randomizer.py - 随机算法实现 import random import hashlib from datetime import datetime from typing import List, Tuple class TarotRandomizer: def __init__(self, deck: TarotDeck): self.deck deck self.random_seed None def set_seed_from_user_input(self, user_input: str): 根据用户输入设置随机种子确保可重现性 seed_hash hashlib.sha256(user_input.encode()).hexdigest() self.random_seed int(seed_hash[:8], 16) random.seed(self.random_seed) def draw_cards_with_spread(self, spread_type: str single) - List[Tuple[TarotCard, bool]]: 根据牌阵类型抽牌返回牌和正逆位 card_count self._get_spread_card_count(spread_type) cards self.deck.draw_random_cards(card_count) results [] for card in cards: # 随机决定正逆位约50%概率 is_reversed random.random() 0.5 results.append((card, is_reversed)) return results def _get_spread_card_count(self, spread_type: str) - int: 获取不同牌阵需要的牌数 spreads { single: 1, # 单张牌占卜 three_card: 3, # 三张牌过去-现在-未来 celtic_cross: 10, # 凯尔特十字 relationship: 5 # 关系牌阵 } return spreads.get(spread_type, 1) def generate_unique_session_id(self) - str: 生成唯一的占卜会话ID timestamp datetime.now().strftime(%Y%m%d%H%M%S) random_suffix random.randint(1000, 9999) return ftarot_{timestamp}_{random_suffix}4.2 牌意解释系统基于抽牌结果生成有意义的解释是项目的核心价值所在。智能牌意解释器# interpreter.py - 牌意解释系统 import json from typing import Dict, List class TarotInterpreter: def __init__(self, knowledge_base_path: str data/tarot_meanings.json): self.knowledge_base self._load_knowledge_base(knowledge_base_path) self.templates { upright: 正位{card_name}代表着{meaning}。关键词包括{keywords}。, reversed: 逆位{card_name}暗示着{meaning}。这可能表示{reversed_implications}。, advice: 这张牌给你的建议是{advice}, warning: 需要注意{warning} } def _load_knowledge_base(self, path: str) - Dict: 加载塔罗牌知识库 try: with open(path, r, encodingutf-8) as f: return json.load(f) except FileNotFoundError: return self._create_default_knowledge_base() def interpret_draw(self, card: TarotCard, is_reversed: bool, question: str ) - Dict[str, str]: 解释单张牌的抽牌结果 card_data self.knowledge_base.get(str(card.card_id), {}) interpretation { card_name: card.name, orientation: 逆位 if is_reversed else 正位, basic_meaning: , detailed_interpretation: , advice: , keywords: [] } # 获取基础含义 if is_reversed: meaning card_data.get(reversed_meaning, 需要反思和内在觉察) keywords card_data.get(reversed_keywords, [内在工作, 阻碍, 延迟]) else: meaning card_data.get(upright_meaning, 积极的发展和成长) keywords card_data.get(upright_keywords, [机会, 成长, 积极变化]) interpretation[basic_meaning] meaning interpretation[keywords] keywords # 生成详细解释 interpretation[detailed_interpretation] self._generate_detailed_reading( card, is_reversed, question ) # 生成建议 interpretation[advice] self._generate_advice(card, is_reversed) return interpretation def _generate_detailed_reading(self, card: TarotCard, is_reversed: bool, question: str) - str: 生成详细的占卜解读 # 基于牌的类型、花色、数字等生成个性化解读 reading_parts [] if card.card_type CardType.MAJOR_ARCANA: reading_parts.append(这是一张大阿卡纳牌代表着人生的重要课题和灵魂层面的影响。) else: reading_parts.append(f这张{card.suit.value}牌涉及到{self._get_suit_domain(card.suit)}领域的日常事务。) if is_reversed: reading_parts.append(逆位的位置提示你需要关注内在的阻碍或未解决的议题。) else: reading_parts.append(正位的位置表明能量正在顺畅流动。) # 如果有具体问题生成相关问题领域的解读 if question: domain self._analyze_question_domain(question) reading_parts.append(f关于{domain}这张牌提示你...) return .join(reading_parts) def _get_suit_domain(self, suit: Suit) - str: 获取花色的领域描述 domains { Suit.WANDS: 创意、激情和行动, Suit.CUPS: 情感、关系和直觉, Suit.SWORDS: 思想、沟通和真理, Suit.PENTACLES: 物质、工作和安全感 } return domains.get(suit, 生活各个方面)5. 完整项目集成与用户体验5.1 主程序架构设计将各个模块整合成完整的应用程序提供流畅的用户体验。主程序入口设计# main.py - 主程序入口 import os from dotenv import load_dotenv from tarot.deck import TarotDeck from tarot.interpreter import TarotInterpreter from image_generator.midjourney import MidjourneyClient, MidjourneyConfig from image_generator.prompt_engineer import TarotPromptBuilder from image_generator.image_pipeline import TarotImagePipeline from utils.randomizer import TarotRandomizer class IrisTarotApp: def __init__(self): load_dotenv() # 加载环境变量 # 初始化各个组件 self.deck TarotDeck() self.interpreter TarotInterpreter() self.config MidjourneyConfig() self.client MidjourneyClient(self.config) self.prompt_builder TarotPromptBuilder() self.image_pipeline TarotImagePipeline(self.client, self.prompt_builder) self.randomizer TarotRandomizer(self.deck) self.current_session None def start_new_session(self, user_question: str ) - str: 开始新的占卜会话 session_id self.randomizer.generate_unique_session_id() self.current_session { session_id: session_id, user_question: user_question, timestamp: datetime.now().isoformat(), draws: [] } # 根据用户问题设置随机种子 if user_question: self.randomizer.set_seed_from_user_input(user_question) return session_id def perform_draw(self, spread_type: str single) - Dict: 执行抽牌操作 if not self.current_session: self.start_new_session() # 抽牌 card_results self.randomizer.draw_cards_with_spread(spread_type) draw_result { spread_type: spread_type, cards: [], timestamp: datetime.now().isoformat() } for card, is_reversed in card_results: # 生成图像 image_path self.image_pipeline.generate_card_image(card) # 解释牌意 interpretation self.interpreter.interpret_draw( card, is_reversed, self.current_session[user_question] ) card_result { card: card.to_dict(), is_reversed: is_reversed, image_path: image_path, interpretation: interpretation } draw_result[cards].append(card_result) # 保存到当前会话 self.current_session[draws].append(draw_result) return draw_result def get_session_summary(self) - Dict: 获取当前会话的总结 if not self.current_session: return {error: 没有活跃的会话} return self.current_session def main(): 主函数示例 app IrisTarotApp() print( Iris Tarot 随缘传讯 ) question input(请输入你的问题或直接回车随机抽牌: ) session_id app.start_new_session(question) print(f会话已创建: {session_id}) # 选择牌阵 print(\n请选择牌阵类型:) print(1. 单张牌) print(2. 三张牌过去-现在-未来) print(3. 凯尔特十字) choice input(请输入选择 (1-3): ) spread_map {1: single, 2: three_card, 3: celtic_cross} spread_type spread_map.get(choice, single) # 执行抽牌 print(\n正在抽牌并生成图像...) result app.perform_draw(spread_type) # 显示结果 print(f\n 占卜结果 ) for i, card_result in enumerate(result[cards]): card card_result[card] interpretation card_result[interpretation] print(f\n第{i1}张牌: {card[name]} ({interpretation[orientation]})) print(f基本含义: {interpretation[basic_meaning]}) print(f关键词: {, .join(interpretation[keywords])}) print(f详细解读: {interpretation[detailed_interpretation]}) print(f建议: {interpretation[advice]}) print(f图像已保存至: {card_result[image_path]}) if __name__ __main__: main()5.2 Web界面集成方案对于想要提供在线服务的开发者可以基于Flask或FastAPI创建Web界面。Flask Web应用示例# app.py - Flask Web应用 from flask import Flask, render_template, request, jsonify, session import uuid from datetime import datetime app Flask(__name__) app.secret_key your-secret-key-here # 初始化IrisTarotApp tarot_app IrisTarotApp() app.route(/) def index(): return render_template(index.html) app.route(/api/new_session, methods[POST]) def new_session(): data request.json question data.get(question, ) session_id tarot_app.start_new_session(question) session[tarot_session] session_id return jsonify({ success: True, session_id: session_id, question: question }) app.route(/api/draw_cards, methods[POST]) def draw_cards(): data request.json spread_type data.get(spread_type, single) if tarot_session not in session: return jsonify({error: 请先创建会话}), 400 try: result tarot_app.perform_draw(spread_type) return jsonify({ success: True, result: result }) except Exception as e: return jsonify({error: str(e)}), 500 app.route(/api/session_history) def session_history(): if tarot_session in session: summary tarot_app.get_session_summary() return jsonify(summary) return jsonify({error: 没有找到会话记录}) if __name__ __main__: app.run(debugTrue)对应的HTML模板示例!-- templates/index.html -- !DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 titleIris Tarot | 随缘传讯/title style body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; } .card { border: 1px solid #ddd; padding: 20px; margin: 10px 0; border-radius: 8px; } .card-image { max-width: 200px; height: auto; } .reversed { transform: rotate(180deg); } /style /head body h1Iris Tarot 随缘传讯/h1 div idquestion-section textarea idquestion-input placeholder输入你的问题可选... rows3 cols50/textarea button onclickstartSession()开始占卜/button /div div idspread-selection styledisplay: none; h3选择牌阵/h3 button onclickdrawCards(single)单张牌/button button onclickdrawCards(three_card)三张牌/button button onclickdrawCards(celtic_cross)凯尔特十字/button /div div idresults/div script let currentSession null; async function startSession() { const question document.getElementById(question-input).value; const response await fetch(/api/new_session, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ question }) }); const data await response.json(); if (data.success) { currentSession data.session_id; document.getElementById(spread-selection).style.display block; } } async function drawCards(spreadType) { const response await fetch(/api/draw_cards, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ spread_type: spreadType }) }); const data await response.json(); if (data.success) { displayResults(data.result); } } function displayResults(result) { const resultsDiv document.getElementById(results); resultsDiv.innerHTML h3占卜结果/h3; result.cards.forEach((cardResult, index) { const cardDiv document.createElement(div); cardDiv.className card; cardDiv.innerHTML h4第${index 1}张牌: ${cardResult.card.name} (${cardResult.interpretation.orientation})/h4 img src${cardResult.image_path} alt${cardResult.card.name} classcard-image ${cardResult.is_reversed ? reversed : } pstrong基本含义:/strong ${cardResult.interpretation.basic_meaning}/p pstrong关键词:/strong ${cardResult.interpretation.keywords.join(, )}/p pstrong解读:/strong ${cardResult.interpretation.detailed_interpretation}/p pstrong建议:/strong ${cardResult.interpretation.advice}/p ; resultsDiv.appendChild(cardDiv); }); } /script /body /html6. 常见问题与优化方案6.1 技术实现中的常见挑战在实现Iris Tarot项目过程中可能会遇到以下技术挑战图像生成质量不稳定问题Midjourney生成的塔罗牌图像风格不一致或符号表达不准确解决方案建立详细的提示词模板库为每张牌定制专属提示词优化使用图像后处理技术统一风格和尺寸API调用频率限制问题免费版API有调用次数限制影响用户体验解决方案实现请求队列和缓存机制重复抽到同一张牌时使用缓存图像优化购买商业API套餐或使用多个API密钥轮询随机算法公平性问题伪随机数生成器可能不够随机解决方案结合时间戳、用户输入哈希等多种因素生成种子优化使用真正的随机数源或区块链随机数服务6.2 性能优化策略图像缓存系统# cache_manager.py - 缓存管理 import os import hashlib from pathlib import Path from functools import lru_cache class ImageCacheManager: def __init__(self, cache_dir: str image_cache): self.cache_dir Path(cache_dir) self.cache_dir.mkdir(exist_okTrue) def get_cache_key(self, card_id: int, style: str) - str: 生成缓存键 key_str f{card_id}_{style} return hashlib.md5(key_str.encode()).hexdigest() def get_cached_image(self, card_id: int, style: str) - str: 获取缓存图像路径 cache_key self.get_cache_key(card_id, style) image_path self.cache_dir / f{cache_key}.png return str(image_path) if image_path.exists() else None def cache_image(self, image_path: str, card_id: int, style: str): 缓存图像 cache_key self.get_cache_key(card_id, style) target_path self.cache_dir / f{cache_key}.png if Path(image_path).exists() and not target_path.exists(): import shutil shutil.copy2(image_path, target_path) lru_cache(maxsize100) def get_card_image(self, card_id: int, style: str, generate
返回列表