CQ出版 Interface記事用サンプル。 トラ技カメラ+FIFOからデータを得て、 エリア判定後、デバイスに保存

Dependencies:   SDFileSystem mbed

Committer:
TETSUYA
Date:
Fri Sep 27 09:21:46 2013 +0000
Revision:
2:3aed552f3385
Parent:
1:c822ea77c7b2
Child:
3:8d5594ce5b00
??????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TETSUYA 0:1648bb4e70e5 1 /*
TETSUYA 0:1648bb4e70e5 2 Toragi-CCD-Cam OV7670andFIFO sample use driver
TETSUYA 0:1648bb4e70e5 3
TETSUYA 0:1648bb4e70e5 4 Sadaei Osakabe ( http://mbed.org/users/diasea/ )
TETSUYA 0:1648bb4e70e5 5 http://mbed.org/users/diasea/code/OV7670_with_AL422B_Color_Size_test/
TETSUYA 0:1648bb4e70e5 6
TETSUYA 0:1648bb4e70e5 7 */
TETSUYA 1:c822ea77c7b2 8 #include <string.h>
TETSUYA 1:c822ea77c7b2 9 #include <math.h>
TETSUYA 0:1648bb4e70e5 10 #include "mbed.h"
TETSUYA 0:1648bb4e70e5 11 #include <algorithm>
TETSUYA 0:1648bb4e70e5 12 #include "ov7670.h"
TETSUYA 0:1648bb4e70e5 13
TETSUYA 2:3aed552f3385 14
TETSUYA 0:1648bb4e70e5 15 #define QQVGA
TETSUYA 0:1648bb4e70e5 16 #ifdef QQVGA
TETSUYA 0:1648bb4e70e5 17 # define SIZEX (160)
TETSUYA 0:1648bb4e70e5 18 # define SIZEY (120)
TETSUYA 0:1648bb4e70e5 19 #else
TETSUYA 0:1648bb4e70e5 20 # define SIZEX (320)
TETSUYA 0:1648bb4e70e5 21 # define SIZEY (240)
TETSUYA 0:1648bb4e70e5 22 #endif
TETSUYA 0:1648bb4e70e5 23
TETSUYA 0:1648bb4e70e5 24 OV7670 camera(
TETSUYA 0:1648bb4e70e5 25 p28,p27, // SDA,SCL(I2C / SCCB)
TETSUYA 0:1648bb4e70e5 26 p25,p26,p29, // VSYNC,HREF,WEN(FIFO)
TETSUYA 0:1648bb4e70e5 27 p24,p23,p22,p21,p20,p19,p18,p17, // D7-D0
TETSUYA 0:1648bb4e70e5 28 p5,p6,p7) ; // RRST,OE,RCLK
TETSUYA 0:1648bb4e70e5 29
TETSUYA 0:1648bb4e70e5 30
TETSUYA 0:1648bb4e70e5 31
TETSUYA 0:1648bb4e70e5 32 LocalFileSystem local("local");
TETSUYA 2:3aed552f3385 33 BusOut myleds(LED1, LED2, LED3, LED4);
TETSUYA 2:3aed552f3385 34
TETSUYA 0:1648bb4e70e5 35 Serial pc(USBTX,USBRX) ;
TETSUYA 0:1648bb4e70e5 36
TETSUYA 0:1648bb4e70e5 37 int sizex = 0;
TETSUYA 0:1648bb4e70e5 38 int sizey = 0;
TETSUYA 0:1648bb4e70e5 39
TETSUYA 1:c822ea77c7b2 40 #define AREA_X 32
TETSUYA 1:c822ea77c7b2 41 #define AREA_Y 24
TETSUYA 2:3aed552f3385 42 #define AREA_DIV_X 5
TETSUYA 2:3aed552f3385 43 #define AREA_DIV_Y 5
TETSUYA 2:3aed552f3385 44 //#define AREA_THRESH 12000
TETSUYA 2:3aed552f3385 45 #define AREA_THRESH 8000
TETSUYA 2:3aed552f3385 46
TETSUYA 1:c822ea77c7b2 47
TETSUYA 1:c822ea77c7b2 48 char canvas[160][120] ; //18.5KB
TETSUYA 2:3aed552f3385 49 signed int AreaDiff[2][AREA_DIV_X][AREA_DIV_Y]; // 5x5 Area = 32x24dot Each Block
TETSUYA 1:c822ea77c7b2 50 int face_bank = 0;
TETSUYA 2:3aed552f3385 51 int Dbmode = 0;
TETSUYA 1:c822ea77c7b2 52
TETSUYA 0:1648bb4e70e5 53
TETSUYA 0:1648bb4e70e5 54 int main() {
TETSUYA 0:1648bb4e70e5 55 char color_format = 0;
TETSUYA 0:1648bb4e70e5 56 char c;
TETSUYA 1:c822ea77c7b2 57 int d1,d2 ;
TETSUYA 0:1648bb4e70e5 58 int mx, pixel , i;
TETSUYA 1:c822ea77c7b2 59 int pixc, pixelg;
TETSUYA 1:c822ea77c7b2 60 int sort[3];
TETSUYA 1:c822ea77c7b2 61 int ay = 0;
TETSUYA 1:c822ea77c7b2 62
TETSUYA 1:c822ea77c7b2 63 memset( AreaDiff, '\0', sizeof(AreaDiff));
TETSUYA 1:c822ea77c7b2 64
TETSUYA 0:1648bb4e70e5 65 pc.baud(115200);
TETSUYA 0:1648bb4e70e5 66 RESJMP:
TETSUYA 0:1648bb4e70e5 67 //pc.printf("Camera resetting..\r\n");
TETSUYA 0:1648bb4e70e5 68 camera.Reset();
TETSUYA 0:1648bb4e70e5 69
TETSUYA 0:1648bb4e70e5 70 //pc.printf("Before Init...\r\n");
TETSUYA 0:1648bb4e70e5 71 //camera.PrintRegister();
TETSUYA 0:1648bb4e70e5 72 switch( color_format ){
TETSUYA 0:1648bb4e70e5 73 case '1':
TETSUYA 0:1648bb4e70e5 74 camera.InitRGB444();
TETSUYA 0:1648bb4e70e5 75 break;
TETSUYA 0:1648bb4e70e5 76 case '2':
TETSUYA 0:1648bb4e70e5 77 camera.InitRGB555();
TETSUYA 0:1648bb4e70e5 78 break;
TETSUYA 0:1648bb4e70e5 79 default:
TETSUYA 0:1648bb4e70e5 80 camera.InitRGB565();
TETSUYA 0:1648bb4e70e5 81 break;
TETSUYA 0:1648bb4e70e5 82 }
TETSUYA 0:1648bb4e70e5 83
TETSUYA 0:1648bb4e70e5 84 //sizex = 160;
TETSUYA 0:1648bb4e70e5 85 //sizey = 120;
TETSUYA 0:1648bb4e70e5 86 camera.InitQQVGA();
TETSUYA 0:1648bb4e70e5 87
TETSUYA 0:1648bb4e70e5 88 camera.InitForFIFOWriteReset();
TETSUYA 0:1648bb4e70e5 89 camera.InitDefaultReg(true, true); // flipv/flipH
TETSUYA 0:1648bb4e70e5 90
TETSUYA 0:1648bb4e70e5 91 //pc.printf("After Init...\r\n");
TETSUYA 0:1648bb4e70e5 92 //camera.PrintRegister();
TETSUYA 0:1648bb4e70e5 93
TETSUYA 0:1648bb4e70e5 94 // CAPTURE and SEND LOOP
TETSUYA 0:1648bb4e70e5 95 while(1)
TETSUYA 0:1648bb4e70e5 96 {
TETSUYA 1:c822ea77c7b2 97 memset( &AreaDiff[face_bank], '\0', sizeof(AreaDiff[face_bank]));
TETSUYA 2:3aed552f3385 98 if ( Dbmode ){
TETSUYA 2:3aed552f3385 99 pc.printf("Hit Any Key to send RGBx160x120 Capture Data.\r\n") ;
TETSUYA 2:3aed552f3385 100 while(!pc.readable()) ;
TETSUYA 2:3aed552f3385 101 c = pc.getc() ;
TETSUYA 2:3aed552f3385 102 if (( c == '1' )|| ( c == '2' )||( c == '3' )){
TETSUYA 2:3aed552f3385 103 color_format = c;
TETSUYA 2:3aed552f3385 104 goto RESJMP;
TETSUYA 2:3aed552f3385 105 }else if (( c == 'd' )|| ( c == 'D' )){
TETSUYA 2:3aed552f3385 106 Dbmode = 0; // GO FreeRun
TETSUYA 2:3aed552f3385 107 continue;
TETSUYA 2:3aed552f3385 108 }
TETSUYA 2:3aed552f3385 109 }else{
TETSUYA 2:3aed552f3385 110 if ( pc.readable()) {
TETSUYA 2:3aed552f3385 111 c = pc.getc() ;
TETSUYA 2:3aed552f3385 112 if (( c == 'd' )|| ( c == 'D' )){
TETSUYA 2:3aed552f3385 113 Dbmode = 1; // GO DEBUGmode
TETSUYA 2:3aed552f3385 114 continue;
TETSUYA 2:3aed552f3385 115 }
TETSUYA 2:3aed552f3385 116 }
TETSUYA 2:3aed552f3385 117 pc.printf(" \r\n") ;
TETSUYA 0:1648bb4e70e5 118 }
TETSUYA 0:1648bb4e70e5 119 camera.CaptureNext(); // sample start!
TETSUYA 0:1648bb4e70e5 120 while(camera.CaptureDone() == false);
TETSUYA 0:1648bb4e70e5 121 camera.ReadStart();
TETSUYA 0:1648bb4e70e5 122 pixc = 0;
TETSUYA 1:c822ea77c7b2 123 ay = 0;
TETSUYA 0:1648bb4e70e5 124 for (int y = 0;y < SIZEY;y++) {
TETSUYA 1:c822ea77c7b2 125 ay = y / AREA_Y;
TETSUYA 0:1648bb4e70e5 126 for (int x = 0;x < SIZEX;x++) {
TETSUYA 0:1648bb4e70e5 127 d1 = camera.ReadOneByte() ; // upper nibble is XXX , lower nibble is B
TETSUYA 0:1648bb4e70e5 128 d2 = camera.ReadOneByte() ; // upper nibble is G , lower nibble is R
TETSUYA 0:1648bb4e70e5 129 pixel = ((unsigned int)d2 << 8) + ((unsigned int)d1 & 0xff);
TETSUYA 1:c822ea77c7b2 130
TETSUYA 1:c822ea77c7b2 131 // Make GrayScale
TETSUYA 1:c822ea77c7b2 132 // make 6bit Code on Each Color
TETSUYA 1:c822ea77c7b2 133 sort[0] = ((pixel >> 11) & 0x1f)<<1; // r
TETSUYA 1:c822ea77c7b2 134 sort[1] = ((pixel >> 5) & 0x3f); // g
TETSUYA 1:c822ea77c7b2 135 sort[2] = ((pixel ) & 0x1f)<<1; // b
TETSUYA 1:c822ea77c7b2 136
TETSUYA 1:c822ea77c7b2 137 int max = 0, min = 0xffff;
TETSUYA 1:c822ea77c7b2 138 for (int i=0;i<3;i++){
TETSUYA 1:c822ea77c7b2 139 if (sort[i] > max) max = sort[i];
TETSUYA 1:c822ea77c7b2 140 if (sort[i] < min) min = sort[i];
TETSUYA 1:c822ea77c7b2 141 }
TETSUYA 1:c822ea77c7b2 142 int gray = ((max + min) / 2) ;
TETSUYA 1:c822ea77c7b2 143
TETSUYA 1:c822ea77c7b2 144 pixelg = ((gray>>1)<<11) + (gray<<5) + (gray>>1);
TETSUYA 1:c822ea77c7b2 145 pixel = pixelg;
TETSUYA 2:3aed552f3385 146 canvas[x][y] = (char)( gray ) & 0x3f; // 6bit gray scale
TETSUYA 1:c822ea77c7b2 147
TETSUYA 1:c822ea77c7b2 148 // Make Difference AreaData
TETSUYA 2:3aed552f3385 149 //AreaDiff[face_bank][x/AREA_X][ay] += ( gray << 2 ); // 8bit scaler!
TETSUYA 2:3aed552f3385 150 AreaDiff[face_bank][x/AREA_X][ay] += ( gray ); // 6bit scaler!
TETSUYA 1:c822ea77c7b2 151
TETSUYA 2:3aed552f3385 152 if ( Dbmode ){
TETSUYA 2:3aed552f3385 153 // send <CRLF> and Count on each 16dot.
TETSUYA 2:3aed552f3385 154 if ( !(x%16) ){
TETSUYA 2:3aed552f3385 155 pc.printf("\r\n%04x: ",pixc ) ;
TETSUYA 2:3aed552f3385 156 pixc +=16;
TETSUYA 2:3aed552f3385 157 }
TETSUYA 2:3aed552f3385 158 pc.printf("%04x ",pixel) ;
TETSUYA 0:1648bb4e70e5 159 }
TETSUYA 0:1648bb4e70e5 160 }
TETSUYA 0:1648bb4e70e5 161
TETSUYA 0:1648bb4e70e5 162 }
TETSUYA 0:1648bb4e70e5 163 camera.ReadStop();
TETSUYA 1:c822ea77c7b2 164
TETSUYA 1:c822ea77c7b2 165 // Difference Check!!
TETSUYA 1:c822ea77c7b2 166 pc.printf("\r\n" ) ;
TETSUYA 2:3aed552f3385 167
TETSUYA 2:3aed552f3385 168 int err_c=0;
TETSUYA 1:c822ea77c7b2 169 int backArea = ( face_bank + 1 )&0x01;
TETSUYA 2:3aed552f3385 170 for (int y = 0; y < AREA_DIV_Y; y++) {
TETSUYA 2:3aed552f3385 171 if ( Dbmode ) pc.printf("Diff: " ) ;
TETSUYA 2:3aed552f3385 172
TETSUYA 2:3aed552f3385 173 for (int x = 0; x < AREA_DIV_X; x++) {
TETSUYA 1:c822ea77c7b2 174 int dif = abs( AreaDiff[backArea][x][y] - AreaDiff[face_bank][x][y] );
TETSUYA 2:3aed552f3385 175 if (dif >= AREA_THRESH) {
TETSUYA 2:3aed552f3385 176 err_c++; // Error Count
TETSUYA 2:3aed552f3385 177
TETSUYA 2:3aed552f3385 178 if ( Dbmode ) pc.printf("X%5d " , dif) ;
TETSUYA 1:c822ea77c7b2 179 }else{
TETSUYA 2:3aed552f3385 180 if ( Dbmode ) pc.printf("O%5d " , dif) ;
TETSUYA 1:c822ea77c7b2 181 }
TETSUYA 1:c822ea77c7b2 182 }
TETSUYA 2:3aed552f3385 183 if ( Dbmode ) {
TETSUYA 2:3aed552f3385 184 pc.printf(" " ) ;
TETSUYA 2:3aed552f3385 185 pc.printf(" \r\n" ) ;
TETSUYA 2:3aed552f3385 186 }
TETSUYA 1:c822ea77c7b2 187 }
TETSUYA 2:3aed552f3385 188 int led_s =0;
TETSUYA 2:3aed552f3385 189 switch ( err_c ){
TETSUYA 2:3aed552f3385 190 case 1:
TETSUYA 2:3aed552f3385 191 led_s =1;
TETSUYA 2:3aed552f3385 192 break;
TETSUYA 2:3aed552f3385 193 case 2:
TETSUYA 2:3aed552f3385 194 led_s =3;
TETSUYA 2:3aed552f3385 195 break;
TETSUYA 2:3aed552f3385 196 case 3:
TETSUYA 2:3aed552f3385 197 led_s =7;
TETSUYA 2:3aed552f3385 198 break;
TETSUYA 2:3aed552f3385 199 default:
TETSUYA 2:3aed552f3385 200 if ( err_c >= 3) {
TETSUYA 2:3aed552f3385 201 led_s =7;
TETSUYA 2:3aed552f3385 202 }else{
TETSUYA 2:3aed552f3385 203 led_s =0;
TETSUYA 2:3aed552f3385 204 }
TETSUYA 2:3aed552f3385 205 break;
TETSUYA 2:3aed552f3385 206 }
TETSUYA 2:3aed552f3385 207
TETSUYA 2:3aed552f3385 208 led_s |= ( face_bank )? 0x08 : 0x00 ;
TETSUYA 2:3aed552f3385 209 myleds = led_s ;
TETSUYA 2:3aed552f3385 210 if ( err_c >= 3 ){
TETSUYA 2:3aed552f3385 211 //pc.printf("\r\n") ;
TETSUYA 2:3aed552f3385 212 pixc = 0;
TETSUYA 2:3aed552f3385 213 for (int y = 0;y < SIZEY;y++) {
TETSUYA 2:3aed552f3385 214 for (int x = 0;x < SIZEX;x++) {
TETSUYA 2:3aed552f3385 215 char gray = 0;
TETSUYA 2:3aed552f3385 216 gray = canvas[x][y];
TETSUYA 2:3aed552f3385 217 pixel = ((gray>>1)<<11) + (gray<<5) + (gray>>1);
TETSUYA 2:3aed552f3385 218
TETSUYA 2:3aed552f3385 219 // send <CRLF> and Count on each 16dot.
TETSUYA 2:3aed552f3385 220 if ( !(x%16) ){
TETSUYA 2:3aed552f3385 221 pc.printf("\r\n%04x: ",pixc ) ;
TETSUYA 2:3aed552f3385 222 pixc +=16;
TETSUYA 2:3aed552f3385 223 }
TETSUYA 2:3aed552f3385 224 pc.printf("%04x ",pixel) ;
TETSUYA 2:3aed552f3385 225 }
TETSUYA 2:3aed552f3385 226 }
TETSUYA 2:3aed552f3385 227 }
TETSUYA 2:3aed552f3385 228 face_bank++;
TETSUYA 2:3aed552f3385 229 face_bank&=0x01;
TETSUYA 2:3aed552f3385 230
TETSUYA 2:3aed552f3385 231
TETSUYA 2:3aed552f3385 232 //pc.printf("\r\n") ;
TETSUYA 2:3aed552f3385 233 }
TETSUYA 2:3aed552f3385 234 }
TETSUYA 2:3aed552f3385 235
TETSUYA 2:3aed552f3385 236
TETSUYA 2:3aed552f3385 237
TETSUYA 1:c822ea77c7b2 238 /*
TETSUYA 1:c822ea77c7b2 239 // Median Filter
TETSUYA 1:c822ea77c7b2 240 for (int y = 1;y < SIZEY-1;y++) {
TETSUYA 1:c822ea77c7b2 241 for (int x = 1;x < SIZEX-1;x++) {
TETSUYA 1:c822ea77c7b2 242 int sortM[9] = { 0 };
TETSUYA 1:c822ea77c7b2 243 int p=0;
TETSUYA 1:c822ea77c7b2 244
TETSUYA 1:c822ea77c7b2 245 // Get Around Pixels
TETSUYA 1:c822ea77c7b2 246 for (int k = -1; k < 2; k++) {
TETSUYA 1:c822ea77c7b2 247 for (int j = -1; j < 2; j++) {
TETSUYA 1:c822ea77c7b2 248 sortM[p++] = canvas[x+j][y+k]; //grayscale data
TETSUYA 1:c822ea77c7b2 249 }
TETSUYA 1:c822ea77c7b2 250 }
TETSUYA 1:c822ea77c7b2 251 // sort now...
TETSUYA 1:c822ea77c7b2 252 for (int k = 0; k < 8; k++){
TETSUYA 1:c822ea77c7b2 253 for (int j = 8; j > k; j--) {
TETSUYA 1:c822ea77c7b2 254 if (sortM[j] < sortM[j - 1]) {
TETSUYA 1:c822ea77c7b2 255 int dmy = sortM[j];
TETSUYA 1:c822ea77c7b2 256 sortM[j] = sortM[j - 1];
TETSUYA 1:c822ea77c7b2 257 sortM[j - 1] = dmy;
TETSUYA 1:c822ea77c7b2 258 }
TETSUYA 1:c822ea77c7b2 259 }
TETSUYA 1:c822ea77c7b2 260 }
TETSUYA 1:c822ea77c7b2 261
TETSUYA 1:c822ea77c7b2 262 canvasM[x][y] = sortM[4]; // Center Data!
TETSUYA 1:c822ea77c7b2 263 }
TETSUYA 1:c822ea77c7b2 264 }
TETSUYA 1:c822ea77c7b2 265
TETSUYA 1:c822ea77c7b2 266 // Send Median Display
TETSUYA 1:c822ea77c7b2 267 pixc = 0;
TETSUYA 1:c822ea77c7b2 268 for (int y = 0;y < SIZEY;y++) {
TETSUYA 1:c822ea77c7b2 269 for (int x = 0;x < SIZEX;x++) {
TETSUYA 1:c822ea77c7b2 270 // send <CRLF> and Count on each 16dot.
TETSUYA 1:c822ea77c7b2 271 if ( !(x%16) ){
TETSUYA 1:c822ea77c7b2 272 pc.printf("\r\n%04x: ",pixc ) ;
TETSUYA 1:c822ea77c7b2 273 pixc +=16;
TETSUYA 1:c822ea77c7b2 274 }
TETSUYA 1:c822ea77c7b2 275 pc.printf("%04x ",canvasM[x][y]) ;
TETSUYA 1:c822ea77c7b2 276 }
TETSUYA 1:c822ea77c7b2 277 }
TETSUYA 1:c822ea77c7b2 278
TETSUYA 2:3aed552f3385 279 */
TETSUYA 0:1648bb4e70e5 280 /*
TETSUYA 1:c822ea77c7b2 281 int create_header(FILE *fp, int width, int height) ;
TETSUYA 0:1648bb4e70e5 282
TETSUYA 0:1648bb4e70e5 283 #if defined(BITMAPFILE) || defined(BAYERBITMAPFILE)
TETSUYA 0:1648bb4e70e5 284 #define BITMAPFILE
TETSUYA 0:1648bb4e70e5 285 #undef BAYERBITMAPFILE
TETSUYA 0:1648bb4e70e5 286 #undef HEXFILE
TETSUYA 0:1648bb4e70e5 287 #undef COLORBAR
TETSUYA 0:1648bb4e70e5 288
TETSUYA 0:1648bb4e70e5 289 #define FILEHEADERSIZE 14 //ファイルヘッダのサイズ
TETSUYA 0:1648bb4e70e5 290 #define INFOHEADERSIZE 40 //情報ヘッダのサイズ
TETSUYA 0:1648bb4e70e5 291 #define HEADERSIZE (FILEHEADERSIZE+INFOHEADERSIZE)
TETSUYA 0:1648bb4e70e5 292
TETSUYA 0:1648bb4e70e5 293 int create_header(FILE *fp, int width, int height) {
TETSUYA 0:1648bb4e70e5 294 int real_width;
TETSUYA 0:1648bb4e70e5 295 unsigned char header_buf[HEADERSIZE]; //ヘッダを格納する
TETSUYA 0:1648bb4e70e5 296 unsigned int file_size;
TETSUYA 0:1648bb4e70e5 297 unsigned int offset_to_data;
TETSUYA 0:1648bb4e70e5 298 unsigned long info_header_size;
TETSUYA 0:1648bb4e70e5 299 unsigned int planes;
TETSUYA 0:1648bb4e70e5 300 unsigned int color;
TETSUYA 0:1648bb4e70e5 301 unsigned long compress;
TETSUYA 0:1648bb4e70e5 302 unsigned long data_size;
TETSUYA 0:1648bb4e70e5 303 long xppm;
TETSUYA 0:1648bb4e70e5 304 long yppm;
TETSUYA 0:1648bb4e70e5 305
TETSUYA 0:1648bb4e70e5 306 real_width = width*3 + width%4;
TETSUYA 0:1648bb4e70e5 307
TETSUYA 0:1648bb4e70e5 308 //ここからヘッダ作成
TETSUYA 0:1648bb4e70e5 309 file_size = height * real_width + HEADERSIZE;
TETSUYA 0:1648bb4e70e5 310 offset_to_data = HEADERSIZE;
TETSUYA 0:1648bb4e70e5 311 info_header_size = INFOHEADERSIZE;
TETSUYA 0:1648bb4e70e5 312 planes = 1;
TETSUYA 0:1648bb4e70e5 313 color = 24;
TETSUYA 0:1648bb4e70e5 314 compress = 0;
TETSUYA 0:1648bb4e70e5 315 data_size = height * real_width;
TETSUYA 0:1648bb4e70e5 316 xppm = 1;
TETSUYA 0:1648bb4e70e5 317 yppm = 1;
TETSUYA 0:1648bb4e70e5 318
TETSUYA 0:1648bb4e70e5 319 header_buf[0] = 'B';
TETSUYA 0:1648bb4e70e5 320 header_buf[1] = 'M';
TETSUYA 0:1648bb4e70e5 321 memcpy(header_buf + 2, &file_size, sizeof(file_size));
TETSUYA 0:1648bb4e70e5 322 header_buf[6] = 0;
TETSUYA 0:1648bb4e70e5 323 header_buf[7] = 0;
TETSUYA 0:1648bb4e70e5 324 header_buf[8] = 0;
TETSUYA 0:1648bb4e70e5 325 header_buf[9] = 0;
TETSUYA 0:1648bb4e70e5 326 memcpy(header_buf + 10, &offset_to_data, sizeof(offset_to_data));
TETSUYA 0:1648bb4e70e5 327 memcpy(header_buf + 14, &info_header_size, sizeof(info_header_size));
TETSUYA 0:1648bb4e70e5 328 memcpy(header_buf + 18, &width, sizeof(width));
TETSUYA 0:1648bb4e70e5 329 height = height * -1; // データ格納順が逆なので、高さをマイナスとしている
TETSUYA 0:1648bb4e70e5 330 memcpy(header_buf + 22, &height, sizeof(height));
TETSUYA 0:1648bb4e70e5 331 memcpy(header_buf + 26, &planes, sizeof(planes));
TETSUYA 0:1648bb4e70e5 332 memcpy(header_buf + 28, &color, sizeof(color));
TETSUYA 0:1648bb4e70e5 333 memcpy(header_buf + 30, &compress, sizeof(compress));
TETSUYA 0:1648bb4e70e5 334 memcpy(header_buf + 34, &data_size, sizeof(data_size));
TETSUYA 0:1648bb4e70e5 335 memcpy(header_buf + 38, &xppm, sizeof(xppm));
TETSUYA 0:1648bb4e70e5 336 memcpy(header_buf + 42, &yppm, sizeof(yppm));
TETSUYA 0:1648bb4e70e5 337 header_buf[46] = 0;
TETSUYA 0:1648bb4e70e5 338 header_buf[47] = 0;
TETSUYA 0:1648bb4e70e5 339 header_buf[48] = 0;
TETSUYA 0:1648bb4e70e5 340 header_buf[49] = 0;
TETSUYA 0:1648bb4e70e5 341 header_buf[50] = 0;
TETSUYA 0:1648bb4e70e5 342 header_buf[51] = 0;
TETSUYA 0:1648bb4e70e5 343 header_buf[52] = 0;
TETSUYA 0:1648bb4e70e5 344 header_buf[53] = 0;
TETSUYA 0:1648bb4e70e5 345
TETSUYA 0:1648bb4e70e5 346 //ヘッダの書き込み
TETSUYA 0:1648bb4e70e5 347 fwrite(header_buf, sizeof(unsigned char), HEADERSIZE, fp);
TETSUYA 0:1648bb4e70e5 348
TETSUYA 0:1648bb4e70e5 349 return 0;
TETSUYA 0:1648bb4e70e5 350 }
TETSUYA 0:1648bb4e70e5 351 #endif
TETSUYA 0:1648bb4e70e5 352 */