01-绘制与图像
绘制与图像——程序绘制、绘画软件与画师的区别,从像素到 2D 人物
一句话
区别不在于能不能画,而在于「谁负责画」以及「画的方式」——程序写代码画、绘画软件人拿画笔画、画师靠创作。它们最终得到的都是像素图,只是创作方式不同。
一、四层定位:图形库的层次
| 层次 | 作用 | Python | C++ |
|---|---|---|---|
| 图片处理 | 图片读写、格式解析、像素处理 | Pillow、OpenCV | OpenCV、FreeImage、stb_image |
| 二维绘图 | 二维图元绘制(线/矩形/圆/文字/曲线) | Cairo、Skia、Matplotlib | Skia、Cairo、NanoVG |
| GPU 渲染 | 高性能实时渲染 | ModernGL、PyOpenGL | OpenGL、Direct3D、Vulkan |
| 游戏渲染 | 游戏场景渲染 | pygame、pyglet | SDL、SFML、raylib |
图片库 vs 图形 API 的最大区别
图片库(Pillow、OpenCV):内存里修改像素 → 保存。
1 | 图片 → 修改像素 → 保存 |
GPU 图形 API(OpenGL/D3D/Vulkan):告诉显卡应该画什么,实时渲染。
1 | 顶点 → Shader → GPU → 屏幕 |
画 100 万个三角形:Pillow 是 CPU 一个像素一个像素算;OpenGL 是 GPU 几千个核心一起算,效率差很多。
OpenGL 不是不能生成图片,而是默认目标是实时显示,不是文件。(GPU → FrameBuffer → glReadPixels → CPU → PNG 编码 → 保存 也可以生成图片。)
Pillow 的 Image + ImageDraw
它就是在内存里建一块像素缓冲区,draw.line() 实际上是不停修改这些像素,img.save() 把像素编码成 PNG/JPEG。所以 Pillow 的 Image + ImageDraw 更接近 C++ 中的 Skia 或 Cairo(CPU 绘制),而不是 OpenGL/D3D(GPU 实时渲染)。
二、程序绘制 vs 绘画软件 vs 画师
第一种:程序绘制(Pillow、ImageDraw)
1 | draw.line(...) |
程序告诉计算机「在 (100,100) 到 (200,100) 画一条红线」。画的是规则图形:流程图、表格、图表、棋盘、二维地图、像素字体、图标。
第二种:PS、Krita、SAI 等绘画软件
本质上也是修改像素。用画笔画一笔,实际上发生的是:鼠标轨迹 → 画笔算法 → 计算笔刷形状 → 混色 → 透明度 → 修改像素。
Pillow 和 Photoshop 最终得到的都是一张像素图(Raster Image)。 区别只是:Pillow 程序写代码画,Photoshop 人拿画笔画。
第三种:专业画师
画师不是在调 draw.line(),而是在调整颜色、透明度、压力、混色、涂抹、模糊、图层、蒙版、滤镜。
关键结论
- Pillow 不是只能画简单的像素图——可以生成 Mandelbrot 分形、分形树、柏林噪声、地形、星空、程序生成艺术。复杂程度取决于算法,而不是库。
- Photoshop 和画师也是在最终修改像素,只不过通过丰富的画笔、图层和交互工具完成,而不是直接写代码。
- 真正的区别是创作方式:Pillow 是代码驱动,Photoshop 是交互式绘制。最终保存的通常都是同一种类型的像素图片。
三、从像素图到 2D 人物形象的十阶段
不是突然从「画线」变成「画人物」,而是不断叠加更高级的绘制能力。
1 | ① 基本图元 点、线、矩形、圆、多边形 |
前八个阶段是程序问题(算法),后两个阶段是美术问题(知识)。
开发 2D 绘图软件的建议实现顺序
如果目标是自己开发一个二维绘图软件,不要一开始就追求「能画出画师作品」,而是按能力逐层实现:
1 | 1. 像素缓冲区(Image) |
很多专业绘图软件的发展也是类似路线。等拥有了画笔、图层、混色、纹理等能力后,再配合画师的美术基础,就能创作出「自然」「好看」的二维人物形象。程序提供的是工具,人物是否生动、美观,还依赖于人体结构、色彩、光影和构图等艺术知识——所以实现顺序到「画笔/图层/混色/纹理」为止是程序问题,再往上就是美术问题。
四、从软件架构角度的职责分层
- 图片库:负责图片读写、格式解析、像素处理(PNG、JPEG、缩放、裁剪、滤镜)
- 绘图库:负责二维图元绘制(线段、矩形、圆、文字、Bezier 曲线)
- 图形 API:负责高性能实时渲染,把图元和图片显示到屏幕
- GUI 框架:负责窗口、按钮、菜单、事件处理等界面功能
这种分层在 Python 和 C++ 中都成立,区别主要在于:Python 更适合快速验证业务和算法,C++ 更适合构建高性能、长期维护的图形系统。对于「先验证业务、再迁移到 C++」的思路,这是很多团队会采用的一种开发方式。
与其他线的关系
- 与图像生成的领域模型线:本线讲「用什么画」(工具层),领域模型线讲「画什么、怎么保证一致」(模型层)——语言→领域模型→绘制器,绘制器是本线
- 与领域对象分析主题:从自然语言拆出 Person/Dress/Tree/Sun/Ground 领域对象,再到 Bezier→Rasterize→Pixel→PNG,绘制器是最后一段
- 与游戏系统论:游戏资源生产(美术子流程)的最终产物都是像素图/模型资产,绘制与图像线是它的工具基础
