绘图引擎简介
Windows环境下二维绘图引擎有多种选择:GDI、GDI+、DirectDraw、Qt/QPainter、Agg、Cairo、skia、Direct2D、Direct3D、OpenGL、Vulkan等。
GDI:微软原生的二维绘图引擎。
优点:微软的全力支持,作为操作系统核心层效率方面不用担心,支持多种开发框架(含语言):WinSDK、MFC、Delphi等。
缺点:不是面向C++对象组织的,使用起来较为繁琐;不支持反锯齿,不支持复杂的绘图效果(这个相对于GDI+而言)。
GDI+:微软后来推出的二维绘图引擎。
优点:微软的全力支持,支持多种开发框架(含语言):WinSDK、MFC、Delphi等,可以实现复杂的绘图效果,如反锯齿、路径画刷等;面向对象的架构,使用起来比较方便。
缺点:绘图效率较GDI稍低,绘图交互性不如GDI(缺少GDI的支持位运算的绘图模式),开启反锯齿后效率不如Qt。如果不考虑绘图的效果,使用Win32 GDI函数直接绘图的效率大约是同样的GDI+的10倍以上。
DirectDraw:从GDI、GDI+到Direct 2D的一个过渡产品,微软已明确表示不推荐使用。
Qt:Qt的二维图形引擎是基于QPainter类的,绘图的效果取决于QPainter的设置。面向对象的方式组织,使用起来较为方便。
Agg:C++编写的开源绘图引擎(基于GPL协议).AGG是C++编写的,因此,它不能被C语言很好地调用。由于其中使用了大量的现代标准C++语言的语法规则,包括模板、仿函数等处理 ,导致这样的库的学习过程将是痛苦的。AGG自从2006年之后就没有更新过。
Cairo:C编写的开源绘图引擎(基于LGPL协议),大名鼎鼎的FireFox就是用这个绘图引擎的。Cairo是非常流行的开源2D图形渲染引擎库,它支持包括X-Windos,Win32,图像,pdf在内的各种输出设备。目前,Cairo已被广泛的使用在多个平台上来渲染图形界面,包括Firefox/Webkit-EFL/GTK+/Poppler/Qt等等。GTK+底层的绘图引擎就是使用Cairo。Qt的QPainter提供的抗锯齿效果没有cairo的好,在理想情况下,cairo的用户可以在打印机和屏幕上获得非常接近的输出效果。cairo 是用 C 编写的,但是为大多数常用的语言提供了绑定。选用 C 语言有助于创建新的绑定,同时在进行 C 语言调用时可以提供高性能。应该特别注意 Python 绑定,它支持快速原型开发,而且降低了学习 cairo 绘图 API 的门槛。 Cairo的绘图效率是接近GDI/GDIPlus的。经过优化算法,可以做到完全忽略绘图效率上的差别。此外,gtk不如qt流行,Qt支持cairo。
Skia:Google的Android的绘图引擎。它是一个C++的开源2D向量图形处理函数库,包括字型、坐标转换、位图等等,相当于轻量级的Cairo(Cairo是矢量图形库)。
angle:Google宣布了新的开源项目 ANGLE (全称 Almost Native Graphics Layer Engine),这个项目的目标是在 Direct X 9.0c API 的基础上实现一层 OpenGL ES 2.0 API中 的 Web GL 子集接口。在开发的早期,ANGLE 项目将使用 BSD 授权发布,而最终完成后,类似 Google Chrome 之类的浏览器在 Windows 平台上运行 WebGL 内容将不再依赖于任何的 OpenGL 驱动程序。
Direct2D:微软在WindowsVista及之后的Windows版本推出的意在取代GDI、GDI+的二维绘图引擎,支持硬件加速。Direct 2D是微软在后XP时代开发的开发二维绘图引擎。微软出于兼容性的考虑还会继续对GDI、GDI+进行支持,但毫无疑问微软的策略是要Direct 2D取代GDI和GDI+的,因此在WindowsVista及其之后的Windows上进行二维绘图开发,建议是直接使用Direct2D。Direct 2D支持硬件加速,在绘图效率应有一定程度的提升。
Direct3D:微软开发的3D绘图引擎。
OpenGL:SGI开发的3D绘图引擎。OpenGL的优势是三维绘图,不建议用来二维绘图,因为OpenGL在二维一些操作并不合适,如二维中的点、线捕捉、自定义图例的添加、打印的支持等等。
Vulkan:Vulkan是一个跨平台的2D和3D绘图应用程序接口。同 OpenGL一样,Vulkan也由 Khronos 集团开发。它是 AMD Mantle 的后续版本,继承了前者强大的低开销架构,使软件开发人员能够全面获取 RadeonGPU 与多核 CPU 的性能、效率和功能。Linux上Vulkan是OpenGL的指定接班人。
OpenGL
opengl.org:OpenGL官方网站。
OpenGL registry:包含OpenGL各版本的规范和扩展。
《OpenGL超级宝典》中的例子使用了glew,freeglut以及作者自己开发的GLTools这三个库。
- glew
GLEW: The OpenGL Extension Wrangler Library The OpenGL Extension Wrangler Library
GLEW是一个跨平台的OpenGL的扩展库。进入官网,点击Binaries后面的链接,可以下载msvc已编译的库文件,含32位和64位。
The OpenGL Extension Wrangler Library - Browse Files at SourceForge.net
https://github.com/nigels-com/glew
- freeglut
FreeGLUT is a free-software/open-source alternative to the OpenGL Utility Toolkit (GLUT) library。
http://freeglut.sourceforge.net/index.php
https://www.transmissionzero.co.uk/software/freeglut-devel/ 这个网站可以下载msvc已编译的库文件,含32位和64位。
- GLTools
A set of tools to make working with OpenGL easier
https://github.com/HazimGazov/GLTools
Starstone Software Systems, Inc.
- glfw
Download | GLFW A multi-platform library for OpenGL
https://github.com/glfw/glfw/releases
- glad
https://github.com/Dav1dde/glad
- CG Internals
https://www.cginternals.com/en/ Computer Graphics Internals
https://github.com/cginternals
https://github.com/cginternals/cmake-init Template for reliable, cross-platform C++ project setup using cmake
glbinding A C++ binding for the OpenGL API
globjects C++ library strictly wrapping OpenGL objects
- OpenGL binding
https://github.com/JoeyDeVries/Cell ++ https://github.com/assimp/assimp 这两个要配套使用
https://github.com/luca-piccioni/OpenGL.Net
https://github.com/moderngl/moderngl
- 其它
https://github.com/wjakob/nanogui Minimalistic GUI library for OpenGL
https://github.com/NVIDIAGameWorks/GraphicsSamples
https://github.com/assimp/assimp 模型导入
- OpenGL学习教程
LearnOpenGL CN ++ Learn OpenGL, extensive tutorial resource for learning Modern OpenGL
https://github.com/JoeyDeVries/LearnOpenGL ++ https://github.com/JoeyDeVries/Cell
Home ++ https://github.com/opengl-tutorials/ogl
- gult/freegult/glew/glfw/glad概念详解
请访问我的另一篇博文《OpenGL之gult/freeglut/glew/glfw/glad的联系与区别》
开源项目推荐:OpenGL之gult/freeglut/glew/glfw/glad的联系与区别_libaineu2004的博客-CSDN博客_opengl开源项目
Vulkan
Vulkan(昵称“火山”或者“福尔康”),采用跨平台设计,但最重要的贡献是大幅降低绘制命令开销(draw call overhead),改善多线程性能,渲染性能更快,背后的理念和DX12和Mantle都是一致的。另外,Vulkan还会统一桌面的OpenGL和移动平台的OpenGL ES,而且谷歌已经明确了Android将会支持Vulkan。Vulkan的最大任务不是竞争DirectX,而是取代OpenGL,所以重点要看和后者的对比。在高分辨率、高画质、需要GPU发挥的时候,Vulkan、OpenGL的速度基本差不多,但是随着分辨率的降低,CPU越来越重要,Vulkan逐渐体现了出来,尤其是看看GTX 980 Ti,最多可以领先OpenGL 33%之多!
Khronos Vulkan Registry - The Khronos Group Inc
- Vulan学习教程
https://github.com/SaschaWillems/Vulkan
Cairo
Index of /releases 源码下载
cairomm - A C++ API for cairo C++ API for cairo
cairo的应用案例是scribus软件,使用C++/Qt GUI
scribus-1.5.5\scribus\scpainter.cpp
scribus-1.5.5\scribus\scpainterex_cairo.cpp
scribus-1.5.5\scribus\scpainterex_ps2.cpp
cairo通过ScPainter类构造函数来和Qt的QImage做衔接:
ScPainter::ScPainter( QImage *target, int w, int h, double transparency, int blendmode )
{
m_image = target;
...
cairo_surface_t *img = cairo_image_surface_create_for_data(m_image->bits(), CAIRO_FORMAT_ARGB32, w, h, w*4);
cairo_surface_set_device_scale(img, m_image->devicePixelRatio(), m_image->devicePixelRatio());
}
scribus软件的详情见我的另一篇博客《Scribus v1.5.5源码编译,使用VS2017+Qt5.12.7环境》
Google 2D图形库Skia
介绍Skia图形库之前,先来看看Windows平台下的两大绘图API,分别是GDI和GDI+。
- GDI
由于没有复杂的抗锯齿处理,绘图效率非常不错,但是同样的绘制质量不好。没有半透明的处理功能,在对界面要求不高而对性能要求比较高的应用程序里面使用比较多,比如股票软件。
- GDI+
GDI的升级版本,Windows独立提供了一个GDIPlus.dll的动态库,具有跨语言特性,C++,C#,VB都可以使用。 API封装性也比较好,支持丰富的半透明处理功能和文字处理特效。 具备抗锯齿绘制的能力。同样的也有其弊端,主要表现在:
- 绘制性能低下,连续绘制1000张大图片CPU基本就扛不住了
- 部分API存在bug,最典型的就是文字大小计算,计算不准确,在文字处理场景下存在一定的弊端。
- 没有特效的处理能力,比如模糊处理,发光处理,三维旋转效果,只提供了2D的选择和矩阵透视变形特效。
所以使用GDI和GDI+在一些复杂的场景下使用非常受限。有人说可以用OpenGL和DirectX来处理,这两个API库需要实现大量的底层功能,比如文字栅格化等等,另外依赖显卡的驱动,对低配置计算机不是很友好。除了以上的选择之外Google的Skia的推出确实帮助我们解决了一部分问题,在此基础上我们做对应的扩展即可让我们实现复杂的绘制效果。
- Skia
Skia是一个C++的开源2D向量图形处理函数库(Cairo是一个矢量库),包括字型、坐标转换、位图等等,相当于轻量级的Cairo。目前主要用于Google的Android和Chrome平台,Skia搭配OpenGL/ES与特定的硬件特征,强化显示的效果。Skia需要的底层库有:freetype2,expat,tinyxml。
https://skia.org/ 官方网址
https://skia.googlesource.com/skia 官方源码下载
https://skia.org/user/build 官方编译教程
https://github.com/google/skia 镜像源码仓库
https://github.com/aseprite/aseprite ++ https://github.com/aseprite/skia/releases ++ \
++ https://github.com/aseprite/skia/actions 他人已编译好的库【推荐,版本新,静态库,MTd/MT运行时库】
https://github.com/rust-skia/skia ++ https://github.com/rust-skia/skia-binaries/releases 他人已编译好的库【不推荐,没有d】
https://github.com/mpsuzuki/skia-binaries/releases 他人已编译好的库,版本旧
https://github.com/mono/SkiaSharp Skia C#版本
Windows环境VS2017编译skia库,亲测成功,借助skui的方法_libaineu2004的博客-CSDN博客_skia 编译 我个人写的skia编译教程,VS2017【推荐】
- Skia for Qt
https://github.com/QtSkia/QtSkia 把skia集成到Qt中
QtSkia: google的 skia渲染框架, 集成到Qt中
- 应用案例
https://github.com/nitramr/Draftoola skia库的应用案例,C++/Qt【推荐】
Google 3D图形库angle
https://github.com/google/angle ++ https://github.com/Microsoft/angle
VTK
https://github.com/Kitware/VTK
Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。VTK底层是opengl,opengl是面向过程的c函数库。
https://github.com/lorensen/VTKExamples
https://lorensen.github.io/VTKExamples/site/Cxx/ 官方文档
阿兵-AI医疗的博客_CSDN博客-图像处理(OpenCV),Study-VTK,Python领域博主 阿兵-AI医疗 VKT中文教程
https://gitee.com/yaoxin001/openBrowser 基于QT 一个开源的文件浏览器,使用了VTK
https://github.com/MITK/MITK The Medical Imaging Interaction Toolkit
https://www.paraview.org/ ParaView
https://github.com/Kitware/ParaView VTK-based Data Analysis and Visualization Application
OpenVG
https://github.com/memononen/nanovg
https://github.com/memononen/nanosvg
gingkoVG是原生OpenVG的全功能实现,她是完全遵循OpenVG 1.0.1的Spec定义;其目标是为嵌入系统提供切实可以运行的低成本的OpenVG的实现,以使在嵌入系统上使用OpenVG成为可能;
SVG是一种图像文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。
开源图像绘制和处理软件
GIMP是跨平台的图像处理程序。GIMP 是 GNU 图像处理程序(GNU Image Manipulation Program)的缩写。包括几乎所有图象处理所需的功能,号称Linux下的Adobe PhotoShop。GTK+( GIMP Toolkit ) 是一套在 GIMP 的基础上发展而来的高级的、可伸缩的现代化、跨平台图形工具包,提供一整套完备的图形构件。
KDE和GNOME是LINUX里最常用的图形界面操作环境。我们一般将GNOME和KDE两大阵营称为GNOME/GTK和 KDE/Qt。
GIMP - GNU Image Manipulation Program
https://download.gimp.org/pub/gimp/stable/
Index of /pub/gimp/v2.10/windows
Inkscape是一款外国开发的开源矢量图形编辑软件,与Illustrator、Freehand、CorelDraw、Xara X 等其他软件相似。Inkscape是一套矢量图形编辑器,号称Linux下的CorelDraw。Inkscape is an open source 2d vector graphics editor.inkspace可以实现svg矢量图文件的编辑。
Inkscape / inkscape · GitLab Inkscape vector image editor,C++/GTK+,内置了几何库2geom(\inkscape-INKSCAPE_1_0_2\src\2geom\源码使用C++14编译器,依赖boost)
Inkscape / lib2geom · GitLab Easy to use 2D geometry library in C++,新版本使用C++ 17编译器
关于2geom库的用法:
src/path · master · Inkscape / inkscape · GitLab
tests · master · Inkscape / lib2geom · GitLab
darktable:是一个开源摄影工作流程应用程序和RAW原生图像处理工具。darktable号称linux版的lightroom。Adobe Photoshop Lightroom是Adobe 研发的一款以后期制作为重点的图形工具软件,是当今数字拍摄工作流程中不可或缺的一部分。
darktable
https://github.com/darktable-org/darktable C++/GTK
Krita 是一款自由、免费、开源的专业绘画软件。它由懂得画画的程序员们开发,目标是打造一款人人都用得起的数字绘画工具。适用于: 概念美术设计等
Krita | Digital Painting. Creative Freedom.
Files · master · Graphics / Krita · GitLab C++/Qt,依赖KDE
Kolourpaint是一款KDE下的全能画图应用,界面友好,支持如PNG, JPG, TGA, PNM, GIF, BMP, XPM 或 TIFF等等图片格式
News :: KolourPaint - the free, easy-to-use paint program for KDE
https://github.com/KDE/kolourpaint C++/Qt,但是依赖KDE
https://apps.kde.org/kolourpaint/
https://cgit.kde.org/kolourpaint.git/
Karbon是一个矢量绘图应用程序,具有易于使用,高度可定制和可扩展的用户界面.
https://github.com/KDE/calligra/tree/master/karbon C++/Qt,但是依赖KDE
https://cgit.kde.org/calligra.git
https://github.com/drawpile/Drawpile ++ Drawpile
Qt实现,但是依赖KDE,KF5 Extra CMake Modules
RainyNite studio,依赖boost,KDE,KF5ItemModels
https://github.com/caryoscelus/rainynite-studio
https://github.com/ksnip/ksnip
Ksnip是基于Qt的跨平台屏幕截图工具,可为屏幕截图提供许多注释功能。
Paint.NET是Windows 平台上的一个图像和照片处理软件,早期定位于MSPaint(Windows画图板)的免费替代软件,支持图层、通道、无限制的历史记录、特效和许多实用工具,在3.3版本之前开源,之后由于种种原因放弃开源。Paint.NET v3.36是最终的开源版本。C#语言编写。
Paint.NET - Free Software for Digital Photo Editing 官网,新版本exe下载
下载 旧版本的 Paint.NET for - OldVersion.com 老版本exe下载
https://github.com/wangdeshui/paint.net
https://download.csdn.net/download/libaineu2004/12309098 我个人整理的源码,可以在VS2017编译通过
Pinta:Simple Gtk# Paint Program
Pinta is a Gtk# clone of Paint.Net 3.0。Pinta是一个受PaintNET启发的开放源代码位图形编辑软件。它使用Gtk#、cairo和有些PaintNET的源代码。
https://pinta-project.com/pintaproject/pinta/
https://github.com/PintaProject/Pinta
MyPaint
MyPaint MyPaint是一个绘画涂鸦软件,python,GTK写的
https://github.com/mypaint/mypaint 主要是配合数位绘图板使用,软件内置了易于使用的笔刷。
Pencil2D:2D动画制作软件
Pencil2D Animation | Open Source animation software Qt
https://github.com/pencil2d/pencil
enve
https://github.com/MaurycyLiebner/enve
Flexible, user expandable 2D animation software for Linux and Windows.
https://github.com/egan2015/qdraw
画图软件,基于QGraphicsView实现,可画直线,矩形,椭圆,圆角矩形,不规则多边形,曲线等等基本功能,并且可编辑这些图形,代码封装完毕,可简单移植到项目中使用。
https://github.com/douzhongqiang/EasyCanvas
https://blog.csdn.net/douzhq/article/details/105210133 第一版的博文
基于Qt QGraphicsView的简易画图软件,作者douzhq的博客_CSDN博客-qt,python,C++领域博主
https://github.com/kanryu/quickviewer
适用于Windows,Mac和Linux的图像/漫画查看器应用程序,可以非常快速地显示图像。
https://github.com/jurplel/qView
实用且最小的图像查看器
https://github.com/ArsMasiuk/qvge
把这句话注释掉,不然编译失败
void qvgeMainWindow::updateFileAssociations()
{
#if defined Q_OS_WIN32
//CPlatformWin32::registerFileType("qvge.xgr", "QVGE native graph document", ".xgr", 0);//firecat
https://github.com/OpenOrienteering/mapper
https://github.com/SillyLossy/QtPaint
https://github.com/zsnjuts/PaintWorks 图形学绘图系统Qt版(OpenGL绘制)
https://github.com/omiddavoodi/QtPaint
https://github.com/smay1613/Qt-Paint
https://github.com/bruceoutdoors/DrawingApp Qt
https://github.com/Gr1N/EasyPaint Qt
https://github.com/mm-project/qt_painter
LogoSpeech Studio
https://github.com/mohabouje/logospeech-studio
Crimm Imageshop 2.3,软件经过UPX压缩,占用空间很小。UPX (the Ultimate Packer for eXecutables)是一款先进的可执行程序文件压缩器,压缩过的可执行文件体积缩小50%-70%
Crimm Imageshop 2.3。 - Imageshop - 博客园
Home | PhotoDemon: the fast, free, portable photo editor
https://github.com/tannerhelland/PhotoDemon 不是Qt写的
OpenBoard
OpenBoard 是一个跨平台的交互式白板应用程序,旨在用于课堂环境。
https://github.com/OpenBoard-org/OpenBoard
缩放图
https://github.com/BLumia/pineapple-pictures
Drawing - Linux下类似于Microsoft Paint的基本图像编辑器
https://github.com/maoschanz/drawing
其他Qt项目
https://github.com/xiaoyanLG/Draw-Tool
https://github.com/shixingya/Qt-Drawing
其它开源图形库
https://github.com/yuanming-hu/taichi 中国人写的太极图形库
Cinder 矢量图形库,2D/3D
https://github.com/cinder/Cinder
https://github.com/FortAwesome/Font-Awesome
https://github.com/drawpile/Drawpile
https://easyx.cn/ 国产绘图库for VC++