我正在学习C,我的任务是调整24位位图的大小。到目前为止,我所做的是:

-正确编写的代码可以复制和更新标题

-正确编写的代码可垂直调整图像大小

-填充工程

我现在想让它将调整大小后的行写给Middleman,这样我就可以将他写f次到外发文件,如下所示:

// save scanline
FILE* scanline = malloc(sizeof(bi.biWidth) * sizeof(RGBTRIPLE));

// iterate over infile's scanlines
for (int i = 0, biHeight = (abs(bi.biHeight)/f); i < biHeight; i++)
{

    // iterate over pixels in scanline
    for (int j = 0; j < (bi.biWidth/f); j++)
    {
        // temporary storage
        RGBTRIPLE triple;

        // read RGB triple from infile
        fread(&triple, sizeof(RGBTRIPLE), 1, inptr);

        for(int z = 0; z < f; z++)
        {
           // write RGB triple to outfile
           fwrite(&triple, sizeof(RGBTRIPLE), 1, scanline);
        }

    }

    // Add Padding to Outfile
    for (int k = 0; k < padding2; k++)
    {
        fputc(0x00, scanline);
    }

    // skip over padding, if any
    fseek(inptr, padding, SEEK_CUR);

    for(int s = 0; s < f; s++)
    {
        // write RGB triple to outfile
        fwrite(scanline, sizeof(RGBTRIPLE), 1, outptr);
    }

}


我的问题是(使用调试工具可以解决此问题),无论何时必须将其写入扫描线文件,我都会立即遇到分段错误。
在此先非常感谢您,我尽力确保我没有违反社区准则,但是如果失败,我会公开表示。祝你有个好的一天!

最佳答案

您的问题很可能与您显示的第一行代码有关

// save scanline
FILE* scanline = malloc(sizeof(bi.biWidth) * sizeof(RGBTRIPLE));


您已经告诉编译器scanlineFILE*(通常可以从fopen(3)获取),但是您已经为该指针分配了一些未初始化的堆内存。然后,当您将scanline传递到fwrite(3)fputc(3)时,他们将寻找FILE信息以告知要写入的位置,但会发现垃圾。

由于没有显示biRGBTRIPLE的定义,因此很难说更多,但是您需要确定scanline的正确类型,并且可能在scanline中为outptr更改fwrite。和fputc调用。

- 编辑 -

关于注释中的后续问题,FILE* scanline = fopen("scanline", "w")是否正确将取决于您希望scanline是文件还是内存缓冲区。在代码的前半部分,您似乎将其视为文件,但是在最后的for循环中,您将其视为内存缓冲区。

10-07 20:04