如何调整位图的大小

// determine padding for scanlines int padding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4; // iterate over infile's scanlines for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++) { for(int q = 0; q < n; q++) { // iterate over pixels in scanline for (int j = 0; j < bi.biWidth; j++) { // temporary storage RGBTRIPLE triple; // read RGB triple from infile fread(&triple, sizeof(RGBTRIPLE), 1, inptr); // write RGB triple to outfile for (int r = 0; r < n; r++) fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr); } // skip over padding, if any fseek(inptr, padding, SEEK_CUR); //then add it back (to demonstrate how) for (int k = 0; k < padding; k++) fputc(0x00, outptr); } } 

我正在尝试更改代码,以便我可以将bmp的大小调整为n倍(向宽度和高度添加n三倍)。 我找到了一种迭代for循环的方法,该循环将调整宽度: for (int r = 0; r < n; r++) 。 我试图用高度做同样的事情,我无法弄清楚为什么它不起作用。 for (int q = 0; q < n; q++)

在行级别,您应该在单个读取像素之后对其进行写入。 这是通过添加另一个内循环来完成的。 复制的像素在操作期间驻留在triple变量。

在文件级别,您应该重复处理单行,多次读取和写入。

如果您的输入文件位于磁盘上,则它应支持倒带。 所以你可以读取该行,写入它(在里面复制像素,如上所示),然后将文件倒回到行的开头,再次读取行,写入等等。

尝试在读取行之前使用ftell存储文件位置,并在每次需要处理时使用fseek将文件位置倒回到此点。