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

ラインレベルでは、ピクセルを1回読み取った後、n書き込みを行う必要があります。これは、別の内部ループを追加することによって行われます。そのコピーされたピクセルはtriple、操作中にvarに存在します。

ファイルレベルでは、1行を繰り返し処理し、複数回読み取りと書き込みを行う必要があります。

入力ファイルがディスク上にある場合は、巻き戻しをサポートしている必要があります。したがって、行を読み取り、書き込み(上記のように内部にピクセルを複製)してから、ファイルを行の先頭に巻き戻し、行を再度読み取り、書き込みを行うことができます。

行を読み取る前にファイルの位置を保存し、処理が必要になるたびftellにファイルの位置をこの時点まで巻き戻します。fseek

于 2012-07-19T21:43:44.807 に答える