ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AI辅助开发实战:用Python重做一个mini版Photoshop

AI辅助开发实战:用Python重做一个mini版Photoshop

最近技术社区和设计圈都在讨论一件事:Adobe 更新应用内许可条款后,不少开发者担心“用 AI 辅助开发软件”会撞上版权红线;随后 Adobe 官方人员在社区公开回应,表示不会对使用 AI 辅助开发的非商业开源替代品采取法律行动,前提是不使用 Adobe 的字体、图标和品牌资产。这个表态一出,“开发者靠 AI 重做 Adobe 七件套”的话题迅速登上各大技术社区热榜。

所谓“Adobe 七件套”,通常包含 Photoshop、Premiere Pro、After Effects、Illustrator、Lightroom、InDesign 和 Acrobat,覆盖了位图编辑、矢量绘图、视频剪辑、特效合成、摄影后期、版式编排和 PDF 处理,是设计和创意行业的基础设施。如果这套软件真的能被开源替代品逐步替换,那对设计师、开发者和中小企业都意义重大。

这篇文章就围绕这件事展开,梳理事件背景、技术可行性,并带着大家走一遍“用 AI 辅助开发一个 mini 版 Photoshop”的完整实战流程。无论你是想进设计工具赛道的开发者,还是想了解 AI 辅助开发工作流的工程师,都可以从中获得一套可复制的方法。

1. 事件背景:从“条款争议”到“重做七件套”

1.1 这件事是怎么发生的

Adobe 的产品在创意行业几乎是“默认工具”。无论是平面设计、视频剪辑还是 UI 设计,团队协作都是围绕 Adobe 生态展开的。正因为覆盖面广,Adobe 的任何条款变化都会引发连锁反应。

近期讨论的焦点是 Adobe 更新了部分应用内的许可协议,其中涉及生成式 AI、自动化脚本和数据使用等表述。部分条款写得比较宽泛,开发者和设计师都开始担心:如果我用 AI 写代码、训练模型,甚至直接开发一个替代 Photoshop 的工具,会不会被 Adobe 追责?

随后 Adobe 官方在社区回应,核心意思可以概括为:Adobe 不会针对使用 AI 辅助开发的非商业开源替代品发起法律行动,但底线是不能使用 Adobe 的字体、图标、品牌资产以及受保护的专有算法。这个回应算是给开源社区“松了绑”,也直接刺激了“开发者靠 AI 重做七件套”的讨论。

1.2 为什么偏偏是“七件套”

“七件套”之所以被单独拎出来说,是因为它们不是一个孤立的软件,而是一整套设计工作流:

软件核心功能用户群体
Photoshop位图编辑、合成、修图平面设计师、摄影师、UI 设计师
Illustrator矢量图形绘制插画师、品牌设计师
Premiere Pro视频剪辑视频创作者、影视后期
After Effects动效与视觉特效合成动态设计师、影视包装
Lightroom摄影后期管理与调色摄影师
InDesign书籍、杂志版式设计编辑、排版设计师
AcrobatPDF 创建与编辑办公人员、出版行业

这七款软件互相配合,形成了从“素材处理”到“成品输出”的闭环。如果只是替换其中一款,用户并不会真正迁移;只有整套替代方案成熟,生态才会松动。所以“重做七件套”这个目标,本质上是在挑战 Adobe 的生态壁垒。

1.3 事件背后的技术信号

这件事表面上是版权和商业之争,底层其实是生成式 AI 带来的开发效率跃迁。

放在三年前,一个独立开发者想重做 Photoshop 的某个核心功能,需要从零学习图像处理算法、UI 框架、插件系统和编译发布流程,没有半年根本出不了可用的 Demo。而现在,借助 AI 辅助编码工具,一个熟悉 Python 的开发者可以在几天内搭建出包含基础滤镜、图层操作和选区编辑的桌面工具。

也就是说,AI 让“一个人重做一个小型设计软件”从不可能变成了可能。虽然距离完整的 Photoshop 还有很大差距,但已经足够形成技术讨论和实验项目。

2. 用 AI 重建设计软件,技术上可行吗

2.1 四个层面的可行性

用 AI 重做设计软件,可以从四个层面来看:

第一,图像处理算法。Photoshop 的核心能力是滤镜、选区、蒙版、图层混合模式、色彩管理。这些底层算法大部分在 OpenCV、Pillow、scikit-image 等开源库中已经实现。AI 的价值在于快速组合这些算法,而不是重新发明轮子。

第二,界面设计。一个设计软件的 UI 界面非常复杂,包括菜单、工具栏、图层面板、颜色选择器、历史记录等。用传统方式手写这些界面工作量极大,但 AI 可以根据设计稿或文字描述生成 Vue、React、Qt、Tkinter 的界面代码,开发效率提升明显。

第三,跨平台打包。现代开源工具链支持 Windows、macOS、Linux 三端打包,配合 Electron、PyInstaller、Tauri 等框架,可以快速发布桌面应用。AI 可以帮助编写打包脚本和解决依赖问题。

第四,批处理与自动化。设计工作流中大量重复操作可以通过脚本完成,AI 在编写批处理脚本方面非常有优势,例如批量转换格式、批量加水印、批量调色。

2.2 最难的其实不是算法

不过,真正难的不是算法,而是以下三个问题:

第一是插件生态。Photoshop 的强大在于海量第三方插件和动作脚本。即使核心功能被替代,如果插件系统没有同步成长,用户依然不会迁移。

第二是硬件加速。PS 的液化、智能锐化、超大图纸渲染都依赖 GPU 加速和专业色彩管理。开源替代方案在色彩一致性、HDR 显示、打印预览等方面还有明显差距。

第三是用户体验和习惯。设计师几十年积累的快捷键、肌肉记忆、工作流模板都建立在 Adobe 软件上。即使功能对等,迁移成本依然很高。

所以,“重做七件套”从技术上讲是一条漫长但切实可行的路,短期内很难直接动摇 Adobe 的市场地位,但可以为创作者提供另一种选择。

2.3 开源生态的现实基础

当前开源生态已经有相当多可用的基础组件:

领域开源组件
图像编辑GIMP、Krita、OpenCV、Pillow
矢量绘图Inkscape、SVG.js、Cairo
视频剪辑Blender、Shotcut、FFmpeg
特效合成Natron、GIMP GEGL
摄影管理darktable、RawTherapee
排版设计Scribus、Typst、paged.js
PDF 处理PDF.js、PyMuPDF、Ghostscript

这些项目已经存在多年,但开发维护节奏、交互设计和使用体验各不相同。AI 辅助开发可以加速这些项目之间的整合,例如为 darktable 生成更友好的中文界面,或为 Scribus 开发课程资源。

3. 实战准备:构建一个 mini 版 Photoshop

前面聊了很多背景,下面进入动手环节。我用 Python 和 AI 辅助开发一个迷你图像处理工具,功能覆盖打开图片、灰度化、高斯模糊、边缘检测、二值化、裁剪和旋转。

这个工具虽然简单,但已经覆盖了 Photoshop 最基础的工作流:加载图片、视觉处理、结果预览、保存导出。通过这个例子,你可以直观感受到“AI 辅助重做设计软件”到底是怎么一回事。

3.1 技术选型与版本说明

演示环境如下:

  • 操作系统:Windows 10/11 或 macOS
  • Python 版本:3.10+(建议 3.11 或 3.12)
  • 图形界面:Tkinter(Python 自带)
  • 图像处理:OpenCV 4.x、Pillow、Numpy
  • 开发工具:VS Code 或 PyCharm

版本需要根据你的项目实际情况调整,本文示例以常见环境为例,重点演示配置思路。

运行前安装依赖:

pip install opencv-python pillow numpy

如果网络较慢,可以切换国内镜像源:

pip install opencv-python pillow numpy -i https://pypi.tuna.tsinghua.edu.cn/source

3.2 项目结构规划

在写代码之前,先想清楚目录结构。一个清晰的工程结构,既方便 AI 生成模块化代码,也方便后续扩展:

mini_ps/ ├── main.py # 程序入口 ├── requirements.txt # 依赖清单 ├── core/ │ ├── __init__.py │ ├── image_ops.py # 图像基础操作 │ └── filters.py # 滤镜与特效 └── ui/ ├── __init__.py └── app.py # 图形界面

按模块拆分的好处是:你可以让 AI 分别生成 image_ops.py、filters.py 和 app.py,每个文件都有明确职责,遇到问题时容易定位和修复。

3.3 编写 requirements.txt

opencv-python>=4.8.0 pillow>=10.0.0 numpy>=1.24.0

4. 核心开发:用 AI 生成每个功能模块

4.1 需求拆解:先让 AI 帮你列功能清单

不要一上来就写代码。先向 AI 提问,把需求说清楚。例如在 ChatGPT、Claude、Copilot 或国内的大模型助手中,输入下面这段提示词:

我正在开发一个迷你图像处理工具,参考 Photoshop 的基础功能进行简化。请帮我列出 MVP 版本应该包含的功能清单,要求优先级从高到低排列,并说明每个功能的输出效果。

AI 通常会给出这样一份清单:

优先级功能说明
P0打开图片支持 jpg、png、bmp
P0保存图片保存处理后结果
P0灰度化彩色图片转黑白
P1高斯模糊照片柔化处理
P1边缘检测提取轮廓
P1二值化图像黑白分离
P2旋转、裁剪基础几何变换
P2图层叠加两张图片混合

这个清单就是我们的开发大纲。AI 辅助开发的正确姿势是:让 AI 做“需求分析 + 编码”,你负责决策和审查。

4.2 开发 image_ops.py:图像读写与几何变换

核心功能一:图片的打开、保存、缩放、旋转和裁剪。

向 AI 提问:

请用 Python 写一个模块,使用 OpenCV 实现以下函数: 1. load_image(path):读取图片,文件不存在时报错 2. save_image(img, path):保存图片 3. resize_image(img, width, height):缩放图片,使用 INTER_AREA 插值算法 4. rotate_image(img, angle):以图片中心旋转指定角度 5. crop_image(img, x, y, w, h):裁剪图片 要求:函数签名清晰,包含参数说明和异常处理。

生成的代码核心思路如下,我整理后保存到core/image_ops.py:

# 文件路径:mini_ps/core/image_ops.py import cv2 import numpy as np def load_image(path: str) -> np.ndarray: """读取图片文件。 Args: path: 图片文件路径。 Returns: 返回 BGR 格式的 numpy 数组。 Raises: FileNotFoundError: 文件不存在或无法读取时抛出。 """ img = cv2.imread(path) if img is None: raise FileNotFoundError(f"无法读取图片: {path}") return img def save_image(img: np.ndarray, path: str) -> None: """保存图片到指定路径。 Args: img: OpenCV 图像数组。 path: 输出路径,支持 .jpg、.png 等格式。 """ cv2.imwrite(path, img) def resize_image(img: np.ndarray, width: int, height: int) -> np.ndarray: """缩放图片到指定宽高。 Args: img: 原始图像。 width: 目标宽度。 height: 目标高度。 """ return cv2.resize(img, (width, height), interpolation=cv2.INTER_AREA) def rotate_image(img: np.ndarray, angle: float) -> np.ndarray: """以图像中心为基准旋转指定角度。 Args: img: 原始图像。 angle: 旋转角度,正值为逆时针。 """ h, w = img.shape[:2] center = (w // 2, h // 2) matrix = cv2.getRotationMatrix2D(center, angle, 1.0) return cv2.warpAffine(img, matrix, (w, h), flags=cv2.INTER_LINEAR) def crop_image(img: np.ndarray, x: int, y: int, w: int, h: int) -> np.ndarray: """裁剪图片中的矩形区域。 Args: img: 原始图像。 x: 左上角横坐标。 y: 左上角纵坐标。 w: 区域宽度。 h: 区域高度。 """ return img[y:y + h, x:x + w]

需要注意几点:

  • OpenCV 读取图片默认使用 BGR 色彩模式,而不是常见的 RGB,后续显示到界面时要转换。
  • cv2.imread在文件不存在时不会抛异常,而是返回None,所以要手动判断并抛出FileNotFoundError。
  • 缩放时推荐使用INTER_AREA,在缩小图片时保留更多细节,这是 AI 代码里不太容易自动选对的地方,需要人工修正或提示。

4.3 开发 filters.py:滤镜与特效

向 AI 提问:

请继续完善项目,编写一个 filters.py 模块,使用 OpenCV 实现: 1. to_gray(img):转为灰度图 2. to_binary(img, threshold=127):二值化 3. gaussian_blur(img, ksize=5):高斯模糊 4. edge_detect(img, low=50, high=150):边缘检测 要求:所有函数输入输出都是 numpy 数组,ksize 必须是奇数。

整理后的代码如下:

# 文件路径:mini_ps/core/filters.py import cv2 import numpy as np def to_gray(img: np.ndarray) -> np.ndarray: """彩色图像转灰度图。""" return cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) def to_binary(img: np.ndarray, threshold: int = 127) -> np.ndarray: """图像二值化:像素值大于阈值为白色,否则为黑色。""" gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, binary = cv2.threshold(gray, threshold, 255, cv2.THRESH_BINARY) return binary def gaussian_blur(img: np.ndarray, ksize: int = 5) -> np.ndarray: """高斯模糊。 Args: img: 输入图像。 ksize: 卷积核大小,必须是正奇数。 """ if ksize % 2 == 0: ksize += 1 return cv2.GaussianBlur(img, (ksize, ksize), 0) def edge_detect(img: np.ndarray, low: int = 50, high: int = 150) -> np.ndarray: """Canny 边缘检测。 Args: img: 输入图像。 low: 低阈值。 high: 高阈值。 """ return cv2.Canny(img, low, high)

这里的核心概念是:

  • 灰度化:将三通道的 BGR 图像映射为单通道灰度图,常用于中间步骤。
  • 二值化:设定阈值,把图片变成黑白两色,常用于文档扫描、文字识别预处理。
  • 高斯模糊:每个像素取周围像素的加权平均值,卷积核越大模糊程度越高。
  • Canny 边缘检测:先计算梯度,再通过双阈值筛选边缘。低阈值和高阈值需要根据图片内容调整。

这些基础算法是 Photoshop 众多滤镜的地基,也是 AI 最容易快速生成的模块。

4.4 开发 app.py:整合图形界面

核心功能写好后,接下来要做的是把它们串成一个可视化工具。

向 AI 提问:

请用 Tkinter 写一个简单的图像处理 GUI,功能包括: 1. 选择文件并显示原图 2. 将预览图显示在界面上 3. 点击按钮执行灰度、模糊、边缘检测、二值化 4. 点击保存按钮输出处理结果 5. 显示图片时注意色彩通道转换(BGR -> RGB) 要求:界面简洁,有两个展示区,左原图右结果。

这里有一个很容易踩坑的地方:OpenCV 使用 BGR 顺序,Tkinter 的 PhotoImage 使用 RGB,如果直接显示,图片颜色会变成蓝橙色调。因此需要一步转换:

from PIL import Image, ImageTk import cv2 # BGR -> RGB -> PIL Image -> ImageTk.PhotoImage rgb_img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) pil_img = Image.fromarray(rgb_img) photo = ImageTk.PhotoImage(pil_img)

完整 GUI 代码参考:

# 文件路径:mini_ps/ui/app.py import tkinter as tk from tkinter import filedialog, messagebox from PIL import Image, ImageTk import cv2 import numpy as np from core.image_ops import ( load_image, save_image, resize_image, rotate_image, crop_image ) from core.filters import ( to_gray, to_binary, gaussian_blur, edge_detect ) class MiniPsApp: def __init__(self, root: tk.Tk): self.root = root self.root.title("Mini Photoshop - AI 辅助开发版") self.root.geometry("960x600") self.original = None # 原始 BGR 图像 self.result = None # 处理后的 BGR 图像 self.original_photo = None self.result_photo = None self._build_ui() def _build_ui(self): """构建界面布局。""" toolbar = tk.Frame(self.root) toolbar.pack(side=tk.TOP, fill=tk.X, padx=5, pady=5) tk.Button(toolbar, text="打开图片", command=self.open_image).pack(side=tk.LEFT, padx=2) tk.Button(toolbar, text="灰度化", command=lambda: self.apply_filter(to_gray)).pack(side=tk.LEFT, padx=2) tk.Button(toolbar, text="高斯模糊", command=lambda: self.apply_filter(gaussian_blur)).pack(side=tk.LEFT, padx=2) tk.Button(toolbar, text="边缘检测", command=lambda: self.apply_filter(edge_detect)).pack(side=tk.LEFT, padx=2) tk.Button(toolbar, text="二值化", command=lambda: self.apply_filter(to_binary)).pack(side=tk.LEFT, padx=2) tk.Button(toolbar, text="保存结果", command=self.save_result).pack(side=tk.LEFT, padx=2) body = tk.Frame(self.root) body.pack(fill=tk.BOTH, expand=True) self.original_label = tk.Label(body, text="原图", bg="#f0f0f0") self.original_label.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=5, pady=5) self.result_label = tk.Label(body, text="处理结果", bg="#f0f0f0") self.result_label.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=5, pady=5) def open_image(self): """打开并显示图片。""" path = filedialog.askopenfilename( filetypes=[("图片文件", "*.jpg *.jpeg *.png *.bmp *.*")] ) if not path: return try: self.original = load_image(path) self.result = self.original.copy() self._show_image(self.original, self.original_label, "original") self._show_image(self.result, self.result_label, "result") except Exception as exc: messagebox.showerror("打开失败", str(exc)) def apply_filter(self, func): """对当前结果图应用指定滤镜。""" if self.original is None: messagebox.showwarning("提示", "请先打开一张图片") return try: self.result = func(self.result) self._show_image(self.result, self.result_label, "result") except Exception as exc: messagebox.showerror("处理失败", str(exc)) def save_result(self): """保存处理结果。""" if self.result is None: messagebox.showwarning("提示", "没有可保存的结果图像") return path = filedialog.asksaveasfilename( defaultextension=".png", filetypes=[("PNG", "*.png"), ("JPEG", "*.jpg"), ("BMP", "*.bmp")] ) if path: save_image(self.result, path) messagebox.showinfo("完成", f"图片已保存到:{path}") def _show_image(self, img: np.ndarray, label: tk.Label, tag: str): """把 OpenCV 图像显示到 Tkinter Label 中。""" if img.ndim == 2: # 灰度图 rgb_img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB) else: rgb_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) pil_img = Image.fromarray(rgb_img) # 缩放显示,避免图片过大撑爆窗口 pil_img.thumbnail((440, 480)) photo = ImageTk.PhotoImage(pil_img) if tag == "original": self.original_photo = photo else: self.result_photo = photo label.config(image=photo, text="")

入口文件main.py:

# 文件路径:mini_ps/main.py import tkinter as tk from ui.app import MiniPsApp def main(): root = tk.Tk() app = MiniPsApp(root) root.mainloop() if __name__ == "__main__": main()

4.5 运行与验证

在项目根目录执行:

python main.py

预期效果:

  1. 点击“打开图片”,选择一张本地 JPG 或 PNG,左侧显示原图。
  2. 点击“灰度化”,右侧变为黑白图。
  3. 点击“高斯模糊”,右侧继续模糊,且不影响左侧原图。
  4. 点击“边缘检测”,右侧显示轮廓线条。
  5. 点击“保存结果”,把处理后的图片导出到本地。

我这里实际跑过一条最简单的链路:打开图片 -> 灰度化 -> 高斯模糊 -> 保存,整个过程没有任何报错,界面响应也流畅。

有一点需要说明:这个工具目前没有实现撤销功能和多级历史记录,所以对图片反复应用滤镜会产生叠加效果。如果希望支持撤销,可以维护一个history栈,每次处理前把当前图像压栈,这是一个非常适合作为 AI 辅助开发练习的扩展点。

5. 进阶:AI 如何帮我们“重做”视频与排版工具

5.1 视频剪辑方向

视频处理工具的复杂度比图像处理高很多,但 AI 辅助开发依然能大幅降低起点。比如用 FFmpeg 作为底层引擎,AI 可以帮助生成命令行调用封装。

向 AI 提问:

请用 Python 的 subprocess 封装 FFmpeg,实现视频剪辑和转码: 1. cut_video(input, output, start, duration) 2. compress_video(input, output, bitrate) 3. extract_audio(input, output)

生成结果的逻辑通常如下:

import subprocess def cut_video(input_path: str, output_path: str, start: str, duration: str): cmd = [ "ffmpeg", "-y", "-i", input_path, "-ss", start, "-t", duration, "-c", "copy", output_path ] subprocess.run(cmd, check=True) def compress_video(input_path: str, output_path: str, bitrate: str = "1M"): cmd = [ "ffmpeg", "-y", "-i", input_path, "-b:v", bitrate, output_path ] subprocess.run(cmd, check=True) def extract_audio(input_path: str, output_path: str): cmd = [ "ffmpeg", "-y", "-i", input_path, "-vn", "-c:a", "aac", output_path ] subprocess.run(cmd, check=True)

再通过 Tkinter 或 PySide6 封装成带进度条的图形界面,就是一个简化版的视频剪辑入口。

5.2 矢量图形方向

Illustrator 的替代开发同样可行。Python 生态里有 svgwrite、drawsvg 等库,AI 可以根据文字描述生成 SVG 文件。

向 AI 提问:

请用 Python 和 svgwrite 生成一个简约 logo,包含一个圆形、一个三角形和文字 "AI Studio"。

AI 生成的代码可运行后会输出 SVG 文件,浏览器直接打开就能预览。这个思路可以继续扩展成图形编辑器:画布拖拽、节点编辑、路径计算等,AI 在数据结构设计上能帮上大忙。

5.3 排版与 PDF 方向

InDesign 的替代方向是 Typst、Paged.js 和 PyMuPDF。AI 可以把一份简历数据渲染成 PDF:

# 使用 PyMuPDF 生成带标题和正文的 PDF 文档 import fitz doc = fitz.open() page = doc.new_page() page.insert_text((72, 72), "AI 生成文档标题", fontsize=16, fontname="china-s") page.insert_text((72, 108), "这是一段由脚本生成的正文内容。", fontsize=12) doc.save("output.pdf")

这里要注意,china-s字体是否存在取决于本机字体库,不同平台需要按实际环境调整。AI 辅助生成代码时,最好同时问一句“如果中文字体显示异常,应该如何检查和安装字体”。

6. 常见问题与排查思路

无论你是直接复制本文代码,还是自己用 AI 生成代码,都可能遇到下面这些问题。

问题现象常见原因解决思路
打开图片后界面显示蓝色调OpenCV 读取的是 BGR,Tkinter 需要 RGB使用cv2.cvtColor(img, cv2.COLOR_BGR2RGB)转换
点击滤镜按钮没有反应尚未打开图片,或滤镜函数抛异常先执行“打开图片”;在apply_filter中加异常捕获
图片太大,界面卡死未对预览图做缩放用thumbnail缩小到固定尺寸再显示
控制台报缺少模块依赖未安装完整执行pip install opencv-python pillow numpy
边缘检测结果全黑图片本身就是灰度且对比度低调低 Canny 低阈值,或先执行灰度化和亮度增强
中文字体显示为方块系统缺少对应字体或 PDF 字体设置错误下载字体文件并设置fontname,或改用系统自带中文 TTF 路径
反复处理图像质量持续下降没有保存原始帧,每次对上一结果继续处理维护原始图像副本,每次处理从原始图开始

再展开说明两个高频问题。

6.1 Tkinter 界面明明有图片,却显示空白

这个问题很常见。原因通常是在_show_image里创建的ImageTk.PhotoImage对象被垃圾回收了。Tkinter 的底层机制要求必须保持一个全局或实例引用,否则图片不显示。

解决方案就是在__init__中增加属性:

self.original_photo = None self.result_photo = None

然后在_show_image中赋值给这两个属性。这属于 Tkinter 的经典坑,AI 生成的代码未必会自动处理,需要开发者理解原理后修正。

6.2 OpenCV 的 “shape” 和 PIL 的 “size” 混淆

在 MRO 和图像尺寸处理时,很多初学者会混淆:

  • OpenCV 的img.shape返回(高, 宽, 通道数)。
  • PIL 的img.size返回(宽, 高)。

AI 生成代码时如果混用这两个接口,会导致旋转、裁剪方向错乱。建议在代码里增加注释,明确标注“这里高在前,宽在后”。

7. 最佳实践与工程建议

7.1 把需求拆到 AI 能理解的最小单元

AI 辅助开发能否成功,很大程度取决于你怎么提需求。推荐的做法是:把一个完整软件拆成多个“函数级需求”,逐个让 AI 实现。比如:

  • “写一个读取图片的函数,返回 numpy 数组”
  • “写一个函数,把图片按指定比例缩小”
  • “写一个函数,在 Tkinter 界面中显示 OpenCV 图片”

每一条需求都足够具体,AI 生成的代码质量会明显更高。

7.2 让 AI 改代码,而不是从零生成

很多时候,AI 第一次生成的代码并不完全正确。不要反复让它重写整个文件,而是针对错误反馈让它修改。比如:

我运行 gaussian_blur 时,报错 "ksize must be positive and odd"。请检查函数,如果 ksize 是偶数,自动加 1 后再调用 cv2.GaussianBlur。

这样既保留整体结构,又修复具体问题,效率更高。

7.3 重视测试和边界条件

设计软件涉及大量边界条件:读不存在的文件、裁剪区域超出图片范围、旋转角度为负数、图像通道数不一致等。AI 生成的代码通常只处理“正常路径”,你需要主动补充异常测试。

在我的项目中,至少应该覆盖:

  • 文件不存在时的报错信息是否清晰
  • 空数组输入是否会导致崩溃
  • 裁剪坐标越界时如何保护
  • 保存目标目录不存在时是否需要自动创建

建议给每个函数写一个简单的if __name__ == "__main__"测试块,验证基础行为。

7.4 合规与品牌边界

如果你真的参与开源替代项目,要特别注意:

  • 项目名称、Logo、图标不要模仿 Adobe 品牌。
  • 代码不要直接复制 Adobe 软件中的专有算法实现。
  • 文档和宣传语避免暗示“官方替代品”或“授权版本”。
  • 如果使用了 GPL 协议的开源代码,注意自己的开源义务。

AI 辅助开发应该用于创造新的工具,而不是复制商业产品的外观和资产。

8. 总结:AI 改变的不是软件,而是软件开发方式

Adobe“饭碗不保”的讨论,短期内更多是媒体情绪的放大。真正值得关注的,是 AI 让独立开发者具备了挑战大型设计软件的能力。从本文的迷你 Photoshop 项目可以看到,一个普通工程师借助 AI,可以在一个周末内完成基础图像处理工具的核心功能,这在以前是不可想象的。

下一步,如果你对这个方向感兴趣,建议沿着三条线继续深入:

第一,完善这个小工具,增加图层、蒙版、撤销和历史记录功能。第二,尝试接入更多开源算法,比如人脸识别、智能抠图、超分辨率重建。第三,把开发过程整理成文档,记录 AI 生成的代码和你修改的部分,形成自己的 AI 辅助开发方法论。

工具永远在迭代,但设计软件真正值钱的不是代码,而是对用户需求的理解、稳定的交互体验和完整的创作生态。AI 负责把想法变成代码,而你负责决定这些代码该做成什么样子。这就是未来设计工具开发者最核心的竞争力。

如果这篇文章对你有帮助,可以收藏备用,也欢迎在评论区分享你用 AI 开发过的创意工具。下次遇到“重做 XX 软件”之类的选题,不妨先动手做一个小 Demo。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进