我有一个关于 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/