65.9K
CodeProject 正在变化。 阅读更多。
Home

一个 C++ BLOB 编辑器,代码行数少于 128 行

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.13/5 (17投票s)

2008年5月7日

GPL3

3分钟阅读

viewsIcon

47867

downloadIcon

785

一个非常简单的 C++ 源代码,展示了如何使用 CImg 库创建一个交互式的 2D 图形 Blob 编辑器。

CImg_blob_editor

引言

本文提供了一小段 C++ 代码(少于 128 行),用于创建一个简单但功能齐全的 2D Blob 编辑器。

该编辑器包含一个主窗口,用户可以在其中创建、删除和移动具有随机大小和颜色的 Blob。底层算法基于隐式函数来创建和合并 Blob。 这与著名的 Metaballs 技术 非常相似,但这里应用于 2D 函数。

可以在这里观看此 Blob 编辑器的视频。

背景

这个项目演示了 CImg 库提供的一个非常方便和简单的图像类的使用,CImg 库是一个 C++ 模板图像处理工具包。它允许通过专注于算法本身来缩短代码,而不是必须进行所有底层图像操作。

CImg 是一个非常便携的库,所以我能够在上面的存档中提供相同程序的 Windows 和 Linux 可执行文件。

使用代码

代码非常小,主要包含一个主事件循环,等待用户交互。当用户用鼠标左键单击时,它会创建一个 Blob(或移动一个现有的 Blob)。使用鼠标右键删除一个 Blob。 创建的 Blob 的颜色和大小是随机选择的。

该代码使用 CImg 库的主要图像结构,在我们的例子中是 CImg<unsigned int>,即类型为 unsigned int 的像素的 2D 容器。像素访问和修改通常通过函数 CImg<T>::operator() 完成,该函数由图像类提供。

Blob 的位置、大小和颜色存储在列表结构中,也由 CImg 库提供(虽然可以使用 std::vector<> 代替)。

最后,使用 CImg 库的 CImgDisplay 类创建和更新显示窗口,这非常棒,因为它使用简单且是多平台的,因此相同的代码可以在不同的架构上以相同的方式工作。

从数学的角度来看,每个 Blob 都被认为是一个隐式的 Gaussian 函数。所有 Blob 都被添加到一个势场中(这里由主图像 img 描述)。然后,根据 Blob 的颜色和大小对该势场进行着色和阈值处理。因此,创建一个包含 Blob 的势场的彩色版本。此外,相对于 Blob 坐标定位的连续球体绘制小反射,以便创建最终渲染的 Blob 图像。

关注点

我认为这段代码是发现使用隐式函数来建模简单数学对象的好方法。 相同的技术应用于 3D 渲染以进行 Metaballs,并且现在大量用于建模平滑 3D 对象。

从更技术的角度来看,它可能会让你发现 CImg 库,这是一个很好的 C++ 工具包,用于进行通用图像处理。它真正简化了与图像相关的算法的编码,并为图像/信号处理提供了一个轻量级和多平台的开发框架。

我真诚地希望你喜欢这段代码。

© . All rights reserved.