2
    // 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++)

4

1 回答 1

3

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

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

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

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

于 2012-07-19T21:43:44.807 回答