javl / image2cpp

GNU General Public License v3.0
537 stars 160 forks source link

I tried to develop a converter in C, the output is flipped upside down #42

Closed eagl1 closed 3 years ago

eagl1 commented 3 years ago

Hi,

I get the result of the array, when I upload it to the arduino or paste it in your website, the image is flipped upside down.

Can you help me to fix the code ?

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

struct BitMap{
    short     Type;
    long      Size;
    short     Reserve1;
    short     Reserve2;
    long      OffBits;
    long      biSize;
    long      biWidth;
    long      biHeight;
    short     biPlanes;
    short     biBitCount;
    long      biCompression;
    long      biSizeImage;
    long      biXPelsPerMeter;
    long      biYPelsPerMeter;
    long      biClrUsed;
    long      biClrImportant;
} Header;

short arr[1024];

int main(void){
    short x= 0 ,y = 0 , p = 0;
    short pixelValue = 0 ;
    int   myPalette[2];

    FILE *BMPFile = fopen ("bmp.bmp", "r");
    if (BMPFile == NULL) return -1;

    fread(&Header.Type,               sizeof(Header.Type), 1, BMPFile);
    fread(&Header.Size,               sizeof(Header.Size), 1, BMPFile);
//    fread(&Header.Reserve1,           sizeof(Header.Reserve1) , 1, BMPFile);
    fread(&Header.Reserve2,           sizeof(Header.Reserve2) , 1, BMPFile);
    fread(&Header.OffBits,            sizeof(Header.OffBits), 1, BMPFile);
    fread(&Header.biSize,             sizeof(Header.biSize), 1, BMPFile);
    fread(&Header.biWidth,            sizeof(Header.biWidth), 1, BMPFile);
    fread(&Header.biHeight,           sizeof(Header.biHeight) , 1, BMPFile);

    fread(&Header.biPlanes,           sizeof(Header.biClrUsed),  1, BMPFile);
    fread(&Header.biBitCount,         sizeof(Header.biBitCount), 1, BMPFile);
    fread(&Header.biCompression,      sizeof(Header.biCompression), 1, BMPFile);
    fread(&Header.biSizeImage,        sizeof(Header.biSizeImage), 1, BMPFile);
    fread(&Header.biXPelsPerMeter,    sizeof(Header.biXPelsPerMeter), 1, BMPFile);
    fread(&Header.biYPelsPerMeter,    sizeof(Header.biYPelsPerMeter), 1, BMPFile);

    fread(&Header.biClrUsed,          sizeof(Header.biClrUsed), 1, BMPFile);
    fread(&Header.biClrImportant,     sizeof(Header.biClrImportant),  1, BMPFile);
    fread(&myPalette[0],              4,  2, BMPFile);

    printf("\nType:%hd  and Type in  %x\n", Header.Type,Header.Type);
    printf("Size:%ld\n", Header.Size);
    printf("Width:%ld\n", Header.biWidth);
    printf("Height:%ld\n", Header.biHeight);
    printf("biPlanes:%hd\n", Header.biPlanes);
    printf("biBitCount:%hd\n", Header.biBitCount);
    printf("biCompression:%ld\n", Header.biCompression);
    printf("biSizeImage:%ld\n", Header.biSizeImage);
    printf("biXPelsPerMeter:%ld\n", Header.biXPelsPerMeter);
    printf("biYPelsPerMeter:%ld\n", Header.biYPelsPerMeter);
    printf("biClrUsed:%ld\n", Header.biClrUsed);
    printf("biClrImportant:%ld\n\n", Header.biClrImportant);

    Header.biWidth = 16;
    Header.biHeight = 64;

////////////////////////////////////////////////////////////////////
// #1
    for(y = 0; y < Header.biHeight; y++){
        for(x = 0; x < Header.biWidth; x++){

            fread(&pixelValue, sizeof(unsigned char), 1, BMPFile);
            arr[(y*16)+x] = pixelValue;
            printf("0x%.2x, ",pixelValue);
            //printf("%d ",(y*16)+x);

            if(x%16 == 15){printf("\n");}
        }
    }
    fclose(BMPFile);

////////////////////////////////////////////////////////////////////
// #2
//    for(x=0; x<1024; x++){
//        printf("0x%.2x, ",arr[x]);
//        if(x%16 == 15){printf("\n");}
//    }

    return 0;
}
javl commented 3 years ago

If everything else seems to work OK (the image looks fine, just not in the right orientation) you can just use the rotate or flip option when using the converter to get a readable image. If the problem is that the image is upside down (but readable when you rotate the display) use the rotate option. If the image is flipped (meaning you need a mirror to read it) use the flip vertical option.