我正在学习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));
您已经告诉编译器
scanline
是FILE*
(通常可以从fopen(3)
获取),但是您已经为该指针分配了一些未初始化的堆内存。然后,当您将scanline
传递到fwrite(3)
和fputc(3)
时,他们将寻找FILE
信息以告知要写入的位置,但会发现垃圾。由于没有显示
bi
和RGBTRIPLE
的定义,因此很难说更多,但是您需要确定scanline
的正确类型,并且可能在scanline
中为outptr
更改fwrite
。和fputc
调用。- 编辑 -
关于注释中的后续问题,
FILE* scanline = fopen("scanline", "w")
是否正确将取决于您希望scanline
是文件还是内存缓冲区。在代码的前半部分,您似乎将其视为文件,但是在最后的for
循环中,您将其视为内存缓冲区。