Как исправить размер файла bmp по вертикали, используя массив и fwrite? - PullRequest
0 голосов
/ 09 июня 2019

Я пишу код для изменения размера файлов BMP. Некоторые файлы корректно изменяют размеры, а некоторые нет. В чем моя ошибка?

Я помещаю оригинальный RGB в массив, уже изменяю его размер по горизонтали, и пытаюсь записать массив "n" раз, чтобы выгрузить его. Также я ставлю abs (biHeight) на случай, если он будет отрицательным.

bi.biWidth*=n;
bi.biHeight*=n;
int padding1 = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
bi.biSizeImage = (bi.biWidth* sizeof(RGBTRIPLE) + padding1) * abs(bi.biHeight);
bf.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (bi.biWidth * sizeof(RGBTRIPLE) + padding1) * abs(bi.biHeight);
int biWidth = bi.biWidth/n;
int biHeight =abs (bi.biHeight/n);
// write outfile's BITMAPFILEHEADER
fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, outptr);

// write outfile's BITMAPINFOHEADER
fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, outptr);

//arrey for pic
RGBTRIPLE pic[biWidth*n];
// determine padding for scanlines
int padding = (4 - (biWidth * sizeof(RGBTRIPLE)) % 4) % 4;


// iterate over infile's scanlines
for (int i = 0; i < biHeight; i++)
{
    int p=0;
    // iterate over pixels in scanline
    for (int j = 0; j < biWidth; j++)

    {
        // temporary storage
        RGBTRIPLE triple;


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

        //conwerting to n pixels in scanlines
        for(int t=0;t<n;t++)
        {
            pic[p]=triple;
            p++;
        }
    }
    //writing pic for n
    for (int h=0;h<n;h++)
    fwrite(&pic,sizeof(pic),1,outptr);

    // skip over padding, if any
    fseek(inptr, padding, SEEK_CUR);

    // then add it back (to demonstrate how)
    for (int k = 0; k < padding1; k++)
    {
        fputc(0x00, outptr);
    }
}

Я ожидаю получить правильно измененный размер образа файла, но он работает не для всех файлов :) Существуют resize.c и bmp.h.

:) resize.c компилируется.

:) не изменяет размер small.bmp, когда n равно 1

:( корректно изменяет размер small.bmp, когда n равно 2

Byte 20 of pixel data doesn't match. Expected 0x00, not 0xff

:( правильно изменяет small.bmp, когда n равно 3

Byte 29 of pixel data doesn't match. Expected 0x00, not 0xff

:) правильно изменяет размер small.bmp, когда n равно 4

:( правильно изменяет small.bmp, когда n равно 5

Byte 47 of pixel data doesn't match. Expected 0x00, not 0xff

:) корректно изменяет размер large.bmp, когда n равно 2

:) корректно изменяет размер smiley.bmp, когда n равно 2

:) правильно изменяет размер smiley.bmp, когда n равно 3

1 Ответ

0 голосов
/ 10 июня 2019
//writing pic for n
for (int h = 0; h < n; h++)
{
    fwrite(&pic, sizeof(pic), 1, outptr);
    // then add it back (to demonstrate how)
    for (int k = 0; k < padding1; k++)
    {
        fputc(0x00, outptr);
    }
}
// skip over padding, if any
fseek(inptr, padding, SEEK_CUR);

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...