test

Dependencies:   GR-PEACH_video USBHost USBHost_custom

Fork of GR-PEACH_Camera_in by Renesas

bitmap.h

Committer:
ymichimoto
Date:
2017-04-18
Revision:
4:23d1c6e5bca2
Parent:
0:2f1caf4ce924

File content as of revision 4:23d1c6e5bca2:

/** @file bitmap.h */
#include "mbed.h"

/** A class to communicate a bitmap
 *
 */
class bitmap {
public:

    /** convert RGB888 to bitmap
     *
     * @param file_name save file name
     * @param buf data buffer address
     * @param pic_width picture width
     * @param pic_height picture height
     * @return save data size
     */
    int Rgb888ToBmp(char * file_name, uint8_t * buf, unsigned long pic_width, unsigned long pic_height) {
        unsigned long offset_size = 54;
        unsigned long buf_stride = (((pic_width * 4u) + 31u) & ~31u);
        unsigned long pic_size = buf_stride * pic_height;
        unsigned long file_size = 0;
        int save_file_size = 0;
        int write_index = (buf_stride * pic_height) - buf_stride;
        unsigned long cnt;
        uint8_t wk_bitmap_buf[16];
        FILE * fp = fopen(file_name, "w");

        if (fp != NULL) {
            file_size = pic_size + offset_size;

            /* BITMAPFILEHEADER */
            wk_bitmap_buf[0]  = 'B';
            wk_bitmap_buf[1]  = 'M';
            wk_bitmap_buf[2]  = (unsigned char)(file_size >> 0);   /* bfSize */
            wk_bitmap_buf[3]  = (unsigned char)(file_size >> 8);   /* bfSize */
            wk_bitmap_buf[4]  = (unsigned char)(file_size >> 16);  /* bfSize */
            wk_bitmap_buf[5]  = (unsigned char)(file_size >> 24);  /* bfSize */
            wk_bitmap_buf[6]  = 0;  /* bfReserved1 */
            wk_bitmap_buf[7]  = 0;  /* bfReserved1 */
            wk_bitmap_buf[8]  = 0;  /* bfReserved2 */
            wk_bitmap_buf[9]  = 0;  /* bfReserved2 */
            wk_bitmap_buf[10] = (unsigned char)(offset_size >> 0);   /* bfOffBits */
            wk_bitmap_buf[11] = (unsigned char)(offset_size >> 8);   /* bfOffBits */
            wk_bitmap_buf[12] = (unsigned char)(offset_size >> 16);  /* bfOffBits */
            wk_bitmap_buf[13] = (unsigned char)(offset_size >> 24);  /* bfOffBits */
            fwrite(wk_bitmap_buf, sizeof(char), 14, fp);

            /* BITMAPINFOHEADER */
            wk_bitmap_buf[0]  = 40; /* biSize */
            wk_bitmap_buf[1]  = 0;  /* biSize */
            wk_bitmap_buf[2]  = 0;  /* biSize */
            wk_bitmap_buf[3]  = 0;  /* biSize */
            wk_bitmap_buf[4]  = (unsigned char)(pic_width >> 0);    /* biWidth */
            wk_bitmap_buf[5]  = (unsigned char)(pic_width >> 8);    /* biWidth */
            wk_bitmap_buf[6]  = (unsigned char)(pic_width >> 16);   /* biWidth */
            wk_bitmap_buf[7]  = (unsigned char)(pic_width >> 24);   /* biWidth */
            wk_bitmap_buf[8]  = (unsigned char)(pic_height >> 0);   /* biHeight */
            wk_bitmap_buf[9]  = (unsigned char)(pic_height >> 8);   /* biHeight */
            wk_bitmap_buf[10] = (unsigned char)(pic_height >> 16);  /* biHeight */
            wk_bitmap_buf[11] = (unsigned char)(pic_height >> 24);  /* biHeight */
            wk_bitmap_buf[12] = 1;  /* biPlanes */
            wk_bitmap_buf[13] = 0;  /* biPlanes */
            wk_bitmap_buf[14] = 32; /* biBitCount */
            wk_bitmap_buf[15] = 0;  /* biBitCount */
            fwrite(wk_bitmap_buf, sizeof(char), 16, fp);

            wk_bitmap_buf[0]  = 0;  /* biCopmression */
            wk_bitmap_buf[1]  = 0;  /* biCopmression */
            wk_bitmap_buf[2]  = 0;  /* biCopmression */
            wk_bitmap_buf[3]  = 0;  /* biCopmression */
            wk_bitmap_buf[4]  = (unsigned char)(pic_size >> 0);   /* biSizeImage */
            wk_bitmap_buf[5]  = (unsigned char)(pic_size >> 8);   /* biSizeImage */
            wk_bitmap_buf[6]  = (unsigned char)(pic_size >> 16);  /* biSizeImage */
            wk_bitmap_buf[7]  = (unsigned char)(pic_size >> 24);  /* biSizeImage */
            wk_bitmap_buf[8]  = 0;  /* biXPixPerMeter */
            wk_bitmap_buf[9]  = 0;  /* biXPixPerMeter */
            wk_bitmap_buf[10] = 0;  /* biXPixPerMeter */
            wk_bitmap_buf[11] = 0;  /* biXPixPerMeter */
            wk_bitmap_buf[12] = 0;  /* biYPixPerMeter */
            wk_bitmap_buf[13] = 0;  /* biYPixPerMeter */
            wk_bitmap_buf[14] = 0;  /* biYPixPerMeter */
            wk_bitmap_buf[15] = 0;  /* biYPixPerMeter */
            fwrite(wk_bitmap_buf, sizeof(char), 16, fp);

            wk_bitmap_buf[0]  = 0;  /* biClrUsed */
            wk_bitmap_buf[1]  = 0;  /* biClrUsed */
            wk_bitmap_buf[2]  = 0;  /* biClrUsed */
            wk_bitmap_buf[3]  = 0;  /* biClrUsed */
            wk_bitmap_buf[4]  = 0;  /* biCirImportant */
            wk_bitmap_buf[5]  = 0;  /* biCirImportant */
            wk_bitmap_buf[6]  = 0;  /* biCirImportant */
            wk_bitmap_buf[7]  = 0;  /* biCirImportant */
            fwrite(wk_bitmap_buf, sizeof(char), 8, fp);

            save_file_size    = 54;
            for (cnt = 0; cnt < pic_height; cnt ++) {
                save_file_size += fwrite(&buf[write_index], sizeof(char), buf_stride, fp);
                write_index -= buf_stride;
            }
            fclose(fp);
        }

        return (int)save_file_size;
    };
};