1

オンラインで CS50 コースを受講していて、ビットマップをスケーリングする必要があります。横に伸ばすことはできますが、問題を引き起こしているのは、縦に伸ばす方法です。解像度で画像のサイズを 2 倍にしましたが、ストレッチは画像の下半分でのみ発生し、画像の上半分は真っ白です。すでに reddit と here で fseek を検索しようとしましたが、画像が水平方向にしか伸びない理由がわかりません。

これは私のコードの一部です:

n = 2; // scale up by factor 2
bi.biWidth = bi.biWidth * n; // double width
bi.biHeight = bi.biHeight * n; //double hight

//iterate over infile's scanlines
for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++)
{

    for (int m = 0 ; m < n; m++) // repeat process n-times to copy lines vertically
    {

        // iterate over pixels in scanline
        for (int j = 0; j < bi.biWidth; j++)
        {
            // temporary storage for RGB values to be copied
            RGBTRIPLE triple;

            // read RGB triple from infile
            fread(&triple, sizeof(RGBTRIPLE), 1, inptr);

            // write RGB triple to outfile n-times to stretch horizontally
            for (int k = 0; k < n; k++)
            {
                fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);
            }
        }

        fseek(inptr, -sizeof(bi.biWidth), SEEK_CUR); // go back to the beginning of the line

    }
}
4

2 に答える 2

1

元の(スケーリングされていない)ファイルから行を巻き戻すには、スケーリングされていない幅でfseekする必要があります。さらに言えば、元の次元も反復処理する必要があります。

また、sizeofおそらくあなたが望むことをしていません。変数自体のサイズが得られbiWidthます(おそらく整数なので、おそらく32ビットなので、sizeof(int)4になります)。を取り外しますsizeof

于 2014-03-19T06:56:43.033 に答える
0

それは本当に必要でしたが、もっとエレガントな解決策があると確信しています

int oWidth = bi.biWidth; //store original width
int oHeight = abs(bi.biHeight); //store original height
bi.biWidth = bi.biWidth * n;
bi.biHeight = bi.biHeight * n;    
.
.
.
if (m < n-1)
{
    fseek(inptr, -(oWidth*3), SEEK_CUR);
}
于 2014-03-19T19:05:01.240 に答える