CQ出版 Interface記事用サンプル。 トラ技カメラ+FIFOからデータを得て、 エリア判定後、デバイスに保存
Dependencies: SDFileSystem mbed
main.cpp@2:3aed552f3385, 2013-09-27 (annotated)
- 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?
User | Revision | Line number | New 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 | */ |