c++ - 如何通过c ++将圆圈写入ppm文件
问题描述
我想在 ppm 文件中画一个圆圈和 X。我使用以下方法(如下所述),但我想知道是否有比我使用的方法更快或更有效的方法。
我的方法是创建一个包含在每个 RGB 结构单元格中的 (n X m) 大小的数组
数组是
RGB image[dimx*dimy];
结构是
struct RGB {
uint8_t red, green, blue;
public:
RGB() {}
RGB(uint8_t red, uint8_t green, uint8_t blue): red(red), green(green), blue(blue) {}
};
我在正确的地方写下适当的值来得到一个圆圈
image[x].red = 0;
image[x].green = 0;
image[x].blue = 0;
最后,我将数组写入 ppm 文件
imageFile.write(reinterpret_cast<char*>(&image), 3*dimx*dimy);
解决方案
我会创建一个行指针数组
RGB *pyx[dimy];
for (int y=0;y<dimy;y++) pyx[y]=image+(y*dimx);
因此,现在您可以 R/W 访问任何像素(x,y),例如:
pyx[y][x]=...;
...=pyx[y][x];
无需重新计算地址,这比在每个像素访问上相乘要快得多...
另一件事是每像素使用 32 位而不是 24 位。所以你可以摆脱结构并使用DWORD
oruint32_t
代替。这样,您可以使用0x00RRGGBB
或0x00BBGGRR
像素格式一次设置所有颜色通道。您甚至可以将最高 8 位用于 Alpha 通道。
如果您仍然需要访问 R、G、B,您可以使用 union :
union RGB
{
uint8_t db[4];
uint32_t dd;
};
唯一的问题是,如果您的 ppm 不知道 32bpp,那么您需要在保存到文件之前将图像数据转换为 24bpp
推荐阅读
- regex - POSIX Regex 解析命令行并获取参数
- sql - MS Access SQL Server ODBC连接255个字符限制?
- actions-on-google - 谷歌操作上的帐户链接
- c# - 初始化使用后清空信号量属性的正确方法
- docker - 使用 Quarkus & SmallRye 时更改 kafka 主机和端口
- docker - 如何访问作为 docker 容器运行的节点 api
- python - 从 Python 调用 sql 存储过程 - 错误:('42000','将数据类型 varchar 转换为 int 时出错。(8114)(SQLExecDirectW)')
- sql - 如何从 AVG 中选择 MAX?
- ffmpeg - 使用 FFMPEG 将 webm 音频文件转换为 mp4 失败
- podio - 获取 Podio 项目订阅者