丹青识画代码实例:Python调用API实现‘铺卷-参详-点睛-获墨’
丹青识画代码实例:Python调用API实现‘铺卷-参详-点睛-获墨’
想象一下,你拍了一张照片,上传后,屏幕上不是冷冰冰的“检测到:人、树、天空”,而是一行行如行云流水般的行草书法,为你题写“远山含黛,佳人独立,风拂青丝,意境悠远”。这不是幻想,而是「丹青识画」智能影像雅鉴系统带来的真实体验。
它把AI的图像识别能力,包装进了一场充满东方美学的仪式里。今天,我们不谈高深的理论,就手把手教你如何用几行Python代码,亲自体验这场“铺卷、参详、点睛、获墨”的数字艺术之旅,让你自己的程序也能“以科技之眼,点画意之睛”。
1. 环境准备:铺开你的数字“宣纸”
在开始挥毫泼墨之前,我们需要准备好“文房四宝”——也就是编程环境。整个过程非常简单,就像安装一个普通的软件。
1.1 安装必要的工具
首先,确保你的电脑上已经安装了Python(建议版本3.8或以上)。然后,打开你的命令行工具(Windows上是CMD或PowerShell,Mac/Linux上是终端),输入以下命令来安装我们唯一需要的“画笔”——requests库。这个库能帮助我们的程序与「丹青识画」的云端“大脑”对话。
pip install requests如果安装成功,你会看到类似“Successfully installed requests”的提示。这就好比墨已研好,纸已铺平。
1.2 获取你的“印章”(API密钥)
任何一位书画名家都有自己的印章。「丹青识画」系统也需要一个专属的“印章”来验证你的身份,这就是API密钥(Access Key)和密钥密码(Secret)。
通常,你需要访问「丹青识画」的官方平台(例如其提供的控制台或合作伙伴入口)进行注册或申请试用。成功后会获得类似下面的一对字符串:
- Access Key ID: 类似
LTAI5tYourAccessKeyHere - Access Key Secret: 类似
YourSuperLongSecretKeyStringHere
请妥善保管它们,就像保管好你的私人印章一样。我们接下来的所有“创作”都需要用它来落款。
2. 核心流程:四步完成AI艺术鉴赏
「丹青识画」的体验流程被精妙地设计为四个步骤,我们的代码也将严格遵循这个优雅的仪式。整个过程的核心,是向一个特定的云端地址(API端点)发送请求并接收回执。
2.1 第一步:铺卷 (Upload Image)
“铺卷”即上传你想要鉴赏的图片。在代码中,我们需要将图片文件转换为程序能够发送的格式。
这里的关键是,图片需要先经过Base64编码。你可以把它理解为将图片的“视觉语言”翻译成一段长长的“文本语言”,这样它才能通过网络“寄送”出去。
import base64 import requests import json from datetime import datetime import hmac import hashlib from urllib.parse import quote_plus # ========== 第一步:铺卷 - 准备画作 ========== def prepare_image(image_path): """ 将本地图片文件转换为Base64编码的字符串。 :param image_path: 图片文件的本地路径,例如 './my_painting.jpg' :return: Base64编码后的字符串 """ with open(image_path, 'rb') as image_file: image_data = image_file.read() # 将二进制图片数据编码为Base64字符串,并解码为普通字符串以便传输 base64_str = base64.b64encode(image_data).decode('utf-8') print(f"画作 '{image_path}' 已铺卷完成。") return base64_str # 使用示例:替换为你的图片路径 image_base64 = prepare_image('./你的图片.jpg')2.2 第二步:参详与点睛 (Analyze & Generate)
“参详”是系统理解图片内容,“点睛”则是触发生成书法描述。这两个动作在API调用中通常是一次完成的。我们需要构造一个规范的请求,其中包含我们的“印章”(签名)和画作信息。
下面的代码展示了如何构造这个带有签名的请求。签名过程稍复杂,是为了保证请求的安全性和完整性,你可以把它理解为在信函上加盖防伪印章。
# ========== 第二步:参详与点睛 - 发送请求 ========== def call_danqing_api(image_base64_str, access_key_id, access_key_secret): """ 调用丹青识画API,完成参详(图像分析)与点睛(生成描述)。 """ # API的云端地址(请根据官方文档替换为实际Endpoint) api_url = "https://danqing.cn-beijing.aliyuncs.com/image/analyze" # 准备请求的正文(Body),即告诉API我们要做什么 body = { "image": image_base64_str, # 我们刚刚编码好的画作 "style": "行草", # 指定书法风格,如“行草”、“楷书” "format": "html" # 返回结果的格式,可以是纯文本或带样式的html } # --- 开始制作“签名”(核心安全步骤)--- # 1. 准备签名用的字符串 http_method = 'POST' accept = 'application/json' content_type = 'application/json' # 处理URL中的特殊字符 url_encoded = quote_plus(api_url) # 2. 生成时间戳,确保每次请求唯一 gmt_date = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT') # 3. 构造待签名的原始字符串(一个特定格式的拼接) string_to_sign = f"{http_method}\n{accept}\n{content_type}\n{gmt_date}\n{url_encoded}" # 4. 使用你的密钥(Secret)对上一步的字符串进行HMAC-SHA256加密 signature = hmac.new(access_key_secret.encode('utf-8'), string_to_sign.encode('utf-8'), hashlib.sha256).digest() # 5. 将加密结果再进行Base64编码,得到最终的签名 signature_base64 = base64.b64encode(signature).decode('utf-8') # --- 签名制作完成 --- # 准备请求头(Headers),包含签名、时间、密钥ID等信息 headers = { 'Accept': accept, 'Content-Type': content_type, 'Date': gmt_date, 'Authorization': f'Dataplus {access_key_id}:{signature_base64}' } print("正在钤印、发送请求...") # 发送POST请求到API response = requests.post(api_url, headers=headers, data=json.dumps(body)) # 检查响应状态 if response.status_code == 200: print("点睛之笔已完成!") return response.json() # 返回API的JSON格式结果 else: print(f"请求失败,状态码:{response.status_code}") print(f"错误信息:{response.text}") return None # 使用示例:替换为你自己的密钥 access_key_id = '你的AccessKey ID' access_key_secret = '你的AccessKey Secret' result = call_danqing_api(image_base64, access_key_id, access_key_secret)2.3 第三步:获墨 (Get Result)
“获墨”就是接收并欣赏系统生成的书法题跋。API的响应是一个结构化的数据,我们需要从中提取出我们想要的文字内容。
# ========== 第三步:获墨 - 解析与展示 ========== def display_result(api_response): """ 解析API返回的结果,并优雅地展示出来。 """ if api_response and api_response.get('success'): data = api_response.get('data', {}) # 提取生成的书法描述文本 calligraphy_text = data.get('description', '') # 提取使用的书法风格 style_used = data.get('style', '未知') print("\n" + "="*50) print("「丹青识画」雅鉴完成") print("="*50) print(f"书法风格:{style_used}") print("-"*30) print("生成题跋:") # 打印题跋内容,这里模拟一种竖排的视觉感(实际HTML格式会更美观) for line in calligraphy_text.split('。'): if line.strip(): print(f" {line.strip()}。") print("="*50) # 通常API还会返回一个渲染好的HTML或图片URL,可以直接在浏览器中打开查看书法效果 preview_url = data.get('preview_url') if preview_url: print(f"\n✨ 艺术化预览已生成,可点击链接查看:\n{preview_url}") else: print("未能获取到有效的题跋。") print(f"详细响应:{api_response}") # 展示我们获得的结果 display_result(result)3. 完整示例:从图片到题跋
让我们把上面的步骤串联起来,形成一个完整的、可以运行的脚本。你只需要替换三个地方:图片路径、AccessKey ID和Secret。
# danqing_demo.py import base64 import requests import json from datetime import datetime import hmac import hashlib from urllib.parse import quote_plus # 配置信息 - 请修改这里! CONFIG = { 'IMAGE_PATH': './example_landscape.jpg', # 你的图片路径 'ACCESS_KEY_ID': 'LTAI5tYourAccessKeyHere', # 你的AccessKey ID 'ACCESS_KEY_SECRET': 'YourSuperLongSecretKeyStringHere', # 你的AccessKey Secret 'API_ENDPOINT': 'https://danqing.cn-beijing.aliyuncs.com/image/analyze' # API地址 } def full_danqing_process(): """完整的丹青识画四步流程""" print("开始「丹青识画」智能雅鉴流程...") print("="*60) # 1. 铺卷 try: with open(CONFIG['IMAGE_PATH'], 'rb') as f: image_b64 = base64.b64encode(f.read()).decode('utf-8') print(f"[铺卷] 成功加载画作: {CONFIG['IMAGE_PATH']}") except FileNotFoundError: print(f"[错误] 找不到图片文件,请检查路径: {CONFIG['IMAGE_PATH']}") return # 2. 构造请求(参详 & 点睛) body = {"image": image_b64, "style": "行草", "format": "text"} # 签名计算 http_method, accept, content_type = 'POST', 'application/json', 'application/json' gmt_date = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT') url_encoded = quote_plus(CONFIG['API_ENDPOINT']) string_to_sign = f"{http_method}\n{accept}\n{content_type}\n{gmt_date}\n{url_encoded}" signature = hmac.new(CONFIG['ACCESS_KEY_SECRET'].encode('utf-8'), string_to_sign.encode('utf-8'), hashlib.sha256).digest() signature_b64 = base64.b64encode(signature).decode('utf-8') headers = { 'Accept': accept, 'Content-Type': content_type, 'Date': gmt_date, 'Authorization': f'Dataplus {CONFIG["ACCESS_KEY_ID"]}:{signature_b64}' } print("[参详] AI正在感知画中意象...") print("[点睛] 触发书法生成...") # 3. 发送请求 try: resp = requests.post(CONFIG['API_ENDPOINT'], headers=headers, data=json.dumps(body), timeout=30) resp.raise_for_status() # 如果请求失败则抛出异常 result = resp.json() except requests.exceptions.RequestException as e: print(f"[错误] 网络请求失败: {e}") return except json.JSONDecodeError: print("[错误] 解析API响应失败。") return # 4. 获墨 print("[获墨] 已收到AI题跋。") print("-"*60) if result.get('success'): desc = result.get('data', {}).get('description', '无描述') print("生成题跋:") for sentence in desc.replace('。', '。\n').split('\n'): if sentence.strip(): print(f" {sentence.strip()}") print("-"*60) print("雅鉴流程圆满结束。") else: print(f"API返回错误: {result.get('message', '未知错误')}") if __name__ == '__main__': full_danqing_process()运行这个脚本,你就能在终端看到属于你那张图片的、充满诗意的书法描述了。
4. 进阶技巧与场景设想
掌握了基础调用后,你可以玩出更多花样,让这个工具真正为你所用。
4.1 处理常见问题
- 图片太大怎么办?API通常有图片大小限制(如5MB)。在上传前,可以先压缩图片。
from PIL import Image import io def compress_image(image_path, max_size_kb=5000): """压缩图片至指定大小以下""" img = Image.open(image_path) # 转换为RGB模式(避免RGBA问题),并调整尺寸或质量 if img.mode in ('RGBA', 'LA'): background = Image.new('RGB', img.size, (255, 255, 255)) background.paste(img, mask=img.split()[-1] if img.mode == 'RGBA' else None) img = background # 保存为JPEG并控制质量 buffer = io.BytesIO() img.save(buffer, format='JPEG', quality=85) if buffer.tell() < max_size_kb * 1024: return buffer.getvalue() else: # 如果还太大,可以进一步调整尺寸 new_width = int(img.width * 0.8) new_height = int(img.height * 0.8) img = img.resize((new_width, new_height), Image.Resampling.LANCZOS) buffer = io.BytesIO() img.save(buffer, format='JPEG', quality=80) return buffer.getvalue() - 如何批量处理图片?用一个循环即可。
import os image_folder = './photos/' for filename in os.listdir(image_folder): if filename.lower().endswith(('.png', '.jpg', '.jpeg')): full_path = os.path.join(image_folder, filename) print(f"\n处理图片: {filename}") # 调用上面定义的 full_danqing_process 或相关函数 # ... 处理逻辑 ...
4.2 探索应用场景
代码跑通后,你可以将它集成到各种有趣的项目中:
- 个人照片管理工具:写一个脚本,遍历你的旅行相册,为每一张照片生成一句独特的诗词描述,并重命名文件或存入数据库。
- 社交媒体自动配文:结合社交媒体API(如微博、小红书开放平台),在你发布图片时,自动调用「丹青识画」生成富有文采的配文。
- 数字艺术装置:在树莓派等微型电脑上运行这个程序,连接一个摄像头和一个小屏幕。参观者站在镜头前,系统实时为他的剪影或姿态生成一句书法题跋,打造互动艺术体验。
- 内容创作助手:自媒体作者可以用它快速为文章配图生成意境解说,提升内容格调。
5. 总结
通过本文,我们完成了一次从技术调用到艺术体验的旅程。你不仅学会了如何用Python代码与「丹青识画」这样的AI艺术系统对话,更理解了其背后“铺卷-参详-点睛-获墨”这一充满仪式感的交互设计哲学。
关键点回顾:
- 核心流程清晰:整个过程本质是准备图片、构造安全请求、调用API、解析结果四步。
- 签名是关键:HMAC-SHA256签名是确保API调用安全的通用方式,需要严格按照服务商提供的规则生成。
- 结果即艺术:API返回的不再是枯燥的数据,而是可直接用于展示的、富含美学的文本或HTML。
- 集成无限可能:这段基础的调用代码可以成为你无数创意项目的起点。
技术的价值在于应用。现在,你已经掌握了让程序“看懂”图片并“赋诗”的能力。接下来,就是发挥你的想象力,将这份数字墨香,挥洒到更广阔的场景中去。不妨就从为你电脑里最珍贵的一张照片,生成第一幅AI题跋开始吧。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
