我正在学习C,我的任务是调整24位Bitmaps的大小。到目前为止我做了什么:
- 正确编写的代码,用于复制和更新标题
正确编写的代码,用于垂直调整图像大小
-Padding有效
我现在想让它将调整后的行写入一个Middleman,这样我就可以写f次到outfile,就像这样:
// 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);
}
}
我的问题是(这是使用debuging工具计算出来的),无论何时必须写入扫描线文件,我都会立即得到分段错误。 非常感谢你提前,我试图确保我没有打破社区准则,但如果我失败了,我就会大肆宣传。有一个好的!
答案 0 :(得分:1)
您的问题很可能与您展示的第一行代码相关
// save scanline
FILE* scanline = malloc(sizeof(bi.biWidth) * sizeof(RGBTRIPLE));
您告诉编译器scanline
是FILE*
(通常可以从fopen(3)
获得)但是您已经为该指针分配了一些未初始化的堆内存。然后,当您将scanline
传递到fwrite(3)
和fputc(3)
时,他们会查找FILE
信息,告诉它写入的位置,但会找到垃圾。
很难说更多,因为您没有显示bi
和RGBTRIPLE
的定义,但您需要确定scanline
的正确类型并可能更改{ {1}}和scanline
来电中的outptr
{1}}
- 编辑 -
关于评论中的后续问题,fwrite
是否正确取决于您是希望fputc
成为文件还是内存缓冲区。在代码的前半部分,您似乎将其视为文件,但在最后的FILE* scanline = fopen("scanline", "w")
循环中,您将其视为内存缓冲区。