diff --git a/resources/icon.png b/resources/icon.png new file mode 100644 index 0000000..f643538 Binary files /dev/null and b/resources/icon.png differ diff --git a/resources/icon.svg b/resources/icon.svg new file mode 100644 index 0000000..4b998fc --- /dev/null +++ b/resources/icon.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/icon11.ico b/resources/icon11.ico new file mode 100644 index 0000000..5ee79c4 Binary files /dev/null and b/resources/icon11.ico differ diff --git a/resources/icon_1.png b/resources/icon_1.png new file mode 100644 index 0000000..cf9e8b2 Binary files /dev/null and b/resources/icon_1.png differ diff --git a/resources/icon_2.png b/resources/icon_2.png new file mode 100644 index 0000000..5cf687d Binary files /dev/null and b/resources/icon_2.png differ diff --git a/resources/package/Improve/output/00000-1616097796-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png b/resources/package/Improve/output/00000-1616097796-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png new file mode 100644 index 0000000..d5da84c Binary files /dev/null and b/resources/package/Improve/output/00000-1616097796-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png differ diff --git a/resources/package/Improve/output/00001-1083368712-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png b/resources/package/Improve/output/00001-1083368712-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png new file mode 100644 index 0000000..7a318d7 Binary files /dev/null and b/resources/package/Improve/output/00001-1083368712-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png differ diff --git a/resources/package/Improve/output/00002-763798052-(masterpiece, best quality, a group of courtiers in fancy robes faced the young emperor in a chinese-style palace, and the minis.png b/resources/package/Improve/output/00002-763798052-(masterpiece, best quality, a group of courtiers in fancy robes faced the young emperor in a chinese-style palace, and the minis.png new file mode 100644 index 0000000..82dbdbc Binary files /dev/null and b/resources/package/Improve/output/00002-763798052-(masterpiece, best quality, a group of courtiers in fancy robes faced the young emperor in a chinese-style palace, and the minis.png differ diff --git a/resources/package/Improve/output/00003-2561272579-(masterpiece, best quality,a young face stalwart handsome domineering majestic long black hair wearing a gorgeous robe of a man.png b/resources/package/Improve/output/00003-2561272579-(masterpiece, best quality,a young face stalwart handsome domineering majestic long black hair wearing a gorgeous robe of a man.png new file mode 100644 index 0000000..b7029ac Binary files /dev/null and b/resources/package/Improve/output/00003-2561272579-(masterpiece, best quality,a young face stalwart handsome domineering majestic long black hair wearing a gorgeous robe of a man.png differ diff --git a/resources/package/Improve/output/00004-1447729042-(masterpiece, best quality, a young face stalwart handsome domineering majestic long black hair wearing gorgeous robes of a man.png b/resources/package/Improve/output/00004-1447729042-(masterpiece, best quality, a young face stalwart handsome domineering majestic long black hair wearing gorgeous robes of a man.png new file mode 100644 index 0000000..5d9c20f Binary files /dev/null and b/resources/package/Improve/output/00004-1447729042-(masterpiece, best quality, a young face stalwart handsome domineering majestic long black hair wearing gorgeous robes of a man.png differ diff --git a/src/define/define_string.js b/src/define/define_string.js new file mode 100644 index 0000000..22d7d61 --- /dev/null +++ b/src/define/define_string.js @@ -0,0 +1,172 @@ +export const DEFINE_STRING = { + SAVE_DEFINE_CONFIG_JSON_BY_PROPERTY: "SAVE_DEFINE_CONFIG_JSON_BY_PROPERTY", + GET_DEFINE_CONFIG_JSON_BY_PROPERTY: "GET_DEFINE_CONFIG_JSON_BY_PROPERTY", + GET_IMAGE_GENERATE_CATEGORY: "GET_IMAGE_GENERATE_CATEGORY", + SHOW_MAIN_NOTIFICATION: "SHOW_MAIN_NOTIFICATION", + CHECK_MACHINE_ID: "CHECK_MACHINE_ID", + GET_CUSTOMIZE_GPT_PROMPT: "GET_CUSTOMIZE_GPT_PROMPT", + GENERATE_GPT_EXAMPLE_OUT: "GENERATE_GPT_EXAMPLE_OUT", + GET_PERMISSION: "GET_PERMISSION", + SAVE_IMAGE_TO_OTHER_FOLDER: "SAVE_IMAGE_TO_OTHER_FOLDER", + GET_IMAGE_AUTO_SAVE_SETTING: "GET_IMAGE_AUTO_SAVE_SETTING", + SAVE_IMAGE_AUTO_SAVE_SETTING: "SAVE_IMAGE_AUTO_SAVE_SETTING", + GET_AUTO_SAVE_IMAGE_CLASSIFY_OPTIONS: "GET_AUTO_SAVE_IMAGE_CLASSIFY_OPTIONS", + MODIFY_GENERATE_TASK_STATUS: "MODIFY_GENERATE_TASK_STATUS", + DELETE_BACK_TASK: "DELETE_BACK_TASK", + SAVE_VIDEO_SRT_AND_AUDIO_MESSAGE: "SAVE_VIDEO_SRT_AND_AUDIO_MESSAGE", + SAVE_KEY_FRAME_SETTING: "SAVE_KEY_FRAME_SETTING", + MODIFY_SAMPLE_SETTING: "MODIFY_SAMPLE_SETTING", + GET_SETTING_Dafault_DATA: "GET_SETTING_Dafault_DATA", + GET_DRAFT_FILE_LIST: "GET_DRAFT_FILE_LIST", + GET_FRAME: "GET_FRAME", + PYTHON_ERROR: "PYTHON_ERROR", + PYTHON_CLOSE: "PYTHON_CLOSE", + PYTHON_OUTPUT: "PYTHON_OUTPUT", + RESTART_GENERATE: "RESTART_GENERATE", + ALIGN_DRAFT_IMG: "ALIGN_DRAFT_IMG", + ALIGN_DRAFT_IMG_TO_TEXT: "ALIGN_DRAFT_IMG_TO_TEXT", + REGENERATE_IMAGE_RETUN: "REGENERATE_IMAGE_RETUN", + GET_SUBFOLDER_LIST: "GET_SUBFOLDER_LIST", + REFRASH_IMAGWE_DATA: "REFRASH_IMAGWE_DATA", + GET_IMAGE_PROMPTLIST: "GET_IMAGE_PROMPTLIST", + SELECT_FILE: "SELECT_FILE", + IMPROVE_IMAGE_RESOULTION: "IMPROVE_IMAGE_RESOULTION", + GET_BACKGROUND_MUSIC_CONFIG_LIST: "GET_BACKGROUND_MUSIC_CONFIG_LIST", + ADD_BACKGROUND_MUSIC_FOLDER: "ADD_BACKGROUND_MUSIC_FOLDER", + DELETE_CLIP_SETTING: "DELETE_CLIP_SETTING", + DELETE_FRIENDLY_REMINDER: "DELETE_FRIENDLY_REMINDER", + MODIFY_INPUT_CROP_JSON: "MODIFY_INPUT_CROP_JSON", + PUSH_BACK_PROMPT: "PUSH_BACK_PROMPT", + GET_FRIENDLY_REMINDER_DRAFT: "GET_FRIENDLY_REMINDER_DRAFT", + GET_FRIENDLY_REMINDER_LIST: "GET_FRIENDLY_REMINDER_LIST", + AUTO_GENERATION_VIDEO: "AUTO_GENERATION_VIDEO", + GET_PROJECT_WORD: "GET_PROJECT_WORD", + AIMODIFY_ONE_WORD: "AIMODIFY_ONE_WORD", + IMPORT_SRT_AND_GET_TIME: "IMPORT_SRT_AND_GET_TIME", + SAVE_NEW_WORD: "SAVE_NEW_WORD", + SAVE_COPYWRITING_INFOMATION: "SAVE_COPYWRITING_INFOMATION", + SAVE_SD_CONFIG: "SAVE_SD_CONFIG", + SAVE_GENERAL_SETTING: "SAVE_GENERAL_SETTING", + GET_VIDEO_CONFIG_MESSAGE: "GET_VIDEO_CONFIG_MESSAGE", + GET_SYSTEM_INSTALL_FONTNAME: "GET_SYSTEM_INSTALL_FONTNAME", + SAVE_ASS_CONFIG: "SAVE_ASS_CONFIG", + DELETE_VIDEO_CONFIG: "DELETE_VIDEO_CONFIG", + SHOW_NEW_WINDOW: "SHOW_NEW_WINDOW", + GET_DRAFT_FILE_LIST: "GET_DRAFT_FILE_LIST", + SELECT_FOLDER: "SELECT_FOLDER", + GET_DRAFT_TEXT_STYLE: "GET_DRAFT_TEXT_STYLE", + GET_TEXT_STYLE_LIST: "GET_TEXT_STYLE_LIST", + DELETE_DRAFT_TEXT_STYLE: "DELETE_DRAFT_TEXT_STYLE", + ADD_DRAFT: "ADD_DRAFT", + RETURN_IMAGE_PROMPT: "RETURN_IMAGE_PROMPT", + RE_GENERATE_IAMGE_ONE: "RE_GENERATE_IAMGE_ONE", + INIT_SD_CONFIG: "INIT_SD_CONFIG", + ADD_IMAGE_TASK_LIST: "ADD_IMAGE_TASK_LIST", + GET_GENERATE_TASK_LIST: "GET_GENERATE_TASK_LIST", + DELETE_IMAGE_TASK_LIST: "DELETE_IMAGE_TASK_LIST", + GENERATE_IMAGWE_IN_SELECT_TASK: "GENERATE_IMAGWE_IN_SELECT_TASK", + GET_MACHINE_ID: "GET_MACHINE_ID", + QUIT_APP: "QUIT_APP", + GET_BAD_PROMPT: "GET_BAD_PROMPT", + SAVE_BAD_PROMPT: "SAVE_BAD_PROMPT", + DELETE_BAD_PROMPT: "DELETE_BAD_PROMPT", + ADD_WEBUI_JSON: "ADD_WEBUI_JSON", + OPEN_GPT_BUY_URL: "OPEN_GPT_BUY_URL", + GET_IAMGE_PROMPT_LIST: "GET_IAMGE_PROMPT_LIST", + GET_ADETAILER_LIST: "GET_ADETAILER_LIST", + SAVE_DETAILER_CONFIG: "SAVE_DETAILER_CONFIG", + OPEN_URL: "OPEN_URL", + GET_VERSION: "GET_VERSION", + GET_FRAME_RETUN: "GET_FRAME_RETUN", + DOWNLOAD_MODEL: "DOWNLOAD_MODEL", + START_STORY_BOARDING: "START_STORY_BOARDING", + SHOW_MESSAGE_DIALOG: "SHOW_MESSAGE_DIALOG", + SHOW_GLOABAL_MESSAGE_DIALOG: "SHOW_GLOABAL_MESSAGE_DIALOG", + IMAGE_TASK_STATUS_REFRESH: "IMAGE_TASK_STATUS_REFRESH", + SAVE_TRIAL_END_TIME: "SAVE_TRIAL_END_TIME", + DOWNLOAD_IMAGE_FILE: "DOWNLOAD_IMAGE_FILE", + OPEN_FOLDER: "OPEN_FOLDER", + VIDEO_GENERATE_STATUS_REFRESH: "VIDEO_GENERATE_STATUS_REFRESH", + AUTO_CONDITION_CHECK: "AUTO_CONDITION_CHECK", + MODIFY_IMAGE_TASK_LIST: "MODIFY_IMAGE_TASK_LIST", + ACTION_AUTO_VIDEO_TASK: "ACTION_AUTO_VIDEO_TASK", + GET_VIDEO_GENERATE_CONFIG: "GET_VIDEO_GENERATE_CONFIG", + TRANSLATE_PROMPT: "TRANSLATE_PROMPT", + TRANSLATE_RETURN_NOW: "TRANSLATE_RETURN_NOW", + TRANSLATE_RETURN_REFRESH: "TRANSLATE_RETURN_REFRESH", + GET_SHOW_MESSAGE: "GET_SHOW_MESSAGE", + AUTO_ANALYZE_CHARACTER: "AUTO_ANALYZE_CHARACTER", + GET_CONFIG_JSON: "GET_CONFIG_JSON", + ORIGINAL_ADD_WEBUI_JSON: "ORIGINAL_ADD_WEBUI_JSON", + GET_PROMPT_JSON: "GET_PROMPT_JSON", + GPT_PROMPT: "GPT_PROMPT", + GPT_GENERATE_PROMPT_RETURN: "GPT_GENERATE_PROMPT_RETURN", + AUTO_SAVE_DATA_JSON: "AUTO_SAVE_DATA_JSON", + ORIGINAL_SD_SINGLE_IMAGE_GENERATE: "ORIGINAL_SD_SINGLE_IMAGE_GENERATE", + SD_ORIGINAL_GENERATE_IMAGE_RETURN: "SD_ORIGINAL_GENERATE_IMAGE_RETURN", + GET_STYLE_IMAGE_SUB_LIST: "GET_STYLE_IMAGE_SUB_LIST", + GET_IMAGE_STYLE_INFOMATION: "GET_IMAGE_STYLE_INFOMATION", + GET_IMAGE_STYLE_MENU: "GET_IMAGE_STYLE_MENU", + GET_GPT_BUSINESS_OPTION: "GET_GPT_BUSINESS_OPTION", + GET_GPT_MODEL_OPTION: "GET_GPT_MODEL_OPTION", + GET_GPT_AUTO_INFERENCE_OPTIONS: "GET_GPT_AUTO_INFERENCE_OPTIONS", + SAVE_DYNAMIC_GPT_OPTION: "SAVE_DYNAMIC_GPT_OPTION", + DELETE_DYNAMIC_GPT_OPTION: "DELETE_DYNAMIC_GPT_OPTION", + TEST_GPT_CONNECTION: "TEST_GPT_CONNECTION", + SAVE_WORD_TXT: "SAVE_WORD_TXT", + GET_KEY_FRAME_CONFIG_DATA: "GET_KEY_FRAME_CONFIG_DATA", + GET_KEYFRAME_OPTIONS: "GET_KEYFRAME_OPTIONS", + + QUEUE_BATCH: { + SD_ORIGINAL_GENERATE_IMAGE: "SD_ORIGINAL_GENERATE_IMAGE", + SD_ORIGINAL_GPT_PROMPT: "SD_ORIGINAL_GPT_PROMPT", + SD_BACKSTEP_GENERATE_IMAGE: "SD_BACKSTEP_GENERATE_IMAGE", + MJ_ORIGINAL_GENERATE_IMAGE: "MJ_ORIGINAL_GENERATE_IMAGE", + LOCAL_IMAGE_IMPROVE: "LOCAL_IMAGE_IMPROVE", + AUTO_VIDEO_GENERATE: "AUTO_VIDEO_GENERATE", + AUTO_VIDEO_GENERATE_SINGLE: "AUTO_VIDEO_GENERATE_SINGLE", + TRANSLATE_PROMPT: "TRANSLATE_PROMPT", + TRANSLATE_RETURN_NOW_TASK: "TRANSLATE_RETURN_NOW_TASK", + IMAGE_SAVE_TO_OTHER_FOLDER: "IMAGE_SAVE_TO_OTHER_FOLDER", + SAVE_FILE_QUEUE: "SAVE_FILE_QUEUE", + }, + PERMISSIONS: { + NORMAL_PERMISSION: "NORMAL_PERMISSION", + AUTO_SAVE_IMAGE_PERMISSION: "AUTO_SAVE_IMAGE_PERMISSION", + }, + MJ: { + SAVE_WORD_SRT: "SAVE_WORD_SRT", + GET_MJ_CONFIG_SRT_INFORMATION: "GET_MJ_CONFIG_SRT_INFORMATION", + GET_TAG_DATA_BY_TYPE_AND_PROPERTY: "GET_TAG_DATA_BY_TYPE_AND_PROPERTY", + SAVE_TAG_PROPERTY_DATA: "SAVE_TAG_PROPERTY_DATA", + DELETE_TAG_PROPERTY_DATA: "DELETE_TAG_PROPERTY_DATA", + GET_TAG_SELECT_MODEL: "GET_TAG_SELECT_MODEL", + TRANSLATE_RETURN_NOW_TASK: "TRANSLATE_RETURN_NOW_TASK", + ORIGINAL_MJ_IMAGE_GENERATE: "ORIGINAL_MJ_IMAGE_GENERATE", + GET_CHANNEL_ROBOTS: "GET_CHANNEL_ROBOTS", + GET_MJ_GENERATE_CATEGORY: "GET_MJ_GENERATE_CATEGORY", + IMAGE_SPLIT: "IMAGE_SPLIT", + ADD_MJ_BAD_PROMPT: "ADD_MJ_BAD_PROMPT", + MJ_BAD_PROMPT_CHECK: "MJ_BAD_PROMPT_CHECK", + GET_GENERATED_MJ_IMAGE_AND_SPLIT: "GET_GENERATED_MJ_IMAGE_AND_SPLIT", + DOWNLOAD_IMAGE_URL_AND_SPLIT: "DOWNLOAD_IMAGE_URL_AND_SPLIT" + }, + DISCORD: { + OPERATE_REFRASH_DISCORD_URL: "OPERATE_REFRASH_DISCORD_URL", + GET_DISCORD_WINDOW_URL: "GET_DISCORD_WINDOW_URL", + CREATE_MESSAGE: "CREATE_MESSAGE", + UPDATE_MESSAGE: "UPDATE_MESSAGE", + DELETE_MESSAGE: "DELETE_MESSAGE", + MAIN_DISCORD_MESSAGE_CHANGE: "MAIN_DISCORD_MESSAGE_CHANGE", + }, + DISCORD_REQUEST_LISTENER_TYPE: { + INPUT_MODEL_IMAGINE_REQUEST: "INPUT_MODEL_IMAGINE_REQUEST", + }, + DISCORD_SIMPLE_DATA_TYPE: { + URL: "URL", + TOKEN: "TOKEN", + }, + MAIN: { + OPEN_DISCORD_WINDOW: "OPEN_DISCORD_WINDOW" + } +} \ No newline at end of file diff --git a/src/define/iamgeStyleDefine.js b/src/define/iamgeStyleDefine.js new file mode 100644 index 0000000..7cf0548 --- /dev/null +++ b/src/define/iamgeStyleDefine.js @@ -0,0 +1,2265 @@ +import { SdSettingDefine } from "./setting/sdSettingDefine"; + +const ImageStyleDefine = { + image_style: [{ + "sheet": 1, + "name": "常用画风", + "subStyle": [{ + "chinese_style": "壁纸", + "english_style": "Wallpaper", + "id": "238f8db1-3b9f-48b8-86de-b47c70dbdc25", + "image": "image8.jpeg" + }, { + "chinese_style": "黑白漫画", + "english_style": "Black and white comics", + "id": "bb314303-4f94-4a9a-b9cc-2f0eca64e288", + "image": "image2.jpeg" + }, { + "chinese_style": "水墨风格", + "english_style": "Ink and wash style", + "id": "078dc21d-669c-4a60-8036-2705dfb1d6b6", + "image": "image3.jpeg" + }, { + "chinese_style": "超写实风格", + "english_style": "Super realistic style", + "id": "81dd155f-f69d-4ed0-9fdd-6f639e5e6d06", + "image": "image4.jpeg" + }, { + "chinese_style": "电影截图", + "english_style": "Screenshots of movies", + "id": "3923dfb8-3394-4e6f-a9f4-55caf24b3991", + "image": "image5.jpeg" + }, { + "chinese_style": "宫崎骏漫画风格", + "english_style": "Miyazaki Hayao manga style", + "id": "b1869409-8079-4934-b6b1-b26cf4606e65", + "image": "image6.jpeg" + }, { + "chinese_style": "可爱风格", + "english_style": "cute style", + "id": "79feb583-f4e3-4d35-b7f2-31021693bb90", + "image": "image7.jpeg" + }, { + "chinese_style": "简笔画风格", + "english_style": "Simple stroke style", + "id": "0378c4d7-676f-4693-925a-112d2f8fd76b", + "image": "image1.jpeg" + }, { + "chinese_style": "3D卡通动画", + "english_style": "3D cartoon animation", + "id": "a5732ec7-3b49-40d8-8bbc-ac213ec77df7", + "image": "image11.jpeg" + }, { + "chinese_style": "90年代日本动漫", + "english_style": "90s Japanese anime", + "id": "a9f5eb3b-d4ae-4ba4-aa43-0198f36b6147", + "image": "image9.jpeg" + }, { + "chinese_style": "水彩画风格", + "english_style": "Watercolor painting style", + "id": "9d1e4c03-0406-44cc-88f9-21c117a3c88b", + "image": "image10.jpeg" + }, { + "chinese_style": "钢笔画风格", + "english_style": "Pen drawing style", + "id": "392067d1-cd6e-4baa-b2d3-f319b892f78c", + "image": "image12.jpeg" + }, { + "chinese_style": "恐怖漫画风格", + "english_style": "Horror comic style", + "id": "0e8a0c64-04e8-4370-ad2a-06148afa0662", + "image": "image13.jpeg" + }], + "id": "07246bd9-b811-4e00-b69b-f86c48f2660b" + }, { + "sheet": 2, + "name": "时代风格词", + "subStyle": [{ + "chinese_style": "中世纪时代", + "english_style": "middle ages", + "id": "c0f55669-a90e-4024-9c5c-fe4614eabe29", + "image": "image16.jpeg" + }, { + "chinese_style": "冷战时代", + "english_style": "cold war era", + "id": "e2c3b92b-ab4d-44fd-a477-7e308a4e9dfb", + "image": "image19.jpeg" + }, { + "chinese_style": "古典时代", + "english_style": "classical antiquity", + "id": "f5e943bd-0e34-4f5e-baac-1c2e0304c0cf", + "image": "image20.jpeg" + }, { + "chinese_style": "柴油朋克时代", + "english_style": "diesel punk", + "id": "a2ffb049-2c5b-4f3f-9cef-d27e7d8d8ab0", + "image": "image21.jpeg" + }, { + "chinese_style": "哥特式时代", + "english_style": "gothic period", + "id": "db5e8036-7f8c-4047-8c3d-f64f010fc4dd", + "image": "image14.jpeg" + }, { + "chinese_style": "中国战国时代", + "english_style": "warring states period", + "id": "ba0ae70c-37de-40e3-9dc8-08a7e03de123", + "image": "image17.jpeg" + }, { + "chinese_style": "日本明治时代", + "english_style": "meiji period", + "id": "a465ddc1-9782-430b-b09c-7a79effc1c29", + "image": "image15.jpeg" + }, { + "chinese_style": "现代", + "english_style": "modern", + "id": "a12c8315-28c0-42bd-a3ec-a856d48f5161", + "image": "image18.jpeg" + }, { + "chinese_style": "文艺复兴时代", + "english_style": "renaissance", + "id": "e1329854-1df1-4664-9ca2-27c8f905f2d3", + "image": "image25.jpeg" + }, { + "chinese_style": "中国宋代", + "english_style": "song dynasty", + "id": "df196ffe-012a-4fe5-8db3-d89046d5eb39", + "image": "image26.jpeg" + }, { + "chinese_style": "古埃及时代", + "english_style": "ancient egypt", + "id": "27c5c5df-4b9f-487c-8884-4c50035f4bc6", + "image": "image23.jpeg" + }, { + "chinese_style": "蒸汽朋克时代", + "english_style": "steampunk", + "id": "62018708-10c6-4a1f-8c35-9c162278686f", + "image": "image28.jpeg" + }, { + "chinese_style": "中国明代", + "english_style": "ming dynasty", + "id": "20c9f4cf-99ec-4550-a965-768190d91498", + "image": "image29.jpeg" + }, { + "chinese_style": "青铜时代", + "english_style": "bronze age", + "id": "6ef8bd4f-c843-435c-9d31-ca2f36add104", + "image": "image22.jpeg" + }, { + "chinese_style": "中国唐代", + "english_style": "tang dynasty", + "id": "950518dc-e87b-4be8-8487-8b732b52e175", + "image": "image27.jpeg" + }, { + "chinese_style": "赛博朋克时代", + "english_style": "cyberpunk", + "id": "8e012231-4e38-4d6d-b18c-4e03f1ef45f1", + "image": "image24.jpeg" + }, { + "chinese_style": "工业革命时代", + "english_style": "industrial revolution", + "id": "8a46b74f-91b5-40d5-bec7-afba88b5abb1", + "image": "image30.jpeg" + }, { + "chinese_style": "日本江户时代", + "english_style": "edo period", + "id": "5ab22ed5-b284-4f79-be4f-7c6aef329151", + "image": "image31.jpeg" + }], + "id": "ade4cf78-7bef-43c8-9d13-c2ea5c3f9f38" + }, { + "sheet": 3, + "name": "画家画风风格词", + "subStyle": [{ + "chinese_style": "潘天寿(古风画风-成熟)", + "english_style": "Pan Tianshou", + "id": "6d54b67f-08e3-40ac-816f-d4081ad7d9e2", + "image": "image35.jpeg" + }, { + "chinese_style": "朱屺瞻(古风画风-艳丽)", + "english_style": "Zhu Qizhan", + "id": "121b3d63-b0b2-4dd4-aaa4-e2c3e8d89d76", + "image": "image36.jpeg" + }, { + "chinese_style": "齐白石(古风画风-简约)", + "english_style": "Qi Baishi", + "id": "bc76a884-afac-450e-88cc-54f65c504a7c", + "image": "image37.jpeg" + }, { + "chinese_style": "张大千(古风画风-可爱)", + "english_style": "Zhang Daqian", + "id": "a85caede-767a-4b8b-b14a-981656415637", + "image": "image33.jpeg" + }, { + "chinese_style": "亨利·马蒂斯(都市画风-时尚)", + "english_style": "Henri Matisse", + "id": "9b7e83e6-dc18-41b8-8887-176794a615c3", + "image": "image38.jpeg" + }, { + "chinese_style": "乔治亚·欧姬芙(都市画风-欧美)", + "english_style": "Georgia O'Keeffe", + "id": "ca757d22-c5fc-4974-9768-16323957fe85", + "image": "image32.jpeg" + }, { + "chinese_style": "格伦·基恩(迪斯尼-美女与野兽风)", + "english_style": "Glen Keane", + "id": "1a5655c9-6800-42ab-aa88-7ab2c77c8c0c", + "image": "image39.jpeg" + }, { + "chinese_style": "根迪·塔尔塔科夫斯基(欧美动画风)", + "english_style": "Genndy Tartakovsky", + "id": "60357799-3cba-4809-b50c-db804783599d", + "image": "image34.jpeg" + }, { + "chinese_style": "克雷格·汤普森(都市画风-细腻)", + "english_style": "Craig Thompson", + "id": "a6806093-372a-44f0-8967-d764b1e90709", + "image": "image40.jpeg" + }, { + "chinese_style": "亨利·马蒂斯(都市画风-流行)", + "english_style": "Henri Matisse", + "id": "fac9dd65-8a92-43ab-b026-63231ebf6de2", + "image": "image44.jpeg" + }, { + "chinese_style": "伊藤润二(日式恐怖画风)", + "english_style": "Junji Ito", + "id": "0115613d-ee65-4d32-b9a5-eeb57cdc708d", + "image": "image45.jpeg" + }, { + "chinese_style": "朴泰俊(小鲜肉都市风)", + "english_style": "Park Tae", + "id": "80d2fb78-2a69-4314-989d-57734dce6789", + "image": "image41.jpeg" + }, { + "chinese_style": "朴智旻(都市恋爱风)", + "english_style": "Park Ji", + "id": "6b4c5150-82e0-4259-9617-59434291e4b5", + "image": "image42.jpeg" + }, { + "chinese_style": "金瑞亨(韩风都市恋爱)", + "english_style": "Kim Hyeong", + "id": "f1fee049-109c-4b85-83bf-ed3ed5554f7f", + "image": "image43.jpeg" + }, { + "chinese_style": "查克·琼斯(欧美动画风-猫和老鼠)", + "english_style": "Chuck Jones", + "id": "21c0e23f-d98b-41f0-b351-cb1b47f462ee", + "image": "image46.jpeg" + }, { + "chinese_style": "高畑勋(日式动漫风)", + "english_style": "Isao Takahata", + "id": "55868e27-cc28-4830-b6c9-46096416b03d", + "image": "image47.jpeg" + }, { + "chinese_style": "淺野恭司(细腻日漫)", + "english_style": "Kyoji Asano", + "id": "126ec922-c45d-4a83-b9d7-48f04513cad0", + "image": "image48.jpeg" + }, { + "chinese_style": "卡洛斯·达托利(都市少男风)", + "english_style": "Carlos Dattoli", + "id": "a7aee025-fc08-4e66-82ba-42f38b7d3405", + "image": "image49.jpeg" + }, { + "chinese_style": "库夫希诺夫·伊利亚(都市少女风)", + "english_style": "Kuvshinov Ilya", + "id": "a9679671-a1b9-472b-be78-4fd91adc9e02", + "image": "image50.jpeg" + }, { + "chinese_style": "加里·拉尔森、杰拉德·乌克盖斯特(美式漫画)", + "english_style": "Gary Larson, Gerard Houckgeest", + "id": "c1eb9ca2-4d89-4636-b1ff-7f83d7eba781", + "image": "image54.jpeg" + }, { + "chinese_style": "阮佳(国风插画)", + "english_style": "Ruan Jia", + "id": "32afc969-622a-4792-a270-02cf6952d805", + "image": "image51.jpeg" + }, { + "chinese_style": "保罗·罗沃西、塞西莉·布朗(欧美风偏质感)", + "english_style": "Paolo roversi, Cecily brown", + "id": "f9860c1f-8552-4514-8be7-617527d51f0b", + "image": "image52.jpeg" + }, { + "chinese_style": "山田尚子(日式少女风)", + "english_style": "Naoko Yamada", + "id": "ad6ed3d9-a153-487e-9cd5-8447f99ce43b", + "image": "image53.jpeg" + }, { + "chinese_style": "木村贵宏(日式动漫风)", + "english_style": "Takahiro Kimura", + "id": "199934ed-5d7e-4af7-979b-0b2dd4862199", + "image": "image55.jpeg" + }, { + "chinese_style": "安德烈亚斯·-罗查(欧美风偏细节色彩)", + "english_style": "Andreas Rocha", + "id": "f6358e01-7276-4f26-96c8-56a619ae3126", + "image": "image70.jpeg" + }, { + "chinese_style": "凉香(日式古风)", + "english_style": "Ryohka", + "id": "824b9390-9787-44de-ab43-da5d647101ad", + "image": "image71.jpeg" + }, { + "chinese_style": "丽贝卡·盖伊(西方魔幻)", + "english_style": "Rebecca Guay", + "id": "5d2234ce-d0d8-4330-93d5-21a81d6486d5", + "image": "image64.jpeg" + }, { + "chinese_style": "克雷格·穆林斯(西方末日科幻)", + "english_style": "Craig Mullins", + "id": "a66f32dd-2b73-4d6c-8d83-cc1a37dae7ea", + "image": "image65.jpeg" + }, { + "chinese_style": "小林修(日式画风)", + "english_style": "Osamu Kobayashi", + "id": "a9e9c6ab-02d1-406b-b730-9d4ece86d29c", + "image": "image66.jpeg" + }, { + "chinese_style": "池上辽一(日式画风)", + "english_style": "Ryoichi Ikegami", + "id": "aea0beec-32ea-42c7-9891-09616a01a424", + "image": "image69.jpeg" + }, { + "chinese_style": "岸本齐史(火影忍着风)", + "english_style": "Masashi Kishimoto", + "id": "2ef699da-781d-4f05-9239-6d027d34c42c", + "image": "image67.jpeg" + }, { + "chinese_style": "沃尔特·迪斯尼(迪斯尼风)", + "english_style": "Walt Disney", + "id": "6befee18-2232-4a3e-b1a5-d206d5e29138", + "image": "image68.jpeg" + }, { + "chinese_style": "久保带人(死神画风)", + "english_style": "Tite Kubo", + "id": "c26be074-bc44-41bc-b36c-97845c8fb544", + "image": "image62.jpeg" + }, { + "chinese_style": "谏山创(进击的巨人画风)", + "english_style": "Hajime Isayama", + "id": "5ceeedb9-4977-49f4-9122-220165784683", + "image": "image63.jpeg" + }, { + "chinese_style": "新海诚", + "english_style": "Makoto Shinkai", + "id": "9cc4611f-4ebe-449f-ae9c-3502a37a857e", + "image": "image60.jpeg" + }, { + "chinese_style": "武内直子(美少女战士画风)", + "english_style": "Naoko Takeuchi", + "id": "9176dac9-deaa-4e19-8d0f-e586437d251f", + "image": "image56.jpeg" + }, { + "chinese_style": "濑户目鹤(日漫风)", + "english_style": "Koyori", + "id": "321322f7-0f12-47d5-9d53-1945b8ef4516", + "image": "image57.jpeg" + }, { + "chinese_style": "细田守(日本动漫风)", + "english_style": "Mamoru Hosoda", + "id": "9e2db099-5996-4e8a-8e86-37f8fc81fa1a", + "image": "image58.jpeg" + }, { + "chinese_style": "约翰·拉塞特(欧美动画风)", + "english_style": "John Lasseter", + "id": "d7f5278d-d242-4834-ab82-2adfc11231e8", + "image": "image61.jpeg" + }, { + "chinese_style": "蒂姆·伯顿(魔发奇缘风-暗黑魔幻)", + "english_style": "Tim Burton", + "id": "c104bba3-6611-4178-93d8-2f988fb83fc7", + "image": "image59.jpeg" + }, { + "chinese_style": "鸟山明(龙珠画风)", + "english_style": "Akira Toriyama", + "id": "e51d4ad6-816d-4534-89e0-3fdaf7a3916c", + "image": "image72.jpeg" + }, { + "chinese_style": "高桥留美子(犬夜叉画风)", + "english_style": "Rumiko Takahashi", + "id": "589a6e3d-4707-4eba-8650-e479fe56aa49", + "image": "image73.jpeg" + }, { + "chinese_style": "庵野秀明(EVA画风)", + "english_style": "Hideaki Anno", + "id": "1ba9073e-b530-4520-893e-4f7eb2c8cba6", + "image": "image76.jpeg" + }, { + "chinese_style": "宫崎骏(日式动漫风)", + "english_style": "Hayao Miyazaki", + "id": "92b59244-5b26-47e2-a542-050b28beb631", + "image": "image75.jpeg" + }, { + "chinese_style": "米林宏昌(日式古风)", + "english_style": "hiromasa yonebayashi", + "id": "5f3bfcdd-d6f9-40c8-8ebb-b423ee768d59", + "image": "image74.jpeg" + }, { + "chinese_style": "男鹿和雄(日漫古风)", + "english_style": "kazuo oga", + "id": "b389d682-0ac2-434c-849a-9ceca0468397", + "image": "image77.jpeg" + }], + "id": "661f3673-b448-49c5-95eb-92416c669f21" + }, { + "sheet": 4, + "name": "中华古风", + "subStyle": [{ + "chinese_style": "张光宇风格", + "english_style": "Zhang Guangyu style", + "id": "f67e1f1f-3824-4190-aa7b-22a4ceefc803", + "image": "image85.jpeg" + }, { + "chinese_style": "丰子恺风格", + "english_style": "Feng Zikai style", + "id": "0c6e2462-82a2-492d-8f00-e0571099230a", + "image": "image83.jpeg" + }, { + "chinese_style": "蔡志忠风格", + "english_style": "Cai Zhong style", + "id": "ddc1adda-5bc5-4779-9f70-942f5c8bc739", + "image": "image82.jpeg" + }, { + "chinese_style": "马荣成风格", + "english_style": "Ma Rongcheng style", + "id": "c6ecceb3-4000-4846-ad54-160f7f92ac68", + "image": "image78.jpeg" + }, { + "chinese_style": "陈某风格", + "english_style": "Chen Someone style", + "id": "85cd0650-a62a-4123-a7ac-ae7ecfe549c7", + "image": "image84.jpeg" + }, { + "chinese_style": "夏达风格", + "english_style": "Xia Da style", + "id": "3317e89f-c828-4a60-bab7-9935dd2f841c", + "image": "image79.jpeg" + }, { + "chinese_style": "猫君风格", + "english_style": "Cat Jun style", + "id": "5db7dfa4-306b-4c0f-a8ca-314037c32839", + "image": "image80.jpeg" + }, { + "chinese_style": "Left Hand Han style", + "english_style": "左手韩风格", + "id": "eed2d205-3818-4b3d-9d2a-98a5140cd97e", + "image": "image81.jpeg" + }, { + "chinese_style": "阿梗风格", + "english_style": "A Geng style", + "id": "ad75eb08-6e12-4707-affb-7292471b82c7", + "image": "image89.jpeg" + }, { + "chinese_style": "本杰明风格", + "english_style": "Benjamin style", + "id": "00638bad-7919-4bbe-844d-89bf78787df8", + "image": "image88.jpeg" + }, { + "chinese_style": "寂地风格", + "english_style": "Ji Di style", + "id": "f041d7d9-485f-4ef8-a3ee-a63a480d9980", + "image": "image86.jpeg" + }, { + "chinese_style": "鹿菏风格", + "english_style": "Lu He style", + "id": "33aa10c2-1d70-46b4-b847-bed5eb9f5f41", + "image": "image87.jpeg" + }], + "id": "fc8d672d-8482-445b-8652-a7d8910c621c" + }, { + "sheet": 5, + "name": "中国都市漫画作者风格", + "subStyle": [{ + "chinese_style": "姚非拉风格", + "english_style": "Yao Feila style", + "id": "ad83c246-6c22-42ac-9049-e6e1e3f82022", + "image": "image93.jpeg" + }, { + "chinese_style": "慕容引刀风格", + "english_style": "Murong Yindao style", + "id": "845ec4a6-a1bf-42b3-b2f5-503bae91e24b", + "image": "image90.jpeg" + }, { + "chinese_style": "使徒子风格", + "english_style": "Apostle style", + "id": "59c26e38-33f1-44ad-a471-d747babd0cee", + "image": "image94.jpeg" + }, { + "chinese_style": "幽·灵风格", + "english_style": "Youling style", + "id": "0f6e1954-2b2b-418c-b36b-bb833a49d131", + "image": "image91.jpeg" + }, { + "chinese_style": "猫树风格", + "english_style": "Cat Tree style", + "id": "afed5230-a76a-4709-be26-30040f2a9418", + "image": "image95.jpeg" + }, { + "chinese_style": "青鸟动漫风格", + "english_style": "Blue Bird Animation style", + "id": "06900981-ac49-4b03-b327-512f4b36bcbf", + "image": "image92.jpeg" + }, { + "chinese_style": "阿尤风格", + "english_style": "A You style", + "id": "82887dc9-eb51-4168-91e5-73467c1d9bf5", + "image": "image96.jpeg" + }, { + "chinese_style": "张小溪风格", + "english_style": "Zhang Xiaoxi style", + "id": "1d2901e9-c79c-42b7-843e-0a32be80f420", + "image": "image97.jpeg" + }, { + "chinese_style": "阿衰风格", + "english_style": "A Shuai style", + "id": "83e99b4d-0702-4cf8-a93e-af2a07f10858", + "image": "image99.jpeg" + }, { + "chinese_style": "丁墨风格", + "english_style": "Ding Mo style", + "id": "193a8cb3-d9a7-4f42-9c2f-7c538d45e795", + "image": "image100.jpeg" + }, { + "chinese_style": "老夫子风格", + "english_style": "Old Master style", + "id": "0eab7213-51fe-42cb-9330-c95b0d991d5b", + "image": "image98.jpeg" + }], + "id": "ac972ea7-e2db-48be-9b66-1d914b059b77" + }, { + "sheet": 6, + "name": "都市漫画", + "subStyle": [{ + "chinese_style": "现代都市生活", + "english_style": "Modern city life", + "id": "10d307a4-50ad-4919-afaf-754a9570a7ad", + "image": "image105.jpeg" + }, { + "chinese_style": "职场奋斗", + "english_style": "Workplace struggles", + "id": "79b593b1-fe8c-4a94-a6d0-f2d160c3d005", + "image": "image101.jpeg" + }, { + "chinese_style": "青春校园", + "english_style": "Youthful school life", + "id": "c1d691e9-1211-492f-bebb-71e3106ff35b", + "image": "image102.jpeg" + }, { + "chinese_style": "浪漫爱情", + "english_style": "Romantic love story", + "id": "1b711f31-2e3b-423f-b27f-dba57b760e33", + "image": "image103.jpeg" + }, { + "chinese_style": "悬疑侦探", + "english_style": "Mystery and detective", + "id": "4352c2b1-5cf0-4654-995d-2658f668f6fb", + "image": "image106.jpeg" + }, { + "chinese_style": "超能力者", + "english_style": "Individuals with superpowers", + "id": "acb3a28e-2957-442e-ad47-6550d5af1a94", + "image": "image104.jpeg" + }, { + "chinese_style": "青春成长", + "english_style": "Coming of age", + "id": "31779554-fbea-447f-a9f7-57cdf5aefffd", + "image": "image107.jpeg" + }, { + "chinese_style": "日常生活", + "english_style": "Slice of life", + "id": "4688a2b4-d1e7-4bff-9d9e-e7c740bd0269", + "image": "image108.jpeg" + }, { + "chinese_style": "都市异闻", + "english_style": "Urban legends and folklore", + "id": "0bbec8ab-4e11-430c-a857-1b1693d1ca31", + "image": "image112.jpeg" + }, { + "chinese_style": "时尚潮流", + "english_style": "Fashion and trends", + "id": "59610aa3-1cb0-498e-a701-9ed0456085a6", + "image": "image110.jpeg" + }, { + "chinese_style": "社交网络", + "english_style": "Social media and relationships", + "id": "74549157-8829-45b4-a608-b9752dfcb84f", + "image": "image111.jpeg" + }, { + "chinese_style": "都市奇幻", + "english_style": "Urban fantasy", + "id": "235b4431-f310-4dd0-a6dc-f42cbb7ddf29", + "image": "image109.jpeg" + }], + "id": "c9d2846d-c8c0-40b0-ad9e-ee882aa6efcf" + }, { + "sheet": 7, + "name": "悬疑故事画风", + "subStyle": [{ + "chinese_style": "悬疑恐怖故事", + "english_style": "Suspenseful horror stories", + "id": "97dc5f98-c241-43c8-a918-ab9788b5e982", + "image": "image119.jpeg" + }, { + "chinese_style": "古堡探险", + "english_style": "Castle exploration", + "id": "e8370048-ee70-4664-8b91-a50fee0f93f5", + "image": "image117.jpeg" + }, { + "chinese_style": "失踪之谜", + "english_style": "Mystery of disappearance", + "id": "6145e00c-f5ce-4f4d-97ff-91939c26f92e", + "image": "image115.jpeg" + }, { + "chinese_style": "诡异事件调查", + "english_style": "Investigation of eerie events", + "id": "cd6b74f2-6599-4bd9-9282-84fabfa0e558", + "image": "image113.jpeg" + }, { + "chinese_style": "禁忌解密", + "english_style": "Forbidden decryption", + "id": "b4673555-6dd6-4a7c-95ac-f728ab587fd7", + "image": "image118.jpeg" + }, { + "chinese_style": "幽灵传说", + "english_style": "Ghost legends", + "id": "5d4ace6c-476a-4ae8-a621-ece0dd59c831", + "image": "image120.jpeg" + }, { + "chinese_style": "恐怖短片", + "english_style": "Horror short films", + "id": "9191e13c-2add-41e9-a68f-cee5828c6b55", + "image": "image116.jpeg" + }, { + "chinese_style": "神秘案件破解", + "english_style": "Solving mysterious cases", + "id": "b132999e-3bf5-4828-a963-8f83892f8c40", + "image": "image114.jpeg" + }, { + "chinese_style": "阴谋追踪", + "english_style": "Conspiracy tracking", + "id": "79b40a23-05f4-4915-aa6a-be916e471699", + "image": "image121.jpeg" + }], + "id": "7e83b352-ae2f-4617-91a4-ad10ebc7dd13" + }, { + "sheet": 8, + "name": "3D动画", + "subStyle": [{ + "chinese_style": "皮克斯电影", + "english_style": "Pixar Movie Style", + "id": "2e65894e-6d8b-475e-a93b-f93929860eb3", + "image": "image129.jpeg" + }, { + "chinese_style": "梦工厂电影风格", + "english_style": "Dream Factory Movie Style", + "id": "c4df479b-49fc-49b9-a24c-f901056774e2", + "image": "image130.jpeg" + }, { + "chinese_style": "迪士尼", + "english_style": "Disney", + "id": "9de96904-a2e6-4506-9a5d-be5bd79c9df4", + "image": "image126.jpeg" + }, { + "chinese_style": "哥伦比亚电影公司", + "english_style": "Columbia Pictures", + "id": "0836e43b-0cc6-49f6-894e-e5ed4205c192", + "image": "image131.jpeg" + }, { + "chinese_style": "索尼动画", + "english_style": "Sony Pictures Animation", + "id": "1773b5a6-6109-4bbe-8213-185559689d81", + "image": "image127.jpeg" + }, { + "chinese_style": "蓝天工作室", + "english_style": "Blue Sky Studios", + "id": "ed7dfdd1-6775-4ecb-9110-eb0ac26cd122", + "image": "image132.jpeg" + }, { + "chinese_style": "卡通网络动画", + "english_style": "Cartoon Network Studios", + "id": "37dd259a-1f42-403f-ad36-66e497bdf6e4", + "image": "image128.jpeg" + }, { + "chinese_style": "漫威动画", + "english_style": "Marvel Animation", + "id": "f4317d2a-e827-4da1-a158-26e33812ea89", + "image": "image133.jpeg" + }, { + "chinese_style": "华纳兄弟动画", + "english_style": "Warner Bros. Animation", + "id": "7f6f85c5-18a7-451a-ae5e-f911331a192a", + "image": "image141.jpeg" + }, { + "chinese_style": "环球影业动画", + "english_style": "Universal Pictures Animation", + "id": "90944358-bc96-4bc9-ad59-373365015725", + "image": "image134.jpeg" + }, { + "chinese_style": "20世纪福克斯动画", + "english_style": "20th Century Fox Animation", + "id": "e3c44ec7-cda7-415e-83fc-fde7b1cf948d", + "image": "image140.jpeg" + }, { + "chinese_style": "派拉蒙动画", + "english_style": "Paramount Animation", + "id": "b4353dab-6bd4-419b-9ccd-5f0c9352690e", + "image": "image135.jpeg" + }, { + "chinese_style": "米高梅动画", + "english_style": "Metro-Goldwyn-Mayer Animation", + "id": "8efe38ae-0b66-4441-b394-c63fc144551e", + "image": "image137.jpeg" + }, { + "chinese_style": "乐高影业", + "english_style": "LEGO Animation", + "id": "6caaddde-97fe-405a-8655-61e12d0434c1", + "image": "image138.jpeg" + }, { + "chinese_style": "迪士尼电视动画", + "english_style": "Disney Television Animation", + "id": "f0eb3c60-94ec-44de-8099-7c6018c454a7", + "image": "image139.jpeg" + }, { + "chinese_style": "尼克儿童动画", + "english_style": "Nickelodeon Animation Studio", + "id": "6174cf18-7114-43f0-b139-1db5fd2ad9bb", + "image": "image136.jpeg" + }, { + "chinese_style": "奈飞动画", + "english_style": "Netflix Animation", + "id": "0df4834b-8867-42b3-b680-80c169ba904e", + "image": "image123.jpeg" + }, { + "chinese_style": "华纳动画组", + "english_style": "Warner Animation Group", + "id": "80406a8b-9a23-4d35-b25e-a8984eb5581c", + "image": "image124.jpeg" + }, { + "chinese_style": "索尼娱乐动画", + "english_style": "Sony Entertainment Animation", + "id": "95f8555f-8615-4484-953b-27f14890b219", + "image": "image122.jpeg" + }, { + "chinese_style": "蓝宝儿动画", + "english_style": "Lionsgate Animation", + "id": "5c4a4871-753a-4825-bc45-93d66e97037c", + "image": "image125.jpeg" + }], + "id": "507a1001-efab-4f23-ba0a-e1b6fc65732a" + }, { + "sheet": 9, + "name": "概念艺术", + "subStyle": [{ + "chinese_style": "幻想题材", + "english_style": "Fantasy theme", + "id": "a0586d4b-5add-436f-aa74-74559f66a000", + "image": "image146.jpeg" + }, { + "chinese_style": "科幻题材", + "english_style": "Science fiction theme", + "id": "939ef719-0785-45ec-8a26-a1e56a740790", + "image": "image142.jpeg" + }, { + "chinese_style": "赛博朋克", + "english_style": "Cyberpunk style", + "id": "f488da0b-c5a4-465e-815e-8f8034ae4394", + "image": "image147.jpeg" + }, { + "chinese_style": "蒸汽朋克", + "english_style": "Steampunk style", + "id": "61d188e6-7f5f-469e-bd30-50f810b1285a", + "image": "image143.jpeg" + }, { + "chinese_style": "超自然现象", + "english_style": "Supernatural phenomena", + "id": "381ec4b4-2bf7-4043-beda-aa0fd65520cd", + "image": "image148.jpeg" + }, { + "chinese_style": "神话传说", + "english_style": "Mythology and legends", + "id": "d554974b-d1c5-47d3-8acc-e71911325360", + "image": "image149.jpeg" + }, { + "chinese_style": "魔法与咒语", + "english_style": "Magic and spells", + "id": "0b505a81-36fd-454c-8ccc-285be256896b", + "image": "image144.jpeg" + }, { + "chinese_style": "幻想生物", + "english_style": "Fantasy creatures", + "id": "a0bcefce-c94d-47b3-bbd5-4d7b6b9cdd01", + "image": "image145.jpeg" + }, { + "chinese_style": "历史重现", + "english_style": "Historical reenactment", + "id": "169249c5-dbf3-4ce8-be7f-47237c8535b2", + "image": "image150.jpeg" + }, { + "chinese_style": "未来都市", + "english_style": "Futuristic cityscape", + "id": "2d0eec27-4bab-42f1-9d8b-7909df82c709", + "image": "image152.jpeg" + }, { + "chinese_style": "末日废土", + "english_style": "Post-apocalyptic wasteland", + "id": "ffc43253-b1a4-4f4a-a5a6-d8b9e62c3208", + "image": "image153.jpeg" + }, { + "chinese_style": "异星世界", + "english_style": "Alien world", + "id": "8b7b821a-7f91-437a-8af9-4841f8a24517", + "image": "image151.jpeg" + }], + "id": "6459007e-cb61-4933-b42e-e2ea19ce1f03" + }, { + "sheet": 10, + "name": "新日本动漫风", + "subStyle": [{ + "chinese_style": "《刀剑神域》", + "english_style": "Sword Art Online style, fantasy and adventure, Kawahara Reki", + "id": "d2048c30-56ad-44be-bdf7-6e04a690c310", + "image": "image163.jpeg" + }, { + "chinese_style": "《东京食尸鬼》", + "english_style": "Sui Ishida style", + "id": "e22b50f6-f0c4-4cf7-97b2-084990537cf0", + "image": "image160.jpeg" + }, { + "chinese_style": "《命运之夜》", + "english_style": "Type-Moon style", + "id": "b97c9b77-c423-41b0-8c80-e19c4fe504ba", + "image": "image161.jpeg" + }, { + "chinese_style": "《狼与香辛料》", + "english_style": "Isuna Hasekura style", + "id": "670a7131-915f-4959-a020-3dd1e3ae1f69", + "image": "image158.jpeg" + }, { + "chinese_style": "《鬼灭之刃》", + "english_style": "Koyoharu Gotouge style", + "id": "907db0cb-24ed-457e-a0c0-c4067184b608", + "image": "image159.jpeg" + }, { + "chinese_style": "《名侦探柯南》", + "english_style": "Gosho Aoyama style", + "id": "3cff985d-2b9c-4d52-b373-adc4a415d487", + "image": "image162.jpeg" + }, { + "chinese_style": "《七原罪》", + "english_style": "Nakaba Suzuki style", + "id": "8d8ca7fc-7d78-4240-a300-274dbbf299cb", + "image": "image164.jpeg" + }, { + "chinese_style": "《妖怪手表》", + "english_style": "Level-5 style", + "id": "0569520e-cc54-4fb8-8f7c-ac7102c557e7", + "image": "image157.jpeg" + }, { + "chinese_style": "《灼眼的夏娜》", + "english_style": "Yashichiro Takahashi style", + "id": "899f56d0-67be-4546-a373-04e6648299ef", + "image": "image165.jpeg" + }, { + "chinese_style": "《命运石之门》", + "english_style": "Chiyomaru Shikura and Nitroplus style", + "id": "b0c30ddf-a77b-48f8-bdfe-d29f94ac7902", + "image": "image166.jpeg" + }, { + "chinese_style": "《化物语》", + "english_style": "Nisio Isin and VOFAN style", + "id": "1d50bf91-22b7-4efa-a5b4-1cce44cb82be", + "image": "image167.jpeg" + }, { + "chinese_style": "《未来日记》", + "english_style": "Sakae Esunostyle style", + "id": "b5aadac7-df6e-44fd-b953-9e83f8bef4b8", + "image": "image169.jpeg" + }, { + "chinese_style": "《Angel Beats!》", + "english_style": "Jun Maeda and Na-Ga style", + "id": "85202d85-4cfc-4439-83d5-4504836905f2", + "image": "image168.jpeg" + }, { + "chinese_style": "《Fate/Zero》", + "english_style": "Gen Urobuchi and Takashi Takeuchi style", + "id": "d5e1f5ef-bb4a-4e40-a51b-bd2045d609b7", + "image": "image172.jpeg" + }, { + "chinese_style": "《Re:从零开始的异世界生活》", + "english_style": "Tappei Nagatsuki and Shinichirou Otsuka style", + "id": "f821ed49-c12f-4f87-b81f-58424610ccd1", + "image": "image170.jpeg" + }, { + "chinese_style": "《OVERLORD》", + "english_style": "Kugane Maruyama and so-bin style", + "id": "1977e489-6693-49a5-ade6-72769a4fde00", + "image": "image171.jpeg" + }, { + "chinese_style": "《约会大作战》", + "english_style": "Koushi Tachibana and Tsunako style", + "id": "e7ca9f27-6937-4100-96ca-706d7efa49ec", + "image": "image155.jpeg" + }, { + "chinese_style": "《Re:CREATORS》", + "english_style": "Rei Hiroe style", + "id": "6acc66f5-79f9-40b3-abb0-6435da43c73b", + "image": "image156.jpeg" + }, { + "chinese_style": "《关于我转生变成史莱姆这档事》", + "english_style": "Rimuru Tempest style", + "id": "1ac9cc4a-f1bb-40ae-a76a-6fd593c7bb04", + "image": "image154.jpeg" + }], + "id": "14c7f9d5-32b8-409b-ad4c-f7217fa3defd" + }, { + "sheet": 11, + "name": "少年日本动漫风", + "subStyle": [{ + "chinese_style": "《Another》", + "english_style": "Yukito Ayatsuji and Hiro Kiyohara style", + "id": "d2329e3e-e8e5-4a95-82d7-09fda8a3f3cb", + "image": "image176.jpeg" + }, { + "chinese_style": "《尸体派对》", + "english_style": "Team GrisGris style", + "id": "436251be-eb1a-4825-9565-a2f4d7201632", + "image": "image177.jpeg" + }, { + "chinese_style": "《妖精森林的小不点》", + "english_style": "Takuto Kashiki style", + "id": "85196b76-ffd9-443d-9827-d6b1b5dd9752", + "image": "image178.jpeg" + }, { + "chinese_style": "《怪谈新耳袋》", + "english_style": "Kyouko Hikawa style", + "id": "447a9b2e-4f3c-47d5-acd6-a9e893d35614", + "image": "image174.jpeg" + }, { + "chinese_style": "《地缚少年花子君》", + "english_style": "Kouji Seo style", + "id": "0021c2d2-8f70-4536-9d88-07f287cb419f", + "image": "image179.jpeg" + }, { + "chinese_style": "《彼岸岛》", + "english_style": "Koji Matsumoto style", + "id": "9d884c85-c7c1-447c-96a6-a05416b5d1e7", + "image": "image180.jpeg" + }, { + "chinese_style": "《龙珠》", + "english_style": "Akira Toriyama style", + "id": "c8c3784a-aad1-4fbd-aa0a-ca18af2efa31", + "image": "image175.jpeg" + }, { + "chinese_style": "《海贼王》", + "english_style": "Eiichiro Oda style", + "id": "1ad0e6e6-4ab0-4669-a932-7ecaeef1090d", + "image": "image173.jpeg" + }, { + "chinese_style": "《火影忍者》", + "english_style": "Masashi Kishimoto style", + "id": "5a198a66-9e62-48c4-aaff-8be6586249be", + "image": "image198.jpeg" + }, { + "chinese_style": "《死神》", + "english_style": "Tite Kubo style", + "id": "cc514c8c-2194-403e-ae57-9733a455f3f2", + "image": "image192.jpeg" + }, { + "chinese_style": "《进击的巨人》", + "english_style": "Hajime Isayama style", + "id": "8c356863-e16d-4a4c-a154-1e4d3836aed9", + "image": "image199.jpeg" + }, { + "chinese_style": "《银魂》", + "english_style": "Hideaki Sorachi style", + "id": "4b98130b-ca33-468a-828e-36461e9f4da4", + "image": "image193.jpeg" + }, { + "chinese_style": "《全职猎人》", + "english_style": "Yoshihiro Togashi style", + "id": "22f84eff-c3d9-4c39-87df-8ab5b8908a78", + "image": "image196.jpeg" + }, { + "chinese_style": "《柯南》", + "english_style": "Gosho Aoyama style", + "id": "00abd3b8-d038-4cb0-bc8a-cf24b1c31f18", + "image": "image197.jpeg" + }, { + "chinese_style": "《妖精的尾巴》", + "english_style": "Hiro Mashima style", + "id": "41fe2942-2a96-4b84-ae9c-93b17d4b71c2", + "image": "image194.jpeg" + }, { + "chinese_style": "《黑子的篮球》", + "english_style": "Tadatoshi Fujimaki style", + "id": "96eb6f9d-9aca-40de-add5-6d27f0768660", + "image": "image195.jpeg" + }, { + "chinese_style": "《我的英雄学院》", + "english_style": "Kohei Horikoshi style", + "id": "3aafb780-ac7f-4e83-b1ae-2145026c24a8", + "image": "image201.jpeg" + }, { + "chinese_style": "《灌篮高手》", + "english_style": "Takehiko Inoue style", + "id": "97cf6531-e726-4e3c-b97f-64e6f0528634", + "image": "image200.jpeg" + }, { + "chinese_style": "《排球少年》", + "english_style": "Haruichi Furudate style", + "id": "c6f8d9e7-3d06-42a1-b255-989a2c711d90", + "image": "image204.jpeg" + }, { + "chinese_style": "《钻石王牌》", + "english_style": "Yuji Terajima style", + "id": "59f88205-0bce-4deb-b09c-f2db188e52ff", + "image": "image205.jpeg" + }, { + "chinese_style": "《浪客剑心》", + "english_style": "Nobuhiro Watsuki style", + "id": "73af468f-0b11-4d2e-9f45-142d4248ffe9", + "image": "image206.jpeg" + }, { + "chinese_style": "《幽游白书》", + "english_style": "Yoshihiro Togashi style", + "id": "816e1234-4126-422b-83a9-af25303c721d", + "image": "image202.jpeg" + }, { + "chinese_style": "《城市猎人》", + "english_style": "Tsukasa Hojo style", + "id": "33900424-0e31-44af-b147-fdd916b1405d", + "image": "image203.jpeg" + }, { + "chinese_style": "《圣斗士星矢》", + "english_style": "Masami Kurumada style", + "id": "d780c5bc-4e54-43d9-8291-ed9fbc39bd5a", + "image": "image207.jpeg" + }, { + "chinese_style": "《铁臂阿童木》", + "english_style": "Osamu Tezuka style", + "id": "edb4c3fa-e4af-40f6-b97f-ab7326088b80", + "image": "image181.jpeg" + }, { + "chinese_style": "《东京爱情故事》", + "english_style": "Yuki Fujimoto style", + "id": "db55ec39-a9bf-47aa-813f-ab3be24254d6", + "image": "image185.jpeg" + }, { + "chinese_style": "《深夜食堂》", + "english_style": "Yaro Abe style", + "id": "95d69b5e-19ec-47ce-92cd-7853cf3aa023", + "image": "image186.jpeg" + }, { + "chinese_style": "《恋爱暴君》", + "english_style": "Megane Mihoshi style", + "id": "1cf0fa67-dc9e-41d8-84ca-184b4e9e54ba", + "image": "image188.jpeg" + }, { + "chinese_style": "《请回答1988》", + "english_style": "Ilkwon Ha style", + "id": "fcbeee97-34cd-4dcb-9353-547e1d15b3ca", + "image": "image182.jpeg" + }, { + "chinese_style": "《NANA》", + "english_style": "Ai Yazawa style", + "id": "5c275a98-11bc-4cfe-95ee-f29829f2db45", + "image": "image183.jpeg" + }, { + "chinese_style": "《蜂蜜与四叶草》", + "english_style": "Chica Umino style", + "id": "0be84542-7362-45cc-b2e0-8203fbf9a628", + "image": "image184.jpeg" + }, { + "chinese_style": "《东京塔》", + "english_style": "Lily Franky style", + "id": "b70b64b2-ff97-4fcd-b5f7-aa0b8727ce6b", + "image": "image187.jpeg" + }, { + "chinese_style": "《工作狂》", + "english_style": "Anno Moyoco style", + "id": "c2b9a3ce-c33f-4c16-8d68-db3c36da18b5", + "image": "image213.jpeg" + }, { + "chinese_style": "《单身男女》", + "english_style": "Rakuda Torino style", + "id": "ac5fb0d0-e607-4c7f-ad78-b3759ec3c994", + "image": "image208.jpeg" + }, { + "chinese_style": "《恋爱情结》", + "english_style": "Aya Nakahara style", + "id": "bba7a88f-cd93-49f0-8cc7-977b3fd5422c", + "image": "image214.jpeg" + }, { + "chinese_style": "《白领羽田》", + "english_style": "Akiko Higashimura style", + "id": "d3261949-efa2-4066-8d39-e2061120bb71", + "image": "image215.jpeg" + }, { + "chinese_style": "《东京女子图鉴》", + "english_style": "Akiko Higashimura style", + "id": "0855c327-3127-4377-9bd5-1d12ff9ae684", + "image": "image211.jpeg" + }, { + "chinese_style": "《重版出来!》", + "english_style": "Eiji Nonaka style", + "id": "22f75192-b891-4562-8662-53650f52bf4f", + "image": "image210.jpeg" + }, { + "chinese_style": "《逃避虽可耻但有用》", + "english_style": "Tsunami Umino style", + "id": "9bf58d40-ab11-49b8-8700-8db9067e7369", + "image": "image209.jpeg" + }, { + "chinese_style": "《下辈子再好好过》", + "english_style": "Kazuto Tatsukawa style", + "id": "208444d2-c17c-40f8-93e2-2365676fb900", + "image": "image212.jpeg" + }, { + "chinese_style": "《无法成为野兽的我们》", + "english_style": "Ryoko Fukuyama style", + "id": "39109010-4ce4-4b72-a200-883b8feb62cf", + "image": "image191.jpeg" + }, { + "chinese_style": "《我不是结不了婚,只是不想》", + "english_style": "Ako Shimaki style", + "id": "1be7fe21-d5e2-4a90-b5aa-8df219b55810", + "image": "image190.jpeg" + }, { + "chinese_style": "《恋爱小人们》", + "english_style": "Musawo style", + "id": "3455d950-4d11-426d-891a-b0453606df34", + "image": "image189.jpeg" + }], + "id": "6ab67e20-2fbe-449b-b371-5f411c4c3892" + }, { + "sheet": 12, + "name": "恐怖日本动漫风", + "subStyle": [{ + "chinese_style": "《富江》", + "english_style": "Junji Ito style", + "id": "3bc00c50-04ff-41c1-8104-c31680b469d8", + "image": "image218.jpeg" + }, { + "chinese_style": "《寄生兽》", + "english_style": "Hitoshi Iwaaki style", + "id": "64d9204c-296d-4b09-9b50-36d89268d7fa", + "image": "image220.jpeg" + }, { + "chinese_style": "《漩涡》", + "english_style": "Kyo Shirodaira and Eita Mizuno style", + "id": "0522f21f-9094-4a95-9648-5a9f574d406b", + "image": "image222.jpeg" + }, { + "chinese_style": "《死亡笔记》", + "english_style": "Tsugumi Ohba and Takeshi Obata style", + "id": "bde5b7bc-37ad-4a59-829d-21f26c222b29", + "image": "image219.jpeg" + }, { + "chinese_style": "《怪医黑杰克》", + "english_style": "Osamu Tezuka style", + "id": "78cc9352-b68a-48d3-a32e-ebf13de78b3c", + "image": "image221.jpeg" + }, { + "chinese_style": "《学园默示录》", + "english_style": "Daisuke Sato and Shouji Sato style", + "id": "5e34a2d4-4247-4feb-a369-eaf781668171", + "image": "image217.jpeg" + }, { + "chinese_style": "《鬼灯的冷彻》", + "english_style": "Natsumi Eguchi style", + "id": "854eb4d2-fdf1-40cf-a668-2da4dd0c103a", + "image": "image216.jpeg" + }, { + "chinese_style": "《僵尸借贷》", + "english_style": "Peach-Pit style", + "id": "a98ad1ff-0e25-4ac6-872e-1be6dacfb99e", + "image": "image223.jpeg" + }, { + "chinese_style": "《东京喰种》", + "english_style": "Sui Ishida style", + "id": "2d3b1c15-4ff6-4843-9dec-4b5f16b3d1c6", + "image": "image224.jpeg" + }], + "id": "990502bb-b673-4138-9af6-b2e483acdbc0" + }, { + "sheet": 13, + "name": "机甲日本动漫风", + "subStyle": [{ + "chinese_style": "《机动战士高达》", + "english_style": "Yoshiyuki Tomino style", + "id": "d7f9add9-5dbe-4b9a-ac5a-3905be18c73d", + "image": "image231.jpeg" + }, { + "chinese_style": "《新世纪福音战士》", + "english_style": "Hideaki Anno and Yoshiyuki Sadamoto style", + "id": "138a6ff3-6562-4410-9d2e-aa849f512f98", + "image": "image237.jpeg" + }, { + "chinese_style": "《钢弹0080:口袋中的战争》", + "english_style": "Yoshiyuki Tomino and Takashi Imanishi style", + "id": "350a64e1-8e2b-4f5b-b8d9-a0af5a6454ec", + "image": "image232.jpeg" + }, { + "chinese_style": "《全金属狂潮》", + "english_style": "Shoji Kawamori style", + "id": "b9f034b8-4146-429a-83a6-dc76bacee682", + "image": "image230.jpeg" + }, { + "chinese_style": "《机动警察》", + "english_style": "Kunio Okawara style", + "id": "55cd3098-7c01-406b-ae0e-1964b28d0925", + "image": "image233.jpeg" + }, { + "chinese_style": "《超时空要塞》", + "english_style": "Shoji Kawamori style", + "id": "d2e08101-5654-4edb-a0d3-d65b54a366e5", + "image": "image236.jpeg" + }, { + "chinese_style": "《铁拳小子》", + "english_style": "Naoto Tsushima style", + "id": "8ef6433d-c274-4add-a74d-6b9ac9fff81b", + "image": "image234.jpeg" + }, { + "chinese_style": "《装甲骑兵》", + "english_style": "Ryousuke Takahashi style", + "id": "c9444ff5-a319-4e3f-96b6-4cad9f5d7736", + "image": "image235.jpeg" + }, { + "chinese_style": "《机动战士高达SEED》", + "english_style": "Yoshiyuki Tomino and Kenji Oguro style", + "id": "898c1979-99b2-46a7-b581-8272dd37cdba", + "image": "image227.jpeg" + }, { + "chinese_style": "《交响诗篇》", + "english_style": "Shinichirou Watanabe and Yasuhiro Nightow style", + "id": "2d420511-63f9-4c77-9e06-efab1df5b815", + "image": "image229.jpeg" + }, { + "chinese_style": "《天元突破》", + "english_style": "Kimiyoshi Yasuda and Hiroyuki Imaishi style", + "id": "c6cb088d-2d9f-45c1-a38f-5a69545c1c5d", + "image": "image225.jpeg" + }, { + "chinese_style": "《机动战士高达00》", + "english_style": "Yoshiyuki Tomino and Kenji Oguro style", + "id": "6ab2f65f-4f70-4c57-b4f9-99d66fabe4df", + "image": "image226.jpeg" + }, { + "chinese_style": "《ZEGAPAIN》", + "english_style": "Kouichi Chigira and Shinji Aramaki style", + "id": "8238df2e-c1be-4849-9684-1c217fe51b4c", + "image": "image228.jpeg" + }], + "id": "e646e2a4-a467-4506-8838-316d45cf5120" + }, { + "sheet": 14, + "name": "校园日本动漫风", + "subStyle": [{ + "chinese_style": "《青春猪头少年不会梦到兔女郎学姐》", + "english_style": "Daisuke Aizawa style", + "id": "a4bcfe18-7e85-4ebf-8a89-bc0f946e6dd5", + "image": "image242.jpeg" + }, { + "chinese_style": "《我的青春恋爱物语果然有问题》", + "english_style": "Hajime Kamoshida style", + "id": "dfebd4b2-657c-4c46-9319-c3834fde01d5", + "image": "image240.jpeg" + }, { + "chinese_style": "《某科学的超电磁炮》", + "english_style": "Kazuma Kamachi and Motoi Fushimi style", + "id": "f32174cb-1d1a-4cd6-bb14-6bcef9bf068e", + "image": "image243.jpeg" + }, { + "chinese_style": "《干物妹!小埋》", + "english_style": "Sakura Ikezuki style", + "id": "f2ca5f57-e759-4c9a-aa20-39c6862e5892", + "image": "image244.jpeg" + }, { + "chinese_style": "《四月是你的谎言》", + "english_style": "Kanade Yoko style", + "id": "0a07af72-fd77-468d-b667-5879048eb289", + "image": "image238.jpeg" + }, { + "chinese_style": "《Free!》", + "english_style": "Kouji Oji style", + "id": "4745b1fa-466e-4a25-8aa8-1017a55f6a3f", + "image": "image239.jpeg" + }, { + "chinese_style": "《樱花庄的宠物女孩》", + "english_style": "Hiroshi Kumakura and Tatsuhiko Takimoto style", + "id": "b7f2b370-2660-4653-86f1-e1b1bc959c35", + "image": "image245.jpeg" + }, { + "chinese_style": "《从零开始的异世界生活》", + "english_style": "Nagatsuki Tappei style", + "id": "6a8e1708-835b-4266-8546-cea85db6a7a1", + "image": "image241.jpeg" + }, { + "chinese_style": "《冰菓》", + "english_style": "Hyouka Fujino style", + "id": "423eedf0-0adb-4738-bd8b-a1d1a3b41bae", + "image": "image246.jpeg" + }, { + "chinese_style": "《Love Lab》", + "english_style": "Miki Yoshikawa style", + "id": "8cd108ea-2276-4b2b-9fb9-0078e1b28292", + "image": "image248.jpeg" + }, { + "chinese_style": "《月刊少女野崎君》", + "english_style": "Hima Katsura style", + "id": "57e7d3b8-640b-4ab4-a2c3-708af855dd96", + "image": "image250.jpeg" + }, { + "chinese_style": "《Charlotte》", + "english_style": "Jun Maeda style", + "id": "bd564191-e6f7-459d-8b8e-9df837f09a8a", + "image": "image249.jpeg" + }, { + "chinese_style": "《K-On!》", + "english_style": "Manga Mitogawa and Koji Oji style", + "id": "6c2ded36-ccd4-4ffd-972e-2587737efea6", + "image": "image247.jpeg" + }], + "id": "fbba8ae8-502c-4ae5-856c-ffb70efd852d" + }, { + "sheet": 15, + "name": "传统日本动漫风", + "subStyle": [{ + "chinese_style": "《红辣椒》", + "english_style": "Satoshi Kon style", + "id": "7c2f0bea-67fb-42b1-b02c-e9db30153055", + "image": "image260.jpeg" + }, { + "chinese_style": "《时之歌》", + "english_style": "Makoto Shinkai style", + "id": "997b348f-aef8-4e3a-973c-d93153cbe8c5", + "image": "image263.jpeg" + }, { + "chinese_style": "《完美蓝》", + "english_style": "Mamoru Oshii style", + "id": "a1620fb5-2a77-47f5-9ca9-0245e3bbf278", + "image": "image261.jpeg" + }, { + "chinese_style": "《狼的孩子雨和雪》", + "english_style": "Mamoru Hosoda style", + "id": "4427cac2-4f4a-490b-990f-cf6d46c9ba3a", + "image": "image264.jpeg" + }, { + "chinese_style": "《夏日大作战》", + "english_style": "Kunihiko Ikuhara style", + "id": "1e34a1d4-58cd-4b8c-ab61-b6724bbb053c", + "image": "image262.jpeg" + }, { + "chinese_style": "《未麻的部屋》", + "english_style": "Rintaro style", + "id": "cc689d92-8525-475a-90a4-f42d0adacfd2", + "image": "image265.jpeg" + }, { + "chinese_style": "《千年女优》", + "english_style": "Kon Satoshi style", + "id": "189a8d33-391c-4406-9f77-9811fc39429b", + "image": "image266.jpeg" + }, { + "chinese_style": "《虚空之旅》", + "english_style": "Katsuhiro Otomo style", + "id": "b65d8e8a-1ec1-46cf-a32b-8e16c6d4cada", + "image": "image267.jpeg" + }, { + "chinese_style": "《悬崖上的金鱼姬》", + "english_style": "Goro Miyazaki style", + "id": "fe069298-88d6-4ccd-8076-0af31aa1336c", + "image": "image273.jpeg" + }, { + "chinese_style": "《雪国列车》", + "english_style": "Yoshiaki Kawajiri style", + "id": "bf59ebda-e6df-47cc-9dde-f522b5145b58", + "image": "image270.jpeg" + }, { + "chinese_style": "《猎天使魔女》", + "english_style": "Yasuhito Kikuchi style", + "id": "72877d59-e763-4440-b41b-4826da6718c7", + "image": "image268.jpeg" + }, { + "chinese_style": "《猎魔人》", + "english_style": "Yoshiaki Kawajiri style", + "id": "dfbb0b74-a875-442f-9219-3aad3a66b2bb", + "image": "image274.jpeg" + }, { + "chinese_style": "《幽灵公主》", + "english_style": "Princess Mononoke style", + "id": "7458efbb-97fd-454f-b93f-85ac2e42c139", + "image": "image275.jpeg" + }, { + "chinese_style": "《百变狸猫》", + "english_style": "Pom Poko style", + "id": "0e6b6836-297b-4805-8f65-00e83693a1ae", + "image": "image271.jpeg" + }, { + "chinese_style": "《岁月的童话》", + "english_style": "Only Yesterday style", + "id": "7978dce5-aaa4-46d8-bf68-5b52758d6fa7", + "image": "image269.jpeg" + }, { + "chinese_style": "《我的邻居山田君》", + "english_style": "The Yamadas style", + "id": "c92165f2-00e8-4c06-b3e4-7531f145e3be", + "image": "image272.jpeg" + }, { + "chinese_style": "《猫的报恩》", + "english_style": "The Cat Returns style", + "id": "48aacb4a-501e-4fe6-8cb7-a2ad86657033", + "image": "image258.jpeg" + }, { + "chinese_style": "《借东西的小人阿莉埃蒂》", + "english_style": "Arrietty style", + "id": "48a38ff1-da64-496e-aec0-89c0dea12cc9", + "image": "image255.jpeg" + }, { + "chinese_style": "《起风了》", + "english_style": "The Wind Rises style", + "id": "5ae600ac-6797-4f11-b9e2-176856a1c23a", + "image": "image251.jpeg" + }, { + "chinese_style": "《辉夜姬物语》", + "english_style": "The Tale of The Princess Kaguya style", + "id": "b7ae0ca4-765e-4dda-9d79-63009b943afe", + "image": "image252.jpeg" + }, { + "chinese_style": "《地海传说》", + "english_style": "Tales from Earthsea style", + "id": "ba04d563-d7d5-453e-92d8-84b7dbb04828", + "image": "image253.jpeg" + }, { + "chinese_style": "《侧耳倾听》", + "english_style": "Whisper of the Heart style", + "id": "f3d6adc2-6c8d-4eeb-ac9e-4bc470099a87", + "image": "image254.jpeg" + }, { + "chinese_style": "《时光代理人》", + "english_style": "Link Click style", + "id": "1379ee57-77f0-44ea-ba0f-37d448cf2d86", + "image": "image257.jpeg" + }, { + "chinese_style": "《攻壳机动队》", + "english_style": "Ghost in the Shell style", + "id": "01da912f-f68a-4cff-aac8-5f7cdf945c0e", + "image": "image256.jpeg" + }, { + "chinese_style": "《宇宙战舰大和号》", + "english_style": "Space Battleship Yamato style", + "id": "c24de2c9-1dc7-4c9a-b0ff-7fed7a4f9b32", + "image": "image259.jpeg" + }], + "id": "a4bae3b0-7ca7-45b4-9a83-505e3407fd5e" + }, { + "sheet": 16, + "name": "国产动漫风", + "subStyle": [{ + "chinese_style": "《镖人》", + "english_style": "Biao Ren style", + "id": "12910c0e-1945-47d9-a1a4-0e13a5fa2616", + "image": "image283.jpeg" + }, { + "chinese_style": "《斗破苍穹》", + "english_style": "Battle Through the Heavens style", + "id": "f2d8e7f4-c4c6-497e-9a0d-cf7957e382dd", + "image": "image281.jpeg" + }, { + "chinese_style": "《雪中悍刀行》", + "english_style": "The Swordsman in the Rain style", + "id": "a863dda7-6be4-4c9c-b64a-ccb8561c89d0", + "image": "image287.jpeg" + }, { + "chinese_style": "《大主宰》", + "english_style": "The Great Ruler style", + "id": "bbbc22aa-d99f-4fa3-9f32-d02ff1bb140f", + "image": "image284.jpeg" + }, { + "chinese_style": "《秦时明月》", + "english_style": "The Legend of Qin style", + "id": "77a8e93f-bf9c-433a-9266-03b9b2bf7135", + "image": "image282.jpeg" + }, { + "chinese_style": "《天行九歌》", + "english_style": "Nine Songs style", + "id": "487c6c3d-fed2-43e7-87af-02736ad596b7", + "image": "image285.jpeg" + }, { + "chinese_style": "《画江湖之不良人》", + "english_style": "Hua Jianghu: The Bad Guys style", + "id": "dbc9edbb-72ad-4fc2-a0ae-fc146e0c5226", + "image": "image288.jpeg" + }, { + "chinese_style": "《白箱》", + "english_style": "Shirobako style", + "id": "67043ea7-f930-4144-b8de-6ad3d447e567", + "image": "image286.jpeg" + }, { + "chinese_style": "《百鬼屋》", + "english_style": "House of Hundred Ghosts style", + "id": "3f6b5402-3974-4fd8-83e7-ef88bdc4dad3", + "image": "image291.jpeg" + }, { + "chinese_style": "《端脑》", + "english_style": "Du Nao style", + "id": "dc7994f0-4318-4455-8f8d-e72554be17a9", + "image": "image292.jpeg" + }, { + "chinese_style": "《诛仙》", + "english_style": "Zhuxian style", + "id": "400a1638-0d7e-4a3b-a371-ec2ed1d27a11", + "image": "image294.jpeg" + }, { + "chinese_style": "《哪吒之魔童降世》", + "english_style": "Ne Zha style", + "id": "82517970-da4a-4f8b-aa90-84d84c09cbfb", + "image": "image295.jpeg" + }, { + "chinese_style": "《西游记》", + "english_style": "Journey to the West style", + "id": "3d898e60-ea86-4f20-90f2-f0c09c424b47", + "image": "image296.jpeg" + }, { + "chinese_style": "《封神纪》", + "english_style": "Fengshen Ji style", + "id": "25d49d46-9dc0-45ff-a704-dccdaded159f", + "image": "image289.jpeg" + }, { + "chinese_style": "《山海逆战》", + "english_style": "Shan Hai Ni Zhan style", + "id": "f5083376-cefc-40b3-a8d3-ad4cf3fad713", + "image": "image293.jpeg" + }, { + "chinese_style": "《百炼成神》", + "english_style": "Becoming a God style", + "id": "fd053b5e-1ce3-47bf-95e6-65a6caf739ec", + "image": "image290.jpeg" + }, { + "chinese_style": "《白蛇传》", + "english_style": "The Legend of White Snake style", + "id": "5cf1e3fd-9458-417c-bd7b-33d93a45958d", + "image": "image280.jpeg" + }, { + "chinese_style": "《妖神记》", + "english_style": "Chronicles of the Demon King style", + "id": "e6a1bdbe-8114-4393-a07b-080c8bbb3b1b", + "image": "image277.jpeg" + }, { + "chinese_style": "《镇魂街》", + "english_style": "Rakshasa Street style", + "id": "3dcaff26-29f4-43a1-8141-0ca108420d91", + "image": "image278.jpeg" + }, { + "chinese_style": "《斗罗大陆》", + "english_style": "Soul Land style", + "id": "c7303c09-1aa4-4156-9b21-3c63794d4e8e", + "image": "image276.jpeg" + }, { + "chinese_style": "《血族》", + "english_style": "Bloodline style", + "id": "02a2e278-4eb3-4384-a13a-80e1eef5b627", + "image": "image279.jpeg" + }], + "id": "fa957f58-129e-42cc-b80a-24859fc90789" + }, { + "sheet": 17, + "name": "电影风格", + "subStyle": [{ + "chinese_style": "黑白电影", + "english_style": "Black and white movies", + "id": "7bffd5d9-71e7-4443-99b7-d38cbe5853ee", + "image": "image309.jpeg" + }, { + "chinese_style": "科幻电影", + "english_style": "science fiction film", + "id": "f17c812e-aafd-4ac4-b6e4-36467f75c4e6", + "image": "image310.jpeg" + }, { + "chinese_style": "爱情电影", + "english_style": "romantic movies", + "id": "d2bac280-9bff-4582-a78e-b94a3f75950e", + "image": "image311.jpeg" + }, { + "chinese_style": "动作电影", + "english_style": "action movies", + "id": "a723ca3f-7f59-436b-b4aa-bd99f58bfe45", + "image": "image312.jpeg" + }, { + "chinese_style": "喜剧电影", + "english_style": "comedy movies", + "id": "1a39e88a-2e08-4adf-8859-76d7ac36f2fd", + "image": "image306.jpeg" + }, { + "chinese_style": "恐怖电影", + "english_style": "horror movies", + "id": "cafb6bde-4f43-4fbf-8bf4-9b9a2727c7bd", + "image": "image307.jpeg" + }, { + "chinese_style": "战争电影", + "english_style": "war movies", + "id": "64564b1d-69a2-45ff-b25e-3f073a45b76f", + "image": "image308.jpeg" + }, { + "chinese_style": "纪录片", + "english_style": "documentaries", + "id": "304e6b0f-1b30-4336-8f88-79b907d9592d", + "image": "image305.jpeg" + }, { + "chinese_style": "动画电影", + "english_style": "animated movies", + "id": "3ae766f0-a97b-4004-8a06-b5b8bd76f668", + "image": "image297.jpeg" + }, { + "chinese_style": "奇幻电影", + "english_style": "fantasy movies", + "id": "282b2144-8cf3-470e-9179-7f9419d12a1c", + "image": "image299.jpeg" + }, { + "chinese_style": "惊悚电影", + "english_style": "thriller movies", + "id": "ab55351f-3c55-4828-babc-a34e724d95a2", + "image": "image303.jpeg" + }, { + "chinese_style": "犯罪电影", + "english_style": "crime movies", + "id": "f95ea621-d040-47e5-b6e0-f6f326af1036", + "image": "image300.jpeg" + }, { + "chinese_style": "冒险电影", + "english_style": "adventure movies", + "id": "eb6ecf79-2d53-454b-8302-7cca5c9b591b", + "image": "image301.jpeg" + }, { + "chinese_style": "家庭电影", + "english_style": "family movies", + "id": "c2e2d144-8c87-4110-930b-fdfd41df9b30", + "image": "image302.jpeg" + }, { + "chinese_style": "历史剧", + "english_style": "historical dramas", + "id": "029cc87b-eeab-4f95-ac9f-425460ee9f08", + "image": "image298.jpeg" + }, { + "chinese_style": "音乐剧", + "english_style": "musical movies", + "id": "61993e49-68db-4be4-b8a9-908e1ac7b962", + "image": "image304.jpeg" + }, { + "chinese_style": "悬疑电影", + "english_style": "mystery movies", + "id": "98bf0ddc-4904-4576-9f93-db27363eee28", + "image": "image409.jpeg" + }, { + "chinese_style": "戏剧电影", + "english_style": "drama movies", + "id": "59885546-5b58-40c8-8202-ded895601539", + "image": "image410.jpeg" + }, { + "chinese_style": "运动电影", + "english_style": "sports movies", + "id": "42232865-7ffb-49e1-989b-efab01e44ac0", + "image": "image411.jpeg" + }], + "id": "5d5b2cfa-a417-4723-9931-a3abbac2b452" + }, { + "sheet": 18, + "name": "艺术风格", + "subStyle": [{ + "chinese_style": "幻想艺术风格", + "english_style": "Fantasy art style", + "id": "a7f0560f-fbaa-4fbe-abae-70401e6fedbe", + "image": "image333.jpeg" + }, { + "chinese_style": "复古漫画风格", + "english_style": "Retro comic style", + "id": "7fb47c08-d2e3-439d-9e5d-4a9e3886203e", + "image": "image338.jpeg" + }, { + "chinese_style": "抽象艺术风格", + "english_style": "Abstract art style", + "id": "a7e465c0-8c08-4407-928e-00ddcfc1e14d", + "image": "image331.jpeg" + }, { + "chinese_style": "极简主义风格", + "english_style": "Minimalist style", + "id": "2b4f5f05-9f9f-4605-8ea6-3e9f3e9390b7", + "image": "image335.jpeg" + }, { + "chinese_style": "涂鸦风格", + "english_style": "Graffiti style", + "id": "ca054eb1-ede6-48da-9832-46d2edb04020", + "image": "image336.jpeg" + }, { + "chinese_style": "浮世绘风格", + "english_style": "Ukiyo-e style", + "id": "d73397d8-6535-4a73-a6a8-2107c216c2ae", + "image": "image332.jpeg" + }, { + "chinese_style": "表现主义风格", + "english_style": "Expressionism style", + "id": "ef600238-917d-4bb2-a38d-6619dce4724d", + "image": "image337.jpeg" + }, { + "chinese_style": "超现实主义风格", + "english_style": "Surrealism style", + "id": "c4df7c3e-82b1-44dd-9c7a-6ce48c4c157d", + "image": "image334.jpeg" + }, { + "chinese_style": "装饰艺术风格", + "english_style": "Art Deco style", + "id": "33e5d594-dc86-4396-82d9-89544b356c69", + "image": "image341.jpeg" + }, { + "chinese_style": "未来主义风格", + "english_style": "Futurism style", + "id": "0a59d038-ff76-4575-aa38-616889b38361", + "image": "image344.jpeg" + }, { + "chinese_style": "像素艺术风格", + "english_style": "Pixel art style", + "id": "57e62d07-2d1a-450a-a16e-6641b64c9c07", + "image": "image346.jpeg" + }, { + "chinese_style": "漫画现实主义风格", + "english_style": "Comic realism style", + "id": "6f96a537-a952-4c98-adb5-02ca82025479", + "image": "image340.jpeg" + }, { + "chinese_style": "卡通渲染风格", + "english_style": "Cartoon rendering style", + "id": "0957f80e-2c3e-472a-8f05-263ff831c8ae", + "image": "image339.jpeg" + }, { + "chinese_style": "哥特式漫画风格", + "english_style": "Gothic comic style", + "id": "5ab38c3b-a63c-4852-85d0-5cde07fc900a", + "image": "image345.jpeg" + }, { + "chinese_style": "新古典主义风格", + "english_style": "Neoclassicism style", + "id": "ce5ee6e7-01d2-42b9-85aa-47b4503cfabc", + "image": "image342.jpeg" + }, { + "chinese_style": "浪漫主义风格", + "english_style": "Romanticism style", + "id": "38d106e0-2272-4964-8f83-84b9808d8d1d", + "image": "image343.jpeg" + }, { + "chinese_style": "街头艺术风格", + "english_style": "Street art style", + "id": "ef0a8d87-ba4f-48df-b2f9-11345eb75c10", + "image": "image319.jpeg" + }, { + "chinese_style": "概念艺术风格", + "english_style": "Concept art style", + "id": "347d3e35-5a70-451f-b6cf-58aaf339fc34", + "image": "image317.jpeg" + }, { + "chinese_style": "幻想漫画风格", + "english_style": "Fantasy comic style", + "id": "fdda76a9-25a5-47fa-9570-ec12c6c744c8", + "image": "image316.jpeg" + }, { + "chinese_style": "科幻风格", + "english_style": "Science fiction style", + "id": "8e26e6b3-c109-43c0-ae58-7f68ff050a88", + "image": "image320.jpeg" + }, { + "chinese_style": "西部风格", + "english_style": "Western style", + "id": "b23cf1e2-3449-48ae-b71d-160f081a7202", + "image": "image314.jpeg" + }, { + "chinese_style": "儿童插画风格", + "english_style": "Children's illustration style", + "id": "4572cc54-54e1-41b5-9d63-0b8e53a6bdb6", + "image": "image318.jpeg" + }, { + "chinese_style": "青春漫画风格", + "english_style": "Youth comic style", + "id": "06ccb7d6-d722-418e-ab6f-77f72c048814", + "image": "image315.jpeg" + }, { + "chinese_style": "历史题材漫画风格", + "english_style": "Historical comic style", + "id": "af31cb40-2f6a-486d-9e7b-667837360b15", + "image": "image313.jpeg" + }, { + "chinese_style": "民间艺术风格", + "english_style": "Folk art style", + "id": "750cca85-be64-42c4-b993-b53c414fd01c", + "image": "image325.jpeg" + }, { + "chinese_style": "艺术新潮流风格", + "english_style": "Art Nouveau style", + "id": "755ac85b-8c53-4674-a2ca-3ca86c588814", + "image": "image322.jpeg" + }, { + "chinese_style": "艺术装饰风格", + "english_style": "Art Deco style", + "id": "b20fc215-8631-4334-a345-27de5fbe83b5", + "image": "image328.jpeg" + }, { + "chinese_style": "艺术与工艺风格", + "english_style": "Arts and Crafts style", + "id": "b7bbf919-b6dc-4074-a42e-986b317dc43b", + "image": "image323.jpeg" + }, { + "chinese_style": "野兽派风格", + "english_style": "Fauvism style", + "id": "c8c19729-1cad-424e-8d89-79e024587100", + "image": "image326.jpeg" + }, { + "chinese_style": "立体主义风格", + "english_style": "Cubism style", + "id": "c1c2d744-3e88-4d78-8a91-0626caee0f21", + "image": "image324.jpeg" + }, { + "chinese_style": "原始主义风格", + "english_style": "Primitivism style", + "id": "a784d492-5c63-4ed0-849e-af7fc29ee76e", + "image": "image327.jpeg" + }, { + "chinese_style": "波普艺术风格", + "english_style": "Pop art style", + "id": "cd5726f6-6ef6-4cd8-a59e-8e06584ee6b7", + "image": "image321.jpeg" + }, { + "chinese_style": "后现代主义风格", + "english_style": "Postmodernism style", + "id": "f1f2c258-b5ba-41ba-994b-5f7ab3f180ae", + "image": "image329.jpeg" + }, { + "chinese_style": "超扁平风格", + "english_style": "Superflat style", + "id": "531ec980-a5e0-4126-ba9d-449fa8b3605b", + "image": "image330.jpeg" + }], + "id": "4dfa6a37-ea05-4a09-aabb-eed2c714830e" + }, { + "sheet": 19, + "name": "国风", + "subStyle": [{ + "chinese_style": "中国水墨画", + "english_style": "Chinese ink wash painting", + "id": "9aa7dced-46c5-4b9c-9159-41f3d9239a98", + "image": "image352.jpeg" + }, { + "chinese_style": "工笔花鸟画", + "english_style": "Fine-brushwork floral and bird painting", + "id": "e67ae511-04c0-4493-a696-a6799b07f2f8", + "image": "image347.jpeg" + }, { + "chinese_style": "青绿山水画", + "english_style": "Green and blue landscape painting", + "id": "46e39c6a-5df8-49e7-9eed-807cd3f14db2", + "image": "image349.jpeg" + }, { + "chinese_style": "敦煌壁画", + "english_style": "Dunhuang murals", + "id": "85561e1f-72dc-4c7e-a1ce-f70f5ccb4f5f", + "image": "image348.jpeg" + }, { + "chinese_style": "剪纸艺术", + "english_style": "Chinese paper-cut art", + "id": "7ebba49c-e8ef-45f8-bc68-e80036b92b62", + "image": "image350.jpeg" + }, { + "chinese_style": "年画", + "english_style": "New Year paintings", + "id": "e84038c0-0831-485e-beaa-d9247f960ec0", + "image": "image351.jpeg" + }], + "id": "aa51c366-fcaa-4063-84d7-ad5af8bca191" + }, { + "sheet": 20, + "name": "其他应用", + "subStyle": [{ + "chinese_style": "自然风光", + "english_style": "Natural scenery style", + "id": "75b472ed-192d-4120-87af-c38f353b938f", + "image": "image403.jpeg" + }, { + "chinese_style": "宇宙星空", + "english_style": "Space and stars theme", + "id": "a15f8591-0ce4-4d9d-9301-92b6f98b927d", + "image": "image404.jpeg" + }, { + "chinese_style": "城市建筑", + "english_style": "Urban architecture style", + "id": "be9d8a98-d011-4dd4-ace1-c55119691d0c", + "image": "image405.jpeg" + }, { + "chinese_style": "传统文化", + "english_style": "Traditional culture theme", + "id": "3e1e9539-4e2c-4ed5-82cc-84ec83a7f370", + "image": "image406.jpeg" + }, { + "chinese_style": "现代艺术", + "english_style": "Modern art style", + "id": "bc270c1a-ab1d-4e9d-a9a0-5413323802dd", + "image": "image407.jpeg" + }, { + "chinese_style": "民族风情", + "english_style": "Ethnic style", + "id": "43f968fd-e4d3-417a-b40d-a07c2dd691f7", + "image": "image401.jpeg" + }, { + "chinese_style": "古风仙韵", + "english_style": "Ancient charm style", + "id": "d00cead5-0991-40ed-a64a-5e0a8b5770a9", + "image": "image402.jpeg" + }, { + "chinese_style": "未来幻想", + "english_style": "Future fantasy style", + "id": "3537c9f9-a77f-4daf-84cc-73b260b2c155", + "image": "image408.jpeg" + }, { + "chinese_style": "科技机械", + "english_style": "Technology and machinery theme", + "id": "e83d74ec-697c-4962-8ad3-aa8bd4d85496", + "image": "image356.jpeg" + }, { + "chinese_style": "人物插画", + "english_style": "Character illustration style", + "id": "c1c6b6bb-d1ec-40b4-b703-a9ea67c73786", + "image": "image353.jpeg" + }, { + "chinese_style": "动漫卡通", + "english_style": "Anime and cartoon style", + "id": "73425a65-a3ae-4c51-a64c-670984165e32", + "image": "image357.jpeg" + }, { + "chinese_style": "游戏原画", + "english_style": "Game concept art style", + "id": "cddd0ead-0178-4b9e-86f9-2c83de6b57d0", + "image": "image358.jpeg" + }, { + "chinese_style": "影视剧照", + "english_style": "Film and TV stills style", + "id": "750f6d3b-7e5a-40d2-a581-c3d21ad4640b", + "image": "image355.jpeg" + }, { + "chinese_style": "广告插图", + "english_style": "Advertising illustration style", + "id": "9d95166e-8131-4a33-9ded-8a9c7bfddcb0", + "image": "image359.jpeg" + }, { + "chinese_style": "包装设计", + "english_style": "Packaging design style", + "id": "03aa78fa-3c6f-450d-b64c-b842a78f4237", + "image": "image360.jpeg" + }, { + "chinese_style": "平面海报", + "english_style": "Graphic poster style", + "id": "aaed015c-806c-4d8c-9fb4-7ed0d28098b5", + "image": "image354.jpeg" + }, { + "chinese_style": "网页UI", + "english_style": "Web UI design style", + "id": "063e6129-8f8b-4d61-a4f2-547342a279a3", + "image": "image364.jpeg" + }, { + "chinese_style": "品牌标识", + "english_style": "Brand identity design style", + "id": "5acd5018-661c-4983-8257-773217ba6951", + "image": "image361.jpeg" + }, { + "chinese_style": "时尚插画", + "english_style": "Fashion illustration style", + "id": "a9424c0e-2a33-40ae-b040-71127529de8e", + "image": "image365.jpeg" + }, { + "chinese_style": "儿童绘本", + "english_style": "Children's picture book style", + "id": "d2c5a700-1848-4341-93ea-75e6eae70dc2", + "image": "image363.jpeg" + }, { + "chinese_style": "科普漫画", + "english_style": "Popular science comic style", + "id": "21110cd9-34fd-4acf-86e5-18ea5250b16b", + "image": "image366.jpeg" + }, { + "chinese_style": "教育绘本", + "english_style": "Educational picture book style", + "id": "03fad4d9-2f97-4c83-9226-7f913cb22794", + "image": "image362.jpeg" + }, { + "chinese_style": "医学插图", + "english_style": "Medical illustration style", + "id": "6da6fa32-ded0-485f-a414-17b3d7fff6d2", + "image": "image367.jpeg" + }, { + "chinese_style": "建筑设计", + "english_style": "Architectural design style", + "id": "70c99e02-0578-4ba2-ab44-c49e354b1198", + "image": "image368.jpeg" + }, { + "chinese_style": "汽车设计", + "english_style": "Automotive design style", + "id": "04454eab-0491-4e38-a9a0-1476f4138ecb", + "image": "image370.jpeg" + }, { + "chinese_style": "工业设计", + "english_style": "Industrial design style", + "id": "c18d111c-f3e6-4df8-9867-df8af1207399", + "image": "image371.jpeg" + }, { + "chinese_style": "室内设计", + "english_style": "Interior design style", + "id": "4428d573-1829-4cad-9ce1-54c8dda6b7c2", + "image": "image374.jpeg" + }, { + "chinese_style": "时装设计", + "english_style": "Fashion design style", + "id": "90f7f936-8b54-4aae-bba1-ee6cdae5ce76", + "image": "image373.jpeg" + }, { + "chinese_style": "珠宝设计", + "english_style": "Jewelry design style", + "id": "1f9b2bd8-caa5-4f6c-ad87-0aa3ab5be760", + "image": "image369.jpeg" + }, { + "chinese_style": "家具设计", + "english_style": "Furniture design style", + "id": "b2d1bf95-5c92-4c9d-be02-cc5dcdeff625", + "image": "image372.jpeg" + }, { + "chinese_style": "平面设计", + "english_style": "Graphic design style", + "id": "761c2f31-2b3f-437b-9784-976aff089724", + "image": "image375.jpeg" + }, { + "chinese_style": "插图设计", + "english_style": "Illustration design style", + "id": "3887bd64-8f74-4994-bd0a-3f3798d0a336", + "image": "image376.jpeg" + }, { + "chinese_style": "动画设计", + "english_style": "Animation design style", + "id": "9961b135-7658-47c8-b8b6-94ee646345be", + "image": "image380.jpeg" + }, { + "chinese_style": "游戏设计", + "english_style": "Game design style", + "id": "4b95b12e-d27e-460c-b3c3-4bf7306adfca", + "image": "image377.jpeg" + }, { + "chinese_style": "用户界面", + "english_style": "User interface design style", + "id": "90a47637-a287-4f73-a6d3-e10b6cd52035", + "image": "image378.jpeg" + }, { + "chinese_style": "虚拟现实", + "english_style": "Virtual reality theme", + "id": "805a3511-4037-4981-b628-85b2c1c5805c", + "image": "image382.jpeg" + }, { + "chinese_style": "增强现实", + "english_style": "Augmented reality theme", + "id": "1126d0da-6610-4183-915c-e9fe695d44b1", + "image": "image381.jpeg" + }, { + "chinese_style": "人工智能", + "english_style": "Artificial intelligence theme", + "id": "c98ee53f-427c-4016-8745-b781ed180307", + "image": "image383.jpeg" + }, { + "chinese_style": "机器人科技", + "english_style": "Robotics and technology theme", + "id": "c6edebf7-f2be-4027-8620-888e0dec1e86", + "image": "image384.jpeg" + }, { + "chinese_style": "生物工程", + "english_style": "Biotechnology theme", + "id": "00425a0d-5e3d-4304-83be-f4653315abed", + "image": "image379.jpeg" + }, { + "chinese_style": "环境保护", + "english_style": "Environmental protection theme", + "id": "764a6b68-3530-4d45-bdbe-3db74c659dea", + "image": "image390.jpeg" + }, { + "chinese_style": "可持续发展", + "english_style": "Sustainable development theme", + "id": "7bf52103-ab9a-4fff-8250-42a5f8d32e73", + "image": "image386.jpeg" + }, { + "chinese_style": "社会公益", + "english_style": "Social welfare theme", + "id": "6edb9969-682c-4721-aa80-29b6ca583a57", + "image": "image389.jpeg" + }, { + "chinese_style": "医疗健康", + "english_style": "Medical and health theme", + "id": "e36cdc09-976a-43e5-921e-687950020ac6", + "image": "image391.jpeg" + }, { + "chinese_style": "教育培训", + "english_style": "Education and training theme", + "id": "402fbf92-ff82-422b-a12f-3595ff908197", + "image": "image387.jpeg" + }, { + "chinese_style": "金融经济", + "english_style": "Finance and economy theme", + "id": "e75bbc8c-ba12-47a8-9d42-1f2847533afd", + "image": "image388.jpeg" + }, { + "chinese_style": "科学研究", + "english_style": "Scientific research theme", + "id": "9cb82967-bf9e-4a6c-8a22-11e9b5b3d698", + "image": "image385.jpeg" + }, { + "chinese_style": "文化艺术", + "english_style": "Culture and art theme", + "id": "92fcc6e2-88a3-474d-b0ac-ab657e7605b6", + "image": "image392.jpeg" + }, { + "chinese_style": "体育运动", + "english_style": "Sports and fitness theme", + "id": "ecddba8f-d64e-431b-81fe-6a8234da6bca", + "image": "image395.jpeg" + }, { + "chinese_style": "旅游度假", + "english_style": "Travel and vacation theme", + "id": "7b826dfa-670b-4826-9d45-7803d2ee5c6a", + "image": "image400.jpeg" + }, { + "chinese_style": "美食烹饪", + "english_style": "Food and cooking theme", + "id": "2d72e89e-8208-4d19-ad8a-0f8e3718fb42", + "image": "image398.jpeg" + }, { + "chinese_style": "时尚美妆", + "english_style": "Fashion and beauty theme", + "id": "50acc1db-330c-413b-aa99-efcbda18c94d", + "image": "image393.jpeg" + }, { + "chinese_style": "婚礼庆典", + "english_style": "Wedding and celebration theme", + "id": "353a2699-8906-4d15-beac-1a942bf1e26e", + "image": "image394.jpeg" + }, { + "chinese_style": "家居生活", + "english_style": "Home and lifestyle theme", + "id": "1b9ce9cf-2c7f-43a4-a619-171856e8db41", + "image": "image399.jpeg" + }, { + "chinese_style": "母婴育儿", + "english_style": "Maternity and parenting theme", + "id": "df0f3682-82ae-4729-b469-25f0c1784364", + "image": "image396.jpeg" + }, { + "chinese_style": "科技创新", + "english_style": "Technological innovation theme", + "id": "1fa174c2-3557-4fec-bd03-1774561d494a", + "image": "image397.jpeg" + }], + "id": "cfd1b687-0043-4e39-bf8e-b8f4d4667016" + }], + /** + * 获取所有的生图风格 + * @returns {Array} 返回所有的风格数据 + */ + getImageStyle: function () { + return this.image_style; + }, + + /** + * 获取指定的的ID的风格数据,可以多个 + * @param {*} ids ID的数组 + * @returns + */ + getImageStyleObjectByIds: function (ids) { + let result = []; + if (!ids) { + ids = []; + } + let style = this.getAllSubStyle(); + for (let i = 0; i < ids.length; i++) { + const element = ids[i]; + for (let j = 0; j < style.length; j++) { + const item = style[j]; + if (item.id == element) { + result.push(item); + break; + } + } + } + return result; + }, + + /** + * 获取指定ID数组的风格提示词 + * @param {*} ids 需要拼接的id数组 + * @returns 返回拼接好的英文提示词字符串(会加上SD设置那边的权重) + */ + getImageStyleStringByIds: async function (ids) { + let res = ""; + let tmp = []; + let result = this.getImageStyleObjectByIds(ids); + for (let i = 0; i < result.length; i++) { + const element = result[i]; + tmp.push(element.english_style); + } + let weight = await SdSettingDefine.getSettingSettingProperty("style_weight", false); + weight = weight ? weight : 1; + tmp.map((item) => { + if (global.config.image_generate_category == "sd") { + res += `(${item}:${weight}),`; + } else { + res += `${item},`; + } + }); + return res; + }, + + /** + * + * @returns {Array} 返回所有的风格数据 + */ + getAllSubStyle: function () { + let subStyle = []; + this.image_style.forEach((item) => { + subStyle = subStyle.concat(item.subStyle); + }); + return subStyle; + }, + + /** + * 根据图像风格数据,返回选择菜单 + * @returns {Array} 返回所有的风格数据 + */ + getImageStyleMenu: function () { + let menu = []; + this.image_style.forEach((item) => { + menu.push({ + id: item.id, + label: item.name, + key: item.id, + }); + }); + return menu; + }, + + /** + * 获取指定的ID的下面数据的风格 + * @param {*} id 菜单的ID + */ + getImagePathById: function (id) { + try { + let index = this.image_style.findIndex((item) => item.id == id); + if (index < 0) { + throw new Error("没有找到指定的ID"); + } + let subStyle = this.image_style[index].subStyle; + return subStyle; + + } catch (error) { + throw error; + } + } + +} + +export { ImageStyleDefine } \ No newline at end of file diff --git a/src/main/IPCEvent/settingIpc.js b/src/main/IPCEvent/settingIpc.js new file mode 100644 index 0000000..f4696d4 --- /dev/null +++ b/src/main/IPCEvent/settingIpc.js @@ -0,0 +1,72 @@ +const { + ipcMain +} = require("electron") +import { DEFINE_STRING } from '../../define/define_string' +import { + Setting +} from '../setting/setting' +let setting = new Setting(global); + +function SettingIpc() { + + // 获取背景音乐配置列表 + ipcMain.handle(DEFINE_STRING.GET_BACKGROUND_MUSIC_CONFIG_LIST, async (event) => await setting.GetBackGroundMusicConfigList()); + + // 获取剪映关键帧配置列表 + ipcMain.handle(DEFINE_STRING.GET_KEYFRAME_OPTIONS, async (event) => await setting.GetKeyFrameOptions()); + // 保存剪映关键帧配置 + ipcMain.handle(DEFINE_STRING.SAVE_KEY_FRAME_SETTING, async (event, value) => await setting.SaveKeyFrameSetting(value)); + // 监听添加背景音乐文件 + ipcMain.handle(DEFINE_STRING.ADD_BACKGROUND_MUSIC_FOLDER, async (event, value) => await setting.AddBackgroundMusicFolder(value)) + // 删除剪映的样式设置 + ipcMain.handle(DEFINE_STRING.DELETE_DRAFT_TEXT_STYLE, async (event, value) => await setting.deleteClipSetting("text_style", value)); + + // 删除剪映的背景音乐设置 + ipcMain.handle(DEFINE_STRING.DELETE_CLIP_SETTING, async (event, value) => await setting.deleteClipSetting("background_music_setting", value)); + // 删除剪映的友情提示设置 + ipcMain.handle(DEFINE_STRING.DELETE_FRIENDLY_REMINDER, async (event, value) => await setting.deleteClipSetting("friendly_reminder_setting", value)); + + // 监听获取SD配置任务 + ipcMain.handle(DEFINE_STRING.INIT_SD_CONFIG, async (event, value) => await setting.InitSDConfig()); + + // 获取主页显示信息 + ipcMain.handle(DEFINE_STRING.GET_SHOW_MESSAGE, async (event) => await setting.GetShowMessage()) + // 获取关键帧的配置数据 + ipcMain.handle(DEFINE_STRING.GET_KEY_FRAME_CONFIG_DATA, async (event) => await setting.GetKeyFrameConfigData()); + + // 删除后台队列任务 + ipcMain.handle(DEFINE_STRING.DELETE_BACK_TASK, async (event, value) => await setting.RemoveTask(value)); + + // 获取自动保存图片的分类方式 + ipcMain.handle(DEFINE_STRING.GET_AUTO_SAVE_IMAGE_CLASSIFY_OPTIONS, async (event) => await setting.GetAutoSaveImageClassifyOptions()); + + // 保存图片自动保存的配置 + ipcMain.handle(DEFINE_STRING.SAVE_IMAGE_AUTO_SAVE_SETTING, async (event, value) => await setting.SaveImageAutoSaveSetting(value)); + + // 获取当前的自动保存图片的设置 + ipcMain.handle(DEFINE_STRING.GET_IMAGE_AUTO_SAVE_SETTING, async (event) => await setting.GetImageAutoSaveSetting()); + + // 开始手动保存图片 + ipcMain.handle(DEFINE_STRING.SAVE_IMAGE_TO_OTHER_FOLDER, async (event, value) => await setting.SaveImageToOtherFolder(value)); + // 检查机器码是否存在 + ipcMain.handle(DEFINE_STRING.CHECK_MACHINE_ID, async (event, value) => await setting.CheckMachineId(value)); + + //修改剪映草稿配置 + ipcMain.handle(DEFINE_STRING.MODIFY_SAMPLE_SETTING, async (event, value) => await setting.ModifySampleSetting(value)); + + // 获取选择角色场景模式的options + ipcMain.handle(DEFINE_STRING.MJ.GET_TAG_SELECT_MODEL, async (event) => await setting.GetRoleSceneModeOptions()); + + // 获取当前生成图片的生图方式(sd,mj,d3) + ipcMain.handle(DEFINE_STRING.GET_IMAGE_GENERATE_CATEGORY, async (event) => await setting.GetImageGenerateCategory()); + + // // 获取指定的配置文件里面指定的属性的数据 + ipcMain.handle(DEFINE_STRING.GET_DEFINE_CONFIG_JSON_BY_PROPERTY, async (event, value) => await setting.GetDefineConfigJsonByProperty(value)) + + // // 保存指定的配置文件里面指定的属性的数据 + ipcMain.handle(DEFINE_STRING.SAVE_DEFINE_CONFIG_JSON_BY_PROPERTY, async (event, value) => await setting.SaveDefineConfigJsonByProperty(value)) +} + +export { + SettingIpc +} \ No newline at end of file diff --git a/src/main/IPCEvent/writingIpc.js b/src/main/IPCEvent/writingIpc.js new file mode 100644 index 0000000..668dc1d --- /dev/null +++ b/src/main/IPCEvent/writingIpc.js @@ -0,0 +1,28 @@ +import { + ipcMain +} from "electron"; +import { DEFINE_STRING } from '../../define/define_string' +import { + Writing +} from '../backPrompt/writing' +let writing = new Writing(global); + +function WritingIpc() { + // 监听分镜时间的保存 + ipcMain.handle(DEFINE_STRING.SAVE_COPYWRITING_INFOMATION, async (event, value) => await writing.SaveCopywritingInformation(value)); + + // 监听获取当前项目下面的分镜文案 + ipcMain.handle(DEFINE_STRING.GET_PROJECT_WORD, async (event, value) => await writing.GetProjectWord()); + + // 获取config配置文件数据 + ipcMain.handle(DEFINE_STRING.GET_CONFIG_JSON, async (event, value) => await writing.GetConfigJson(value)); + + // 将指定的文案txt数组写入到指定的文件中 + ipcMain.handle(DEFINE_STRING.SAVE_WORD_TXT, async (event, value) => await writing.SaveWordTxt(value)); + + // 监听获取字幕时间 + ipcMain.handle(DEFINE_STRING.IMPORT_SRT_AND_GET_TIME, async (event, value) => await writing.ImportSrtAndGetTime(value)) +} +export { + WritingIpc +} diff --git a/src/main/Original/TagCustomize.js b/src/main/Original/TagCustomize.js new file mode 100644 index 0000000..cb37102 --- /dev/null +++ b/src/main/Original/TagCustomize.js @@ -0,0 +1,33 @@ +import { TagDefine } from "../../define/tagDefine"; +export class TagCustomize { + constructor(global) { + this.global = global; + this.tagDefine = new TagDefine(global); + } + + /** + * 获取默认的tag + * @param {*} value + */ + async GetTagDataByTypeAndProperty(value) { + return await this.tagDefine.getTagDataByTypeAndProperty(value[0], value[1]); + } + + /** + * 保存数据到指定的tag中 + * @param {*} value + * @returns + */ + async SaveTagPropertyData(value) { + return await this.tagDefine.saveTagPropertyData(value); + } + + /** + * 删除指定的tag数据 + * @param {*} value + * @returns + */ + async DeleteTagPropertyData(value) { + return await this.tagDefine.deleteTagPropertyData(value); + } +} \ No newline at end of file diff --git a/src/main/backPrompt/imageGenerate.js b/src/main/backPrompt/imageGenerate.js new file mode 100644 index 0000000..1571cce --- /dev/null +++ b/src/main/backPrompt/imageGenerate.js @@ -0,0 +1,493 @@ + +import { Tools } from "../tools"; +import path from "path"; +import { DEFINE_STRING } from "../../define/define_string"; +import { define } from "../../define/define"; +import { PublicMethod } from "../Public/publicMethod"; +import { SD } from "../Public/SD" +const util = require('util'); +const { spawn, exec } = require('child_process'); +import axios from "axios"; +const sharp = require('sharp'); +const execAsync = util.promisify(exec); +const { v4: uuidv4 } = require('uuid'); // 引入UUID库来生成唯一标识符 +let fspromises = require("fs").promises; +import { MD5 } from "crypto-js"; +import { ImageSetting } from "../../define/setting/imageSetting"; + + +export class ImageGenerate { + constructor(global) { + this.global = global; + this.tools = new Tools(); + this.pm = new PublicMethod(global); + this.sd = new SD(global); + } + + /** + * 获取指定名称的提示词json文件数据 + * @param {*} value + */ + async GetPromptJson(value) { + try { + let json_path = path.join(this.global.config.project_path, "tmp/input_crop/" + value + ".json"); + let isExist = await this.tools.checkExists(json_path); + if (!isExist) { + throw new Error("提示词文件不存在"); + } + let res = JSON.parse(await fspromises.readFile(json_path, 'utf-8')); + return { + value: 1, + data: res + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 修改指定任务队列的状态 + * @param {*} value 0 使用什么查找(id。out_folder,) 1查找的值 2 状态值 + * @returns + */ + async ModifyGenerateTaskStatus(value) { + try { + await this.pm.ModifyTaskStatus(value[0], value[1], value[2]); + return { + code: 1 + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + + + /** + * 修改本地的参数 + * @param {修改json的参数} value + */ + async ModifyInpurCropJson(value) { + try { + value = JSON.parse(value); + let prompt = value.prompt; + // 重绘幅度 + let denoising_strength = value.denoising_strength; + let json_path = path.join(path.join(global.config.project_path, 'tmp/input_crop'), value.name + ".json"); + let old_json = JSON.parse(await fspromises.readFile(json_path, 'utf-8')); + old_json.webui_config.prompt = prompt; + old_json.webui_config.denoising_strength = denoising_strength; + old_json.model = value.model; + old_json.adetailer = value.adetailer; + old_json.chinese_prompt = value.chinese_prompt; + + if (value.modify_old) { + old_json.webui_config.init_images = value.modify_old; + } + + await fspromises.writeFile(json_path, JSON.stringify(old_json)); + return { + code: 1 + } + } catch (error) { + throw new Error(error); + } + } + + /** + * 返回文件夹里的所有的图片,以及其他信息 + * @param {图片文件夹} value + * @returns + */ + async getFolderImageList(mainWindow, value, isReturn) { + try { + let img_dir = path.normalize(value); + let base_name = path.basename(img_dir); + let tmp = path.dirname(img_dir); + let input_path = path.join(tmp, "input_crop") + // console.log(tmp, input_path) + let files = await fspromises.readdir(img_dir) + let imageFiles = files.filter(file => /\.(png)$/i.test(file)); + imageFiles.sort(); + + let res = []; + let task_list_json = JSON.parse(await fspromises.readFile(path.join(this.global.config.project_path, 'scripts/task_list.json'), 'utf-8')); + // 处理数据 + for (let i = 0; i < imageFiles.length; i++) { + const img = imageFiles[i]; + let imput_path = path.join(input_path, img); + let img_json = path.join(input_path, img + '.json'); + // 判断文件是不是存在 + let prompt_json = JSON.parse(await fspromises.readFile(img_json)); + + let output_list = await this.pm.getSubFolderList(path.join(this.global.config.project_path, "tmp"), 'start', 'output_crop'); + let output_image_list = []; + for (let i = 0; i < output_list.length; i++) { + const item = output_list[i]; + // 找到找到文件对应的任务列表的样式和lora + let task_list = task_list_json.task_list.filter(a => a.out_folder == item); + let output_1 = path.join(tmp, item); + let obj = { + id: uuidv4(), + img_path: path.join(output_1, img), + image_style: task_list[0].image_style, + lora: task_list[0].lora + } + output_image_list.push(obj); + + } + let main_task_list = task_list_json.task_list.filter(a => a.out_folder == base_name); + let obj = { + name: img, + id: uuidv4(), + sampler_name: prompt_json.webui_config.sampler_name, + prompt: prompt_json.webui_config.prompt, + chinese_prompt: prompt_json.chinese_prompt, + negative_prompt: prompt_json.webui_config.negative_prompt, + denoising_strength: prompt_json.webui_config.denoising_strength, + seed: prompt_json.webui_config.seed, + image: path.join(img_dir, img), + oldImage: prompt_json.webui_config.init_images, + output_list: output_image_list, + model: prompt_json.model, + image_style: main_task_list[0].image_style, + lora: main_task_list[0].lora, + image_style_list: main_task_list[0].image_style_list, + adetailer: prompt_json.adetailer, + width: prompt_json.webui_config.width, + height: prompt_json.webui_config.height + } + res.push(obj) + // 获取提示词 + } + if (isReturn) { + return { + code: 1, + windowID: mainWindow.id, + value: res + } + } else { + mainWindow.webContents.send(DEFINE_STRING.RETURN_IMAGE_PROMPT, { + code: 1, + windowID: mainWindow.id, + value: res + }) + } + } catch (error) { + return { + code: 0, + message: `Error message ${error.toString()}` + } + } + } + + /** + * 将反推的图片的信息添加到一个json文件中 + */ + async AddWebuiJson() { + try { + return await this.pm.AddWebuiJson(); + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 修改任务队列数据 + * @param {替换后的值} value + */ + async ModifyImageTaskList(value) { + try { + let res = await this.pm.ModifyImageTaskList(value); + if (res) { + return { + code: 1, + message: "替换成功" + } + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 获取生成图片的任务队列(可以添加部分判断) + */ + async GetGenerateTaskList() { + try { + return await this.pm.GetImageTask() + } catch (error) { + return { + code: 0, + message: error.message + } + } + } + + /** + * 生成任务中的队列 + * @param {传入所有执行生图队列的任务} value + */ + async GenerateImageInSelectTask(value) { + try { + let batch = DEFINE_STRING.QUEUE_BATCH.SD_BACKSTEP_GENERATE_IMAGE + let taskPath = path.join(this.global.config.project_path, 'scripts/task_list.json'); + let task_list_json = JSON.parse(await fspromises.readFile(taskPath, 'utf-8')); + let auto_save_image = await this.tools.getJsonFilePropertyValue(define.img_base, "auto_save_image", {}, false); + let png_files = []; + // 读取队列中的任务,然后添加队列 + for (let i = 0; i < value.length; i++) { + const element = value[i]; + let task_list = task_list_json.task_list.filter(item => item.id == element)[0]; + let seed = -1; + let images = await this.tools.getFilesWithExtensions(path.join(this.global.config.project_path, 'tmp/input_crop'), '.png'); + await fspromises.mkdir(path.join(this.global.config.project_path, 'tmp/' + task_list.out_folder), { recursive: true }); + if (images.length <= 0) { + throw new Error("未检测到抽帧图片。请检查"); + } + if (images.length > auto_save_image.save_match_count) { + png_files = await this.tools.getFilesWithExtensions(auto_save_image.main_save_folder, '.png'); + } + this.global.requestQuene.enqueue(async () => { + let res = await this.sd.OneImageGeneration(images[0], task_list, seed); + let tmp_seed = -1; + if (seed == -1) { + tmp_seed = res; + } + for (let j = 1; j < images.length; j++) { + const item = images[j]; + + let has_permission = false; + // 判断权限 + let permission = this.global.permission; + + if (permission && permission.length >= 0) { + if (permission.indexOf(DEFINE_STRING.PERMISSIONS.AUTO_SAVE_IMAGE_PERMISSION) >= 0) { + has_permission = true; + } + } else { + has_permission = true; + } + + if (auto_save_image.save_match_count && j >= auto_save_image.save_match_count && has_permission && auto_save_image.auto_match) { + // 现在随机匹配视频 + // 获取指定的文件夹中的图片 + let randomData = png_files[Math.floor(Math.random() * png_files.length)]; + let base_name = path.basename(item); + let copy_path = path.join(this.global.config.project_path, 'tmp/' + task_list.out_folder, base_name); + await this.tools.copyFileOrDirectory(randomData, copy_path); + } else { + this.global.requestQuene.enqueue(async () => { + await this.sd.OneImageGeneration(item, task_list, tmp_seed); + }, `${task_list.out_folder}_${images[j]}`, batch, task_list.out_folder) + } + } + + }, `${task_list.out_folder}_${images[0]}`, batch, task_list.out_folder) + // } + task_list.status = 'queue'; + + // 开始批次执行(全部刷新) + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.IMAGE_TASK_STATUS_REFRESH, task_list); + + // 判断是不是还有批次执行的任务 + // 监听子批次完成(修改当前批次的状态) + this.global.requestQuene.setSubBatchCompletionCallback(batch, task_list.out_folder, async (failedTasks) => { + console.log(failedTasks) + if (failedTasks.length > 0) { + + } else { + // 判断是不是有错误。没有错误的话。直接修改状态。有错误直接记录错误(写入一个就行) + task_list_json = JSON.parse(await fspromises.readFile(taskPath, 'utf-8')); + // 全部执行完毕之后,修改 + task_list_json.task_list.map(a => { + if (a.out_folder == task_list.out_folder) { + a.status = "ok"; + } + }) + // 写入 + await fspromises.writeFile(taskPath, JSON.stringify(task_list_json)); + + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.IMAGE_TASK_STATUS_REFRESH, { + out_folder: task_list.out_folder, + status: "ok" + }); + + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, { + out_folder: task_list.out_folder, + status: "ok" + }) + } + }) + } + + // 监听总批次完成 + this.global.requestQuene.setBatchCompletionCallback(batch, (failedTasks) => { + if (failedTasks.length > 0) { + let message = ` + 批次生成任务都已完成。 + 但是以下任务执行失败: + ` + failedTasks.forEach(({ taskId, error }) => { + message += `${taskId}-, \n 错误信息: ${error}` + '\n'; + }); + + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 0, + message: message + }) + } else { + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "所有生成任务完成" + }) + } + }) + // 写回 + await fspromises.writeFile(taskPath, JSON.stringify(task_list_json)); + return { + code: 1, + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 批量高清文件夹 + * @param {项目下面的文件夹的值} value + */ + async ImproveResolution(value) { + try { + let batch = DEFINE_STRING.QUEUE_BATCH.LOCAL_IMAGE_IMPROVE; + + // 加入队列 + for (let i = 0; i < value.length; i++) { + const folder = value[i]; + this.global.requestQuene.enqueue(async () => { + await this.pm.ImproveFolder(folder); + }, folder, batch) + + // 添加队列后修改状态 + await this.pm.ModifyTaskStatus('out_folder', folder, "video_improving"); + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, { + out_folder: folder, + status: "video_improving" + }) + } + + global.requestQuene.setBatchCompletionCallback(batch, async (failedTasks) => { + + let permission = this.global.permission; + // 判断权限 + if (permission && permission.length >= 0) { + if (permission.indexOf(DEFINE_STRING.PERMISSIONS.AUTO_SAVE_IMAGE_PERMISSION) >= 0) { + // 在高清前,先将要高清的图片保存 + let res = await ImageSetting.SaveImageToOtherFolder(value, null); + if (res.code == 0) { + return res; + } + } + } else { + // 在高清前,先将要高清的图片保存 + let res = await ImageSetting.SaveImageToOtherFolder(value, null); + if (res.code == 0) { + return res; + } + } + + + if (failedTasks.length > 0) { + let message = ` + 高清任务都已完成。 + 但是以下任务执行失败: + ` + failedTasks.forEach(({ taskId, error }) => { + message += `${taskId}-, \n 错误信息: ${error}` + '\n'; + }); + + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 0, + message: message + }) + } else { + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "所有任务高清完成" + }) + } + }) + return { + code: 1 + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 下载文件到指定位置 + * @param {*} value 0: 源图片地址 1: 类型 2: 目标文件地址 + */ + async DownloadImageFile(value) { + try { + let type = value[1]; + let img_file = value[0]; + let target_file = value[2]; + if (type == "cover") { + // 下载封面 + // 判断封面是不是存在 + let cover_path = path.join(this.global.config.project_path, 'data/封面'); + let isExist = await this.tools.checkExists(cover_path); + if (!isExist) { + await fspromises.mkdir(cover_path, { recursive: true }); + } + // 复制 + await fspromises.copyFile(img_file, path.join(cover_path, Date.now() + '.png')); + return { + code: 1, + message: "保存成功!" + } + } else if (type == "replace") { + if (!target_file) { + throw new Error("目标文件地址不存在"); + } + await fspromises.copyFile(path.normalize(decodeURIComponent(img_file)), path.normalize(decodeURIComponent(target_file))); + await this.tools.copyFileOrDirectory(decodeURIComponent(img_file), decodeURIComponent(target_file).replace("output_crop_1", "input_crop")); + return { + code: 1, + } + } + + else { + return { + code: 0, + message: "参数错误" + } + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } +} \ No newline at end of file diff --git a/src/main/backPrompt/videoGenerate.js b/src/main/backPrompt/videoGenerate.js new file mode 100644 index 0000000..a1be12a --- /dev/null +++ b/src/main/backPrompt/videoGenerate.js @@ -0,0 +1,556 @@ +import path from "path"; +import { define } from "../../define/define"; +import { Tools } from "../tools"; +import { PublicMethod } from "../Public/publicMethod"; +import { func } from '../func' +import { DEFINE_STRING } from "../../define/define_string"; +const util = require('util'); +const { spawn, exec } = require('child_process'); +const execAsync = util.promisify(exec); +const fspromises = require("fs").promises; +import { SD } from "../Public/SD" + +export class VideoGenerate { + constructor(global) { + this.global = global; + this.tools = new Tools(); + this.pm = new PublicMethod(global); + this.sd = new SD(global); + } + + /** + * 获取之前的基础配置 + */ + async GetVideoGenerateConfig() { + try { + let res = await this.tools.getJsonFilePropertyValue(path.join(this.global.config.project_path, "scripts/config.json"), "video_config", {}, false); + return { + code: 1, + data: res + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 保存合成视频的基础信息(Srt,audio,background) + * @param {*} value 保存合成视频的基础信息(Srt,audio,background) + */ + async SaveVideoSrtAndAudioMessage(value) { + try { + value = JSON.parse(value); + await this.tools.writeJsonFilePropertyValue(path.join(this.global.config.project_path, "scripts/config.json"), "video_config", value); + return { + code: 1 + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + *全自动合成视频的任务(出图、高清、合成视频) + * @param {传入的需要执行的task_list的任务} value + */ + async ActionAutoVideoTask(value) { + try { + // 开始添加队列任务 + // 生图 + // 将当前的所有任务添加到队列中 + await this.pm.AddWebuiJson(); + let batch = DEFINE_STRING.QUEUE_BATCH.AUTO_VIDEO_GENERATE; + let taskPath = path.join(this.global.config.project_path, "scripts/task_list.json"); + + // // 修改数据(保存srt字幕文件位置。配音文件位置。背景音乐文件) + // this.global.fileQueue.enqueue(async () => { + // let config_json = JSON.parse(await fspromises.readFile(path.join(this.global.config.project_path, "scripts/config.json"), 'utf-8')); + // config_json.srt_path = value[1].srt_path; + // config_json.audio_path = value[1].audio_path; + // config_json.background_music = value[1].background_music; + // await fspromises.writeFile(path.join(this.global.config.project_path, "scripts/config.json"), JSON.stringify(config_json)); + // }) + + await this.tools.writeJsonFilePropertyValue(path.join(this.global.config.project_path, "scripts/config.json"), "video_config", value[1]); + + // 便利所有的队列任务 + for (let i = 0; i < value[0].length; i++) { + // 将所有的数据天添加到队列(总的大队列,有很多的小队列) + // 将所有生图任务添加到队列中 + const task_list = value[0][i]; + let seed = -1; + let subBatchId = `${task_list.out_folder}_image` + let images = await this.tools.getFilesWithExtensions(path.join(this.global.config.project_path, 'tmp/input_crop'), '.png'); + await fspromises.mkdir(path.join(this.global.config.project_path, 'tmp/' + task_list.out_folder), { recursive: true }); + if (images.length <= 0) { + throw new Error("未检测到抽帧图片。请检查"); + } + this.global.requestQuene.enqueue(async () => { + let res = await this.sd.OneImageGeneration(images[0], task_list, seed); + let tmp_seed = -1; + if (seed == -1) { + tmp_seed = res; + } + for (let j = 1; j < images.length; j++) { + const element = images[j]; + this.global.requestQuene.enqueue(async () => { + await this.sd.OneImageGeneration(element, task_list, tmp_seed); + }, `${task_list.out_folder}_${images[j]}`, batch, subBatchId) + } + + }, `${task_list.out_folder}_${images[0]}`, batch, subBatchId) + // } + task_list.status = 'queue'; + task_list["isAuto"] = "true"; + await this.pm.ModifyImageTaskList([task_list]); + // 修改状态 + // await this.pm.ModifyTaskStatus("id", task_list.id, "queue"); + // this.global.fileQueue.enqueue(async () => { + // let task_json = JSON.parse(await fspromises.readFile(taskPath, 'utf-8')); + // let index = task_json.task_list.findIndex(item => item.id == task_list.id); + // task_json.task_list[index] = task_list; + // await fspromises.writeFile(taskPath, JSON.stringify(task_json)); + // }) + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, task_list) + + // 判断是不是还有批次执行的任务 + // 监听子批次完成(修改当前批次的状态) + this.global.requestQuene.setSubBatchCompletionCallback(batch, subBatchId, async (failedTasks) => { + console.log(failedTasks) + if (failedTasks.length > 0) { + // 之前的任务出现错误 + // 执行错误 + } else { + // 判断是不是有错误。没有错误的话。直接修改状态。有错误直接记录错误(写入一个就行) + task_list.status = "ok"; + await this.pm.ModifyTaskStatus("id", task_list.id, 'ok'); + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, task_list) + console.log(subBatchId + "生图执行完毕。可以开始执行高清") + + // 添加高清队列 + // task_list + this.global.requestQuene.enqueue(async () => { + await this.pm.ImproveFolder(task_list.out_folder); + }, `${task_list.out_folder}_improve`, batch, `${task_list.out_folder}_improve`); + // 添加队列后修改状态 + task_list.status = "video_improving" + await this.pm.ModifyTaskStatus('out_folder', task_list.out_folder, "video_improving"); + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, task_list) + + // 监听高清任务完成 + this.global.requestQuene.setSubBatchCompletionCallback(batch, `${task_list.out_folder}_improve`, async (failedTasks) => { + console.log(failedTasks) + if (failedTasks.length > 0) { + // 之前的任务出现错误 + // 执行错误 + } else { + + console.log(task_list.out_folder + "高清完成,可以开始合成视频"); + // 添加生成视频队列 + this.global.requestQuene.enqueue(async () => { + let video_config = JSON.parse(await fspromises.readFile(define.video_config, 'utf-8')); + await this.AutoGeneretionOneVide(task_list.out_folder, video_config, value); + }, `${task_list.out_folder}_video`, batch, `${task_list.out_folder}_video`); + task_list.status = "video_queue"; + // 添加后修改状态 + await this.pm.ModifyTaskStatus('out_folder', task_list.out_folder, "video_queue"); + + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, task_list) + + // 监听生成视频任务完成 + this.global.requestQuene.setSubBatchCompletionCallback(batch, `${task_list.out_folder}_video`, async (failedTasks) => { + console.log(failedTasks) + if (failedTasks.length > 0) { + // 之前的任务出现错误 + // 执行错误 + } else { + console.log(task_list.out_folder + "合成视频完成"); + // 添加生成视频队列 + task_list.status = "video_ok"; + // 添加后修改状态 + await this.pm.ModifyTaskStatus('out_folder', task_list.out_folder, "video_ok"); + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, task_list) + } + }) + + } + }) + } + }) + } + + // 监听总批次完成 + this.global.requestQuene.setBatchCompletionCallback(batch, async (failedTasks) => { + if (failedTasks.length > 0) { + let message = ` + 批次生成任务都已完成。 + 但是以下任务执行失败: + ` + failedTasks.forEach(({ taskId, error }) => { + message += `${taskId}-, \n 错误信息: ${error}` + '\n'; + }); + + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 0, + message: message + }) + } else { + console.log("所有的自动生成任务完成"); + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "所有自动任务完成" + }) + } + + this.global.fileQueue.enqueue(async () => { + // 读取最新的数据删除 + // 将自动化标识删除 + let task_json = JSON.parse(await fspromises.readFile(taskPath, 'utf-8')); + for (let i = 0; i < task_json.task_list.length; i++) { + let task_list = task_json.task_list[i]; + task_list["isAuto"] = "false"; + await this.pm.ModifyImageTaskList([task_list]); + } + }) + }) + return { + code: 1, + message: "自动任务添加到队列中" + } + + } catch (error) { + console.error(error) + return { + code: 0, + message: error.message + } + } + } + + /** + * 获取文件夹下面的子文件夹,添加判断条件 + * @param {value} value + * @returns + */ + async getSubFolderList(value) { + try { + let folder = await this.pm.getSubFolderList(path.join(this.global.config.project_path, "tmp"), value[0], value[1]); + // 找到所有的数据(查询状态返回) + let task_path = path.join(this.global.config.project_path, "scripts/task_list.json"); + let isExist = await this.tools.checkExists(task_path); + let data = []; + if (!isExist) { + for (let i = 0; i < folder.length; i++) { + const element = folder[i]; + let obj = { + folder: element, + status: "unkown error" + } + data.push(obj); + } + } else { + let task_list = JSON.parse(await fspromises.readFile(task_path, 'utf-8'))["task_list"]; + // 查询状态 + for (let i = 0; i < folder.length; i++) { + const element = folder[i]; + let index = task_list.findIndex(item => item.out_folder == element); + if (index < 0) { + let obj = { + folder: element, + status: "unkown error" + } + data.push(obj); + } else { + let status = task_list[index].status; + let obj = { + folder: element, + status: status + } + data.push(obj); + } + } + } + return { + code: 1, + data: data + } + } catch (error) { + return { + code: 0, + message: `Error Message ${error}` + } + } + } + + /** + * 自动生成一个视频 + * @param {视频生成图片的文件夹} element + * @param {视频配置} video_config + * @param {参数。第一个值为数组,为生成的图片文件。第二个参数是配置} value + */ + async AutoGeneretionOneVide(element, video_config, value) { + try { + let background_music = ""; + // 读取背景音乐的路径 + if (value[1].background_music != "") { + let background_music_config = (await func.getClipSetting("background_music_setting")).value; + let background_music_filter = background_music_config.filter(item => item.id == value[1].background_music); + if (background_music_filter.length <= 0) { + throw new Error("背景音乐对应的配置没有找到"); + } else { + background_music = background_music_filter[0].folder_path; + } + } + + // 随机获取字幕设置 + let ass_config = video_config.assConfig; + let ass_random_index = Math.floor(Math.random() * ass_config.length); + let watermark_config = video_config.watermarkConfig; + let watermark_random_index = Math.floor(Math.random() * watermark_config.length); + + // 对每个视频生成配置文件并将其添加到配置文件中 + let obj = { + srt_path: value[1].srt_path, + // 字幕样式(需要随机) + srt_style: ass_config[ass_random_index], + audio_path: value[1].audio_path, + background_music_folder: background_music, + // 水印设置(需要随机) + friendly_reminder: watermark_config[watermark_random_index], + video_resolution_x: video_config.video_resolution_x, + video_resolution_y: video_config.video_resolution_y, + outpue_file: path.join(this.global.config.project_path, this.global.config.project_name + element + ".mp4"), + image_folder: path.join(this.global.config.project_path, 'tmp/' + element), + srt_config: path.join(this.global.config.project_path, 'scripts/config.json'), + mp4_file_txt: path.join(this.global.config.project_path, `scripts/${element}.txt`), + status: "no", + audio_sound_size: video_config.audioSoundSize, + background_music_sound_size: video_config.backgroundMusicSoundSize, + keyFrame: video_config.keyframe, + frameRate: video_config.frameRate, + bitRate: video_config.bitRate + } + // 将配置文件写入 + let project_config_path = path.join(this.global.config.project_path, `scripts/${element}.json`); + await fspromises.writeFile(project_config_path, JSON.stringify(obj)); + // let task_list = JSON.parse(await fspromises.readFile(path.join(this.global.config.project_path,'scripts/task_'))); + let scriptPath = path.join(define.scripts_path, 'Lai.exe'); + // 执行生成图片的脚本 + let script = `cd "${define.scripts_path}" && "${scriptPath}" -c "${project_config_path.replaceAll('\\', '/')}"`; + const output = await execAsync(script, { maxBuffer: 1024 * 1024 * 10, encoding: 'utf-8' }); + if (output.stderr != '') { + obj.status = "video_error"; + obj.stdout = output.stdout; + obj.stderr = output.stderr; + await this.pm.ModifyTaskStatus('out_folder', element, "video_error"); + throw new Error(output.stderr); + } else { + obj.status = "video_ok"; + obj.stdout = output.stdout; + obj.stderr = output.stderr; + await this.pm.ModifyTaskStatus('out_folder', element, "video_ok"); + // 将写出的视频中的exif数据删除 + // await this.tools.deletePngAndDeleteExifData(obj.outpue_file, path.join(this.global.config.project_path, this.global.config.project_name + "_" + element.split('_')[element.split('_').length - 1] + ".mp4")); + } + + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, { + out_folder: element, + status: obj.status + }) + } catch (error) { + //手动修改 + let task_list_json = JSON.parse(await fspromises.readFile(path.join(this.global.config.project_path, "scripts/task_list.json"), 'utf-8')); + let index = task_list_json.task_list.findIndex(item => item.out_folder == element); + if (index < 0) { + throw new Error("未找到对应的任务"); + } + task_list_json.task_list[index].status = "video_error"; + task_list_json.task_list[index].errorMessage = error.toString(); + // 写回 + await fspromises.writeFile(path.join(this.global.config.project_path, "scripts/task_list.json"), JSON.stringify(task_list_json)); + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, { + out_folder: element, + status: "video_error" + }) + throw error; + } + } + + /** + * 添加自动合成任务到队列中去 + * @param {} value + */ + async AutoGeneretionVideo(value) { + try { + // 先检查所有的条件 + let batch = DEFINE_STRING.QUEUE_BATCH.AUTO_VIDEO_GENERATE_SINGLE; + // console.log(value); + let video_config = JSON.parse(await fspromises.readFile(define.video_config, 'utf-8')); + let res = await this.CheckVideoGenerattionAllCondition(video_config, value[1], value[0]); + if (res.code == 0) { + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, res); + return res; + } + for (let i = 0; i < value[0].length; i++) { + const element = value[0][i]; + this.global.requestQuene.enqueue(async () => { + await this.AutoGeneretionOneVide(element, video_config, value) + }, element, batch); + + // 添加队列后修改状态 + await this.pm.ModifyTaskStatus('out_folder', element, "video_queue"); + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, { + out_folder: element, + status: "video_queue" + }) + } + + this.global.requestQuene.setBatchCompletionCallback(batch, (failedTasks) => { + if (failedTasks.length > 0) { + let message = ` + 生成视频任务都已完成。 + 但是以下任务执行失败: + ` + failedTasks.forEach(({ taskId, error }) => { + message += `${taskId}-, \n 错误信息: ${error}` + '\n'; + }); + + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 0, + message: message + }) + } else { + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "所有生成视频任务已完成" + }) + } + }) + return { + code: 1 + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 检测生成视频条件的必要条件 + * @param {生成视频配置文件} video_config + * @param {生成视频的基础配置} simpleData + * @param {输出文件夹位置,为null,检查input文件里面的图片文件是不是和配置文件中的图片数量一致} out_folder + * @returns + */ + async CheckVideoGenerattionAllCondition(video_config, simpleData, out_folder) { + let message = ""; + if (video_config == null) { + video_config = JSON.parse(await fspromises.readFile(define.video_config, 'utf-8')); + } + // 基础信息检测 + if (video_config.audioSoundSize == null) { + message += "配音大小不能为空" + '\n'; + } + if (video_config.backgroundMusicSoundSize == null) { + message += "背景音乐音量大学不能为空" + '\n'; + } + if (video_config.video_resolution_x == null) { + message += "生成视频的宽度不能为空" + '\n'; + } + if (video_config.video_resolution_y == null) { + message += "生成视频的高度不能为空" + '\r\n'; + } + if (video_config.offsetValue == null) { + message += "视频的上下偏移量不能为空" + '\n'; + } + if (video_config.frameRate == null) { + message += "生成视频的帧率不能为空" + '\n'; + } + if (video_config.bitRate == null) { + message += "生成视频码率的不能为空" + '\n'; + } + + // 判断字幕列表中是不是有数据 + if (video_config.assConfig == null || video_config.assConfig.length <= 0) { + message += "字幕设置最少包含一条" + '\n'; + } + if (video_config.watermarkConfig == null || video_config.watermarkConfig.length <= 0) { + message += "水印设置最少包含一条" + '\n'; + } + // 判断背景音乐文件夹中是不是存在。并且检查其中是不是有音乐文件 + if (simpleData.background_music == "") { + message += "背景音乐文件夹路径不能为空" + '\n'; + } + // 判断背景音乐文件夹是不是存在 + if (await this.tools.checkExists(simpleData.background_music)) { + message += "背景音乐文件夹不存在" + '\n'; + } + // 判断里面是不是有MP3或者是wav + let clip_json = JSON.parse(await fspromises.readFile(define.clip_setting, 'utf-8'))["background_music_setting"]; + let background_music_obj = clip_json.filter(item => item.id == simpleData.background_music)[0]; + let mp3_file = await this.tools.getFilesWithExtensions(background_music_obj.folder_path, '.mp3'); + let wav_file = await this.tools.getFilesWithExtensions(background_music_obj.folder_path, '.wav'); + if (mp3_file.length <= 0 && wav_file.length <= 0) { + message += "背景文件夹中没有 MP3 或 WAV 文件" + '\n'; + } + + let config_path = path.join(this.global.config.project_path, 'scripts/config.json'); + let isE = await this.tools.checkExists(config_path); + if (!isE) { + message += "配置文件不存在。请先导入字幕文件。并调整时间轴。" + } else { + // 判断文案时间信息和图片信息是不是相同 + let config_json = JSON.parse(await fspromises.readFile(config_path, 'utf-8')); + let len = config_json["srt_time_information"].length; + if (out_folder == null) { + // 判断输入文件中的配置文件中的数量是不是对上 + let img_l = await this.tools.getFilesWithExtensions(path.join(this.global.config.project_path, "tmp/input_crop"), '.png'); + if (img_l.length != len) { + message += `input_crop 文件里面图片和文案信息对不上。检查是不是图片数量不对` + } + // 判断是不是有tag文件 + let tag_txt = await this.tools.getFilesWithExtensions(path.join(this.global.config.project_path, "tmp/input_crop"), '.txt'); + let c_j = await this.tools.getFilesWithExtensions(path.join(this.global.config.project_path, "tmp/input_crop"), '.json'); + if (tag_txt.length > 0) { + if (tag_txt.length != img_l.length) { + message += "反推的tag文件和图片的数量对不上。" + "\n"; + } + } else if (c_j.length > 0) { + if (c_j.length != img_l.length) { + message += "已存在的配置文件和图片的数量对不上。" + "\n"; + } + } else { + message += "好像没有反推呢" + "\n"; + } + } else { + // 判断当前的输入的 out_folder 中图片数量是不是可以和配置文件中能否对上 + for (let i = 0; i < out_folder.length; i++) { + const element = out_folder[i]; + let image_l = await this.tools.getFilesWithExtensions(path.join(this.global.config.project_path, "tmp/" + element), '.png'); + if (image_l.length != len) { + message += `${element} 文件里面图片和文案信息对不上。检查是不是图片数量不对` + } + } + } + } + if (message != '') { + let res = { + code: 0, + message: message + } + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, res) + return res; + } + return { + code: 1, + } + } +} \ No newline at end of file diff --git a/src/main/backPrompt/writing.js b/src/main/backPrompt/writing.js new file mode 100644 index 0000000..17f03eb --- /dev/null +++ b/src/main/backPrompt/writing.js @@ -0,0 +1,301 @@ +let path = require("path"); +let fspromises = require("fs").promises; +import { Tools } from "../tools"; +import { DEFINE_STRING } from "../../define/define_string"; +import { PublicMethod } from "../Public/publicMethod"; +import { define } from "../../define/define"; +import { get, has } from "lodash"; +import { ClipSetting } from "../../define/setting/clipSetting"; +const { v4: uuidv4 } = require('uuid'); // 引入UUID库来生成唯一标识符 +let tools = new Tools(); + +export class Writing { + constructor(global) { + this.global = global + this.pm = new PublicMethod(global); + } + + /** + * 将文案信息写入到本地的文案文件中 + * @param {*} value + */ + async SaveWordTxt(value) { + try { + let word_path = path.join(global.config.project_path, "文案.txt"); + await tools.writeArrayToFile(value, word_path); + return { + code: 1, + message: "保存成功" + } + } catch (error) { + throw new Error(error); + } + } + + /** + * 将分镜的时间信息添加道配置文件中 + * @param {*} value 是一个数组,0 :写入的数据 1:写入的属性 2:是否需要解析 + */ + async SaveCopywritingInformation(value) { + try { + return await this.pm.SaveConfigJsonProperty(value); + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 获取Config.json文件中指定的属性 + * @param {Array} value 传入的值 0 : 需要获取的属性 1: 返回的默认值 + * @returns + */ + async GetConfigJson(value) { + try { + return await this.pm.GetConfigJson(value, false); + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 获取当前项目下面的文案 + */ + async GetProjectWord() { + try { + // 先判断当前的项目文件下面是不是又配置文件。没有才读取文案 + let srt_config_path = path.join(global.config.project_path, "scripts/config.json"); + let isExist = await tools.checkExists(srt_config_path); + let data = null; + let isImformation = false; + if (isExist) { + let config_1 = JSON.parse(await fspromises.readFile(srt_config_path)); + isImformation = has(config_1, 'srt_time_information'); + if (isImformation) { + data = JSON.parse(await fspromises.readFile(srt_config_path)).srt_time_information; + } + } + + if (!isExist || !isImformation) { + let word_path = path.join(global.config.project_path, "文案.txt"); + let isExistWord = await tools.checkExists(word_path); + if (!isExistWord) { + return { + code: 0, + message: "没有文案文件" + } + } + let data = await fspromises.readFile(word_path, { encoding: 'utf-8' }); + let lines = data.split(/\r?\n/); + // 打印或返回这个数组 + // console.log(lines); + // 判断是不是有洗稿后的文件 + let new_srt_path = path.join(global.config.project_path, "new_word.txt"); + let isExistAfterGPTWord = await tools.checkExists(new_srt_path); + let after_data = null; + if (isExistAfterGPTWord) { + after_data = (await fspromises.readFile(new_srt_path, { encoding: 'utf-8' })).split(/\r?\n/); + } + // 判断抽帧文件是不是存在 + // 返回图片信息 + let old_image_path_list = await tools.getFilesWithExtensions(path.join(global.config.project_path, "tmp/input_crop"), '.png'); + let res = []; + let lastId = ''; + // 处理数据 + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + let id = uuidv4(); + let after_gpt = null; + if (after_data != null) { + after_gpt = after_data[i]; + } + + let img_path = null; + if (old_image_path_list != null) { + img_path = old_image_path_list[i]; + } + let obj = { + no: i + 1, + id: id, + lastId: lastId, + word: line, + old_image: img_path, + after_gpt: after_gpt, + start_time: null, + end_time: null, + timeLimit: null, + subValue: [] + } + res.push(obj); + lastId = id; + } + return { + code: 1, + type: 0, + data: res + } + } else { + let data = JSON.parse(await fspromises.readFile(srt_config_path)).srt_time_information; + return { + code: 1, + type: 1, + data: data + } + } + + } catch (error) { + throw new Error(error); + } + } + + /** + * 搭导入srt。然后加载时间轴。完全匹配失败的将会还是会导入然后手动手动切换 + * @param {文案洗稿界面信息} textData + */ + async ImportSrtAndGetTime(data) { + let textData = data[0]; + let init_num = textData.length; + let srt_path = data[1]; + let current_text = ""; + try { + if (!srt_path) { + // 获取项目下面的所有的srt + let srtfiles = await tools.getFilesWithExtensions(global.config.project_path, '.srt'); + if (srtfiles.length <= 0) { + throw new Error("没有SRT文件"); + } + srt_path = srtfiles[0]; + } + let srt_data = (await fspromises.readFile(srt_path, 'utf-8')).toString("utf-8"); + const entries = srt_data.replace(/\r\n/g, '\n').split('\n\n'); + let data = entries.map(entry => { + const lines = entry.split('\n'); + if (lines.length >= 3) { + const times = lines[1]; + const text = lines.slice(2).join(' '); + const [start, end] = times.split(' --> ').map(time => { + const [hours, minutes, seconds] = time.split(':'); + const [sec, millis] = seconds.split(','); + return ((parseInt(hours) * 3600 + parseInt(minutes) * 60 + parseInt(sec)) * 1000 + parseInt(millis)); + }); + return { start, end, text, id: uuidv4() }; + } + }).filter(entry => entry); + // 开始匹配(洗稿后的) + let srt_list = []; + let srt_obj = null + let text_count = 0; + let tmp_str = ""; + for (let i = 0; i < data.length;) { + let srt_value = data[i].text; + current_text = `字幕: “${srt_value}” 和文案第${text_count + 1} 行数据 “${textData[text_count].after_gpt}” 数据不匹配(检查一下上下文)`; + let start_time = data[i].start; + let end_time = data[i].end; + let obj = { + start_time, + end_time, + srt_value, + id: data[i].id + }; + // 判断当前字幕是不是在当前句 + // 不能用简单的包含,而是将数据进行去除特殊符号拼接后判断是不是相同 + tmp_str += srt_value; + if (tools.removePunctuationIncludingEllipsis(textData[text_count].after_gpt).startsWith(tools.removePunctuationIncludingEllipsis(tmp_str))) { + if (srt_obj == null) { + srt_obj = {} + srt_obj.id = uuidv4(); + srt_obj.start_time = start_time; + srt_obj.value = srt_value; + srt_obj.subValue = [obj]; + } + else { + srt_obj.value = srt_obj.value + srt_value; + srt_obj.subValue = [...srt_obj.subValue, obj]; + } + textData[text_count].start_time = srt_obj.start_time; + textData[text_count].subValue = srt_obj.subValue + srt_list.push(obj); + i++; + } else { + // 判断下一句文件是不是以当当前巨开头。是的话继续。不是的话。直接返回后面的所有信息 + if (tools.removePunctuationIncludingEllipsis(textData[text_count + 1].after_gpt).startsWith(tools.removePunctuationIncludingEllipsis(srt_value))) { + textData[text_count].end_time = srt_list[srt_list.length - 1].end_time; + text_count++; + srt_obj = null; + tmp_str = "" + } else { + // 将下面的数据直接 添加到textData后面。 + // 修改当前行数据的结束事件为 + if (srt_list.length > 0) { + textData[text_count].end_time = srt_list[srt_list.length - 1].end_time; + text_count++; + } + // 将后面的数据直接添加 + let lastId = textData[textData.length - 1].id; + for (let j = i; j < data.length; j++) { + // 直接修改原有数据 + if (text_count < init_num) { + textData[text_count].subValue = [{ + start_time: data[j].start, + end_time: data[j].end, + id: data[j].id, + srt_value: data[j].text + }] + textData[text_count].start_time = data[j].start; + textData[text_count].end_time = data[j].end; + text_count++; + } + else { + let id = uuidv4(); + // 添加 + let obj = { + no: j + 1, + id: id, + word: null, + lastId: lastId, + old_image: path.normalize(define.zhanwei_image), + after_gpt: null, + start_time: data[j].start, + end_time: data[j].end, + subValue: [{ + start_time: data[j].start, + end_time: data[j].end, + id: data[j].id, + srt_value: data[j].text + }] + } + lastId = id; + textData.push(obj); + } + } + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 0, + message: current_text + }) + return { + code: 1, + data: textData + } + } + } + } + // 最后对齐 + textData[textData.length - 1].end_time = srt_list[srt_list.length - 1].end_time + // 返回数据 + return { + code: 1, + data: textData + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } +} \ No newline at end of file diff --git a/src/main/discord/discordApi.js b/src/main/discord/discordApi.js new file mode 100644 index 0000000..9550ab1 --- /dev/null +++ b/src/main/discord/discordApi.js @@ -0,0 +1,490 @@ +const axios = require('axios'); +// import { Midjourney as mApi} from "midjourney"; +// const MJapi2 = require('midjourney'); +// const { midjourney } = require('midjourney') +// const Midjourney = require('midjourney'); +// ES5 的模块引入方式 +const fetch = require("node-fetch"); + +// ES6 的模块引入方式 +// import fetch from "node-fetch"; + +export class DiscordAPI { + constructor(mj_setting) { + // https://discord.com/api/v9/channels/1208362852482809939/messages?limit=20 + this.apiClient = axios.create({ + baseURL: 'https://discord.com' + }); + this.DiscordBaseUrl = 'https://discord.com'; + this.ServerId = mj_setting.serviceID; + this.ChannelId = mj_setting.channelID; + this.userToken = mj_setting.token; + this.botId = mj_setting.select_robot?.botId; + this.commandId = mj_setting.select_robot?.commandId; + this.versionId = mj_setting.select_robot?.versionId; + this.versionName = mj_setting.select_robot?.versionName; + this.botName = mj_setting.select_robot?.botName; + } + + // 提交任务 + async imagine(data) { + + // let req_data = { + // "token": this.userToken, + // "method": "post", + // "api_url": "/mj/submit/imagine", + // "data":data + // } + + // const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + // await this.interactions(data.prompt); + return await this.interactions(data.prompt) + // return { + // code:1, + // result:'taskid_'+new Date().getTime() + // } + // return response.data; + + } + async channelList() { + axios.get(`https://discord.com/api/v9/channels/${this.ChannelId}/messages?limit=20`, { + method: 'get', + headers: { + "Authorization": this.userToken + } + }) + .then(response => { + // 请求成功处理 + console.log(typeof response.data); + let eList = [] + let flg = false; + let job_id = ''; + let type = ''; + if (response && response.data) { + try { + response.data.forEach(element => { + flg = false; + type = ''; + if (element.attachments && element.attachments.length) { + const arr = element.attachments[0].filename.split("_"); + job_id = arr[arr.length - 1].replace(".png", ''); + if (element.components) { + element.components.forEach(e2 => { + e2.components.forEach(e3 => { + if (e3.label == 'U1') { + flg = true; + type = 'U1' + } else if (e3.label && e3.label.indexOf('Upscale') > -1) { + flg = true; + type = 'Upscale' + } + }) + }); + } + let t = eList.find((e) => { + return e.filename == element.attachments[0].filename; + }) + + if (!t) { + eList.push( + { + flg: flg, job_id: job_id, filename: element.attachments[0].filename, + url: element.attachments[0].url, + proxy_url: element.attachments[0].proxy_url, + type: type, + timestamp: element.timestamp + }) + } + + // console.log({flg:flg,job_id:job_id,filename:element.attachments[0].filename}) + } else { + console.log({ flg: flg }) + } + + }); + } catch (error) { + console.log('异常2', error) + } + // console.log(eList) + // 8e7406df-bf0c-4e3d-8e49-b2bb8e2c263d + // 5abedc71-ba80-4756-8ddc-489c927d3acd + } + }).catch(error => { + // 请求失败处理 + console.error(error); + }); + } + // 混合 + async blend(data) { + + let req_data = { + "token": this.userToken, + "method": "post", + "api_url": "/mj/submit/blend", + "data": data + } + + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + return response.data; + + } + + + // 反推 + async describe(data) { + + let req_data = { + "token": this.userToken, + "method": "post", + "api_url": "/mj/submit/describe", + "data": data + } + + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + return response.data; + + } + + // 获取任务 + async getTaskId(task_id) { + let req_data = { + "token": this.userToken, + "method": "get", + "api_url": `/mj/task/${task_id}/fetch`, + "data": {} + } + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + return response.data; + } + + //获取seed + async imageSeed(task_id) { + let req_data = { + "token": this.userToken, + "method": "get", + "api_url": `/mj/task/${task_id}/image-seed`, + "data": {} + } + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + return response.data; + + } + + //账号创建 + async account_create(data) { + let req_data = { + "token": this.userToken, + "method": "post", + "api_url": '/mj/account/create', + "data": data + } + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data, { timeout: 20000 }); + return response.data; + } + + //账号创建 + async account_fetch(cid) { + let req_data = { + "token": this.userToken, + "method": "get", + "api_url": `/mj/account/${cid}/fetch`, + "data": {} + } + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + return response.data; + + } + + //账号同步信息 + async account_asyn_info(cid) { + let req_data = { + "token": this.userToken, + "method": "post", + "api_url": `/mj/account/${cid}/sync-info`, + "data": {} + } + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data, { timeout: 20000 }); + return response.data; + } + + //账号删除信息 + async account_del_info(cid) { + let req_data = { + "token": this.userToken, + "method": "delete", + "api_url": `/mj/account/${cid}/delete`, + "data": {} + } + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + return response.data; + } + + + //执行动作 + async action(data) { + let req_data = { + "token": this.userToken, + "method": "post", + "api_url": '/mj/submit/action', + "data": data + } + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + return response.data; + } + + // 确认弹窗 + async modal(data) { + let req_data = { + "token": this.userToken, + "method": "post", + "api_url": '/mj/submit/modal', + "data": data + } + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + return response.data; + + } + + async interactions(prompt) { + // 直接自己调用 + prompt = prompt.trim(); + // prompt = "4k,8k,best quality, masterpiece, woman, divorced, leaving fast-paced city life, serene expression, walking away from cityscape, bustling streets, entering tranquil countryside, peaceful surroundings, rejuvenating atmosphere, , --niji 5 --ar 4:3" + var payload = {}; + if (this.botName == 'niji') { + payload = { + "type": 2, + "application_id": this.botId, + "guild_id": this.ServerId, + "channel_id": this.ChannelId, + "session_id": this.userToken, + "data": { + "version": this.versionId, + "id": this.commandId, + "name": "imagine", + "type": 1, + "options": [ + { + "type": 3, + "name": "prompt", + "value": prompt + } + ], + "application_command": { + "id": this.commandId, + "type": 1, + "application_id": this.botId, + "version": this.versionId, + "name": "imagine", + "description": "Create images with Midjourney", + "options": [ + { + "type": 3, + "name": "prompt", + "description": "The prompt to imagine", + "required": true, + "description_localized": "The prompt to imagine", + "name_localized": "prompt" + } + ], + "integration_types": [ + 0 + ], + "global_popularity_rank": 1, + "description_localized": "Create images with Midjourney", + "name_localized": "imagine" + }, + "attachments": [ + + ] + }, + // "nonce": "1210857131343872000", + "analytics_location": "slash_ui" + } + } else { + payload = { + "type": 2, + // "application_id":"1022952195194359889",//niji + "application_id": this.botId, + "guild_id": this.ServerId, + "channel_id": this.ChannelId, + "session_id": this.userToken, + "data": { + "version": this.versionId, + "id": this.commandId, + "name": "imagine", "type": 1, + "options": + [{ + "type": 3, + "name": "prompt", + "value": prompt + }], + "application_command": { + "id": this.commandId, + "type": 1, + "application_id": this.botId, + "version": this.versionId, + "name": "imagine", + "description": "Create images with Niji journey", + "options": [{ "type": 3, "name": "prompt", "description": "The prompt to imagine", "required": true, "description_localized": "The prompt to imagine", "name_localized": "prompt" }], + "integration_types": [0], "global_popularity_rank": 1, "description_localized": "Create images with Niji journey", "name_localized": "imagine" + }, + "attachments": [] + }, + "analytics_location": "slash_ui" + } + } + + let response = { + status: 200, + data: {} + }; + + + try { + const headers = { + "Content-Type": "application/json", + Authorization: this.userToken, + }; + await fetch(`${this.DiscordBaseUrl}/api/v9/interactions`, { + method: "POST", + body: JSON.stringify(payload), + headers: headers, + }).then(res => res.json()).then(res => { + response.data = res; + }).catch(e => { + console.error("请求失败了,详细信息:" + JSON.stringify(e)); + response = { + status: 500, + data: JSON.stringify(e) + }; + }); + console.log('response结果') + console.log(response) + // if (response.status == 204) { + // //成功 + + // } + if (response.status >= 400) { + console.error("api.error.config", { + payload: JSON.stringify(payload) + }); + } + return { + code: response.status, + response: response + }; + } + catch (error) { + console.error(error); + return 500; + } + return; + const client = new Midjourney.Midjourney({ + ServerId: this.ServerId, + ChannelId: this.ChannelId, + SalaiToken: this.userToken, + Debug: true, + fetch: fetch, + Ws: true, //enable ws is required for remix mode (and custom zoom) + }); + await client.init(); + console.log('mjmj_begin2', prompt); + // const prompt = + // "Christmas dinner with spaghetti with family in a cozy house, we see interior details , simple blue&white illustration"; + //imagine + const Imagine = await client.Imagine( + prompt, + (uri, progress) => { + client.Close(); + + console.log("loading", uri, "progress", progress); + return + } + ); + console.log(Imagine); + if (!Imagine) { + console.log("no message"); + console.log('mjmj_end2') + return; + } + console.log('mjmj_end') + client.Close(); + return + + } + + /** + * 获取频道内的机器人 + * @returns 返回机器人列表 + */ + async getBotList() { + try { + + const headers = { + 'Host': 'discord.com', + 'Connection': 'keep-alive', + 'authorization': this.userToken, + } + + await fetch('https://discord.com/api/v9/guilds/1182523906855284826/application-command-index', { + method: 'GET', + headers: headers, + }) + .then(response => { + response.json() + } + ) + .then(data => { + console.log(data) + }) + .catch(error => { + console.error('Error:', error) + }) + + + } catch (error) { + throw new Error(error); + } + } + + + async getMjMsgList() { + // const headers = { + // "Content-Type": "application/json", + // Authorization:this.userToken, + // }; + let response = { + status: 200, + data: {} + }; + // // `https://discord.com/api/v9/channels/${mj_channelId}/messages?limit=10 + // await fetch(`${this.DiscordBaseUrl}/api/v9/channels/${this.ChannelId}/messages?limit=50`, { + // method: "GET", + // headers: headers, + // }).then(res => res.json()).then(res => { + // response.data=res; + // }).catch(e => { + // console.error("请求失败了,详细信息:" + JSON.stringify(e)); + // response ={ + // status:500, + // data:JSON.stringify(e) + // }; + // }); + // console.log('getMjMsgList_response结果') + // // console.log(response) + + // return response; + axios.get(`https://discord.com/api/v9/channels/${this.ChannelId}/messages?limit=20`, { + method: 'get', + headers: { + "Authorization": this.userToken + } + }).then(res => { + response.data = res; + }).catch(error => { + // 请求失败处理 + console.error(error); + }); + + } +} diff --git a/src/preload/discordIndex.js b/src/preload/discordIndex.js new file mode 100644 index 0000000..4c771c9 --- /dev/null +++ b/src/preload/discordIndex.js @@ -0,0 +1,28 @@ +import { contextBridge, ipcRenderer } from 'electron' +import { DEFINE_STRING } from '../define/define_string.js'; +// Custom APIs for renderer + +let events = []; +const api = { + // 创建MJ消息 + CreateMessage: (value) => ipcRenderer.send(DEFINE_STRING.DISCORD.CREATE_MESSAGE, value), + + // MJ消息更新 + UpdateMessage: (value) => ipcRenderer.send(DEFINE_STRING.DISCORD.UPDATE_MESSAGE, value), + + // MJ消息删除 + DeleteMessage: (value) => ipcRenderer.send(DEFINE_STRING.DISCORD.DELETE_MESSAGE, value), +} +// Use `contextBridge` APIs to expose Electron APIs to +// renderer only if context isolation is enabled, otherwise +// just add to the DOM global. +if (process.contextIsolated) { + try { + contextBridge.exposeInMainWorld('api', api) + } catch (error) { + console.error(error) + } +} else { + window.api = api +} +