gpt4 book ai didi

python - 如何创建包含 ppm 图像的二进制光栅数据的 C 字符串

转载 作者:太空宇宙 更新时间:2023-11-04 03:44:55 24 4
gpt4 key购买 nike

我有一个关于 C 中字符串生成的小问题。以下代码片段是用于生成图像(mandelbrot、渐变等)的 Python/Tkinter 应用程序的 C 扩展的一部分。在有人问之前:我不想为这样一个简单的任务启动 Photoshop - 矫枉过正......

我遇到的问题是在最后一个 for 循环的代码片段的末尾。此函数生成 PPM 图像文件以供进一步处理。主要目标是生成一个包含二进制格式的栅格数据的字符串,并将该字符串传回 Python,然后传给 Tkinter 图像数据以预览结果。

目前我将文件写入磁盘的速度非常慢。迭代器函数返回指向 RGB 数组的指针。如果我现在使用

将每个颜色值写入文件
fputc(col[0], outfile)

它有效(被注释掉的部分)。为了更接近我的主要目标,我尝试将三个颜色值合并为一个字符串并将其写入文件。当我从我的 Python 应用程序运行该代码时,我最终得到一个仅包含 header 的文件。

谁能给我指出正确的方向?整个 C 事物对我来说都是全新的 - 所以我几乎被困在这里......

static PyObject* py_mandelbrotppm(PyObject* self, PyObject* args)
{
//get filename from argument
char *filename;
PyArg_ParseTuple(args, "s", &filename);
//---------- open file for writing and create header
FILE *outfile = NULL;
outfile = fopen(filename, "w");

//---------- create ppm header
char header[17];
sprintf(header,"P6\n%d %d\n255\n", dim_x, dim_y);
fputs(header, outfile);
//---------- end of header generation

for(int y = 0;y<dim_y;y++)
{
for(int x = 0;x<dim_x;x++)
{
int *col = iterator(x,y);
char pixel[3] = {col[0], col[1], col[2]};
fputs(pixel, outfile);

/*
for(int i = 0;i<3;i++)
{
fputc(pixel[i], outfile);
}
*/
}
}
fclose(outfile);
Py_RETURN_NONE;
}

最佳答案

您的新代码有几个问题。

pixel 缺少空终止符(及其空格)。像这样修复它:

char pixel[4] = {col[0], col[1], col[2], '\0'};

但我会告诉你一个小 secret 。将一堆 int 放入 char 数组中会截断它们并做各种奇怪的事情。可能不适用于 char 长度的数字,但就一般风格而言,我不推荐它。考虑一下:

...
for(int x = 0;x<dim_x;x++){
int *col = iterator(x,y);
fprintf(outfile, "%d, %d, %d", col[0], col[1], col[2]);
}
...

另一方面,我有点困惑为什么 iterator 在 RGB 值是 0-255 时返回 int,这恰好是 unsigned char 的范围> 有:

unsigned char *col = iterator(x,y);
fprintf(outfile, "%u, %u, %u", col[0], col[1], col[2]);

关于python - 如何创建包含 ppm 图像的二进制光栅数据的 C 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25485797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com