回复 4# zhuhuan0000
#define BMP_NAME "/mnt/host/capture.bmp"
#define DATA_OFFSET 54
alt_u8 header[54] = {
0x42, // identity : B
0x4d, // identity : M
0, 0, 0, 0, // file size
0, 0, // reserved1
0, 0, // reserved2
54, 0, 0, 0, // RGB data offset
40, 0, 0, 0, // struct BITMAPINFOHEADER size
0, 0, 0, 0, // bmp width
0, 0, 0, 0, // bmp height
1, 0, // planes
24, 0, // bit per pixel
0, 0, 0, 0, // compression
0, 0, 0, 0, // data size
0, 0, 0, 0, // h resolution
0, 0, 0, 0, // v resolution
0, 0, 0, 0, // used colors
0, 0, 0, 0 // important colors
};
alt_u16 WIDTH = 800;
alt_u16 HEIGHT = 400;
int main() {
int i, j;
alt_u8 image[960000]; // image array 800 * 400 * 3 = 960000
alt_u16 file_size; // file size
FILE *fp = NULL; // file pointer for bmp file to write
alt_u32 data;
alt_u16 read_data1;
alt_u16 read_data2;
alt_u8 r, g, b;
CMOS_CAPTURE_START(CMOS0_BASE);
usleep(1000 * 1000 * 10);
CMOS_CAPTURE_STOP(CMOS0_BASE);
for(j = 0; j < HEIGHT; j++) {
for(i = 0; i < WIDTH; i++) {
data = CMOS_READ(CMOS0_BASE);
read_data1 = data & 0x0000ffff;
read_data2 = ((data & 0xffff0000) >> 16);
r = ((read_data2 & 0x03fc) >> 2);
g = ((read_data1 & 0x7c00) >> 7) + ((read_data2 & 0x7000) >> 12);
b = ((read_data1 & 0x03fc) >> 2);
*(image + 3 * (WIDTH * j + i) + 0) = b; // B
*(image + 3 * (WIDTH * j + i) + 1) = g; // G
*(image + 3 * (WIDTH * j + i) + 2) = r; // R
}
}
// file size
file_size = WIDTH * HEIGHT * 3 + DATA_OFFSET;
header[2] = (alt_u8)(file_size & 0x000000ff);
header[3] = (file_size >> 8 ) & 0x000000ff;
header[4] = (file_size >> 16) & 0x000000ff;
header[5] = (file_size >> 24) & 0x000000ff;
// width
header[18] = WIDTH & 0x000000ff;
header[19] = (WIDTH >> 8 ) & 0x000000ff;
header[20] = (WIDTH >> 16) & 0x000000ff;
header[21] = (WIDTH >> 24) & 0x000000ff;
// height
header[22] = HEIGHT & 0x000000ff;
header[23] = (HEIGHT >> 8 ) & 0x000000ff;
header[24] = (HEIGHT >> 16) & 0x000000ff;
header[25] = (HEIGHT >> 24) & 0x000000ff;
RGB打包为BMP代码 |