缩小C中的BMP图像

时间:2017-07-07 01:13:25

标签: c

 int main(void) {
    setvbuf( stdout, NULL, _IONBF, 0 );

    //Input File
    FILE* infile;
    infile = fopen("test.bmp", "rb");

    //Vars for image
    char bm[2];
    int imageSize;
    int fileSize;
    int width, height;
    char restOfDataOne[12];
    char restOfDataTwo[28];

    //Read Header Info
    fread(bm, 1, 2, infile);
    fread(&fileSize, 1, 4, infile);
    imageSize = fileSize - 54;
    fread(restOfDataOne, 1, 12, infile);
    fread(&width, sizeof(int), 1, infile);
    fread(&height, sizeof(int), 1, infile);
    fread(restOfDataTwo, 1, 28, infile);
    int rowWidth = width * 3;
    //Read Image Data
    unsigned char image[height][(width * 3)];
    fread(image, sizeof(char), imageSize, infile);

    //Close
    fclose(infile);

    //#################################################
    //Small BMP
    //#################################################
    FILE* smallOut;
    smallOut = fopen("small.bmp", "wb");

    //Small Vars
    int imageSizeSmall = imageSize / 4;
    int fileSizeSmall = imageSizeSmall + 54;
    int widthSmall = width / 2;
    int heightSmall = height / 2;
    int smallRowWidth = widthSmall * 3;
    unsigned char imageSmall[heightSmall][smallRowWidth];

    //Image Data
    int c, d, e;
    //For every 4 pixels.. store one in small image
    for(c = 0; c < rowWidth; c++) {
       for(d = 0; d < height; d++) {
            //imageSmall[d/2][c/2] = image[d][c];
            for(e = 0; e < 3; e++) {
                //grab every 1 out of 4 and place into small?
            }
       }
    }

所以我有以下代码读取bmp图像,然后我需要将其缩小并输出到较小的版本,宽度的一半和高度的一半,因此总共小4倍。所以我知道我必须抓住每3个像素中的1个?把它放到我的新的smallImage中,但是我已经尝试了嵌套for循环的多个东西,但是无法将算法降低。我在stackexchange上查看了多个帖子,但人们正在使用库,我无法使用它们。 (家庭作业)。我不是在寻找有人为我做这件事,只是想找人指点我正确的方向或者给我一个暗示? 完整代码在这里。 https://pastebin.com/ZVmXtmCx

1 个答案:

答案 0 :(得分:1)

您可以在以下地址对您的问题进行详细而详细的研究:

http://www.davdata.nl/math/bmresize.html

我引用:

  

这是通过从左到右,从上到下扫描这些像素来完成的   将目标像素投影到源位图上时。