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

标签 python c arrays string

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

相关文章:

arrays - 如何在 Swift 4.2x 的函数中访问/操作作为参数传递的可变数组?

python - 如何从邻接列表递归生成父子字符串列表?

python - 如何使用 VS Code 在 Docker 容器中远程调试 python 代码

python - 计算数字中的数字之和,使用/和%时结果不正确

javascript - 与下划线相反 ._without(array, value)

C指针和数组问题

python - pycurl: RETURNTRANSFER 选项不存在

C:理解多维数组

在 C 编程中使用等号比较字符串

c - 如何在 C 模块中将两个全局 `const` 变量定义为相同的值?