A Bitmap library created a while back. Probably still works...

Dependencies:   mbed

Committer:
EricWieser
Date:
Wed Sep 08 18:18:42 2010 +0000
Revision:
0:ded454e83f81
Uploaded through the new system

Who changed what in which revision?

UserRevisionLine numberNew contents of line
EricWieser 0:ded454e83f81 1 #include "BitmapFile.h"
EricWieser 0:ded454e83f81 2
EricWieser 0:ded454e83f81 3
EricWieser 0:ded454e83f81 4 BitmapFile::BitmapFile(char* fname) : m_pFile(NULL)
EricWieser 0:ded454e83f81 5 {
EricWieser 0:ded454e83f81 6 m_fileName = fname;
EricWieser 0:ded454e83f81 7 Initialize();
EricWieser 0:ded454e83f81 8 }
EricWieser 0:ded454e83f81 9
EricWieser 0:ded454e83f81 10 BitmapFile::~BitmapFile()
EricWieser 0:ded454e83f81 11 {
EricWieser 0:ded454e83f81 12 delete[] m_fileName;
EricWieser 0:ded454e83f81 13 }
EricWieser 0:ded454e83f81 14
EricWieser 0:ded454e83f81 15 bool BitmapFile::Initialize()
EricWieser 0:ded454e83f81 16 {
EricWieser 0:ded454e83f81 17 bool success = true;
EricWieser 0:ded454e83f81 18 open();
EricWieser 0:ded454e83f81 19 fread(&BMPHeader,sizeof(BMPHeader),1,m_pFile);
EricWieser 0:ded454e83f81 20 success = (BMPHeader.b == 'B' && BMPHeader.m == 'M');
EricWieser 0:ded454e83f81 21
EricWieser 0:ded454e83f81 22 fread(&m_headerlength,sizeof(m_headerlength),1,m_pFile);
EricWieser 0:ded454e83f81 23 fread(&DIBHeader,m_headerlength,1,m_pFile);
EricWieser 0:ded454e83f81 24
EricWieser 0:ded454e83f81 25 /*Debugging code
EricWieser 0:ded454e83f81 26
EricWieser 0:ded454e83f81 27 Serial pc2(USBTX,USBRX);
EricWieser 0:ded454e83f81 28
EricWieser 0:ded454e83f81 29 pc2.printf("\n\rFile = %s", m_fileName);
EricWieser 0:ded454e83f81 30
EricWieser 0:ded454e83f81 31 pc2.printf("\n\rBMPHeader - Size = %d:\n\r",sizeof(BMPHeader));
EricWieser 0:ded454e83f81 32 pc2.printf("\tbm:\t\t%c%c\n\r",BMPHeader.b,BMPHeader.m);
EricWieser 0:ded454e83f81 33 pc2.printf("\tfilesize:\t%d\n\r",BMPHeader.filesize);
EricWieser 0:ded454e83f81 34 pc2.printf("\treserved:\t%d,%d\n\r",BMPHeader.reserved1,BMPHeader.reserved2);
EricWieser 0:ded454e83f81 35 pc2.printf("\toffset:\t\t%d\n\r",BMPHeader.offset);
EricWieser 0:ded454e83f81 36
EricWieser 0:ded454e83f81 37 pc2.printf("\n\rDIBHeader - Size = %d:\n\r",sizeof(DIBHeader));
EricWieser 0:ded454e83f81 38 pc2.printf("\theaderLength:\t%d\n\r",DIBHeader.headerLength);
EricWieser 0:ded454e83f81 39 pc2.printf("\theight:\t\t\t%d\n\r",DIBHeader.height);
EricWieser 0:ded454e83f81 40 pc2.printf("\twidth:\t\t%d\n\r",DIBHeader.width);
EricWieser 0:ded454e83f81 41 pc2.printf("\tcplanes:\t\t%d\n\r",DIBHeader.cplanes);
EricWieser 0:ded454e83f81 42 pc2.printf("\tcolordepth:\t\t%d\n\r",DIBHeader.colordepth);
EricWieser 0:ded454e83f81 43 pc2.printf("\tcompression:\t%d\n\r",DIBHeader.compression);
EricWieser 0:ded454e83f81 44 pc2.printf("\tdatasize:\t\t%d\n\r",DIBHeader.datasize);
EricWieser 0:ded454e83f81 45 pc2.printf("\tvres:\t\t%d\n\r",DIBHeader.vres);
EricWieser 0:ded454e83f81 46 pc2.printf("\thres:\t\t%d\n\r",DIBHeader.hres);
EricWieser 0:ded454e83f81 47
EricWieser 0:ded454e83f81 48
EricWieser 0:ded454e83f81 49 */
EricWieser 0:ded454e83f81 50
EricWieser 0:ded454e83f81 51 m_rowsize = 4*((getColorDepth()*getWidth()+31)/32);
EricWieser 0:ded454e83f81 52
EricWieser 0:ded454e83f81 53 close();
EricWieser 0:ded454e83f81 54 return success;
EricWieser 0:ded454e83f81 55 }
EricWieser 0:ded454e83f81 56
EricWieser 0:ded454e83f81 57 void BitmapFile::open()
EricWieser 0:ded454e83f81 58 {
EricWieser 0:ded454e83f81 59 if(m_pFile==NULL)
EricWieser 0:ded454e83f81 60 {
EricWieser 0:ded454e83f81 61 m_pFile = fopen(m_fileName, "r");
EricWieser 0:ded454e83f81 62 }
EricWieser 0:ded454e83f81 63 }
EricWieser 0:ded454e83f81 64
EricWieser 0:ded454e83f81 65 void BitmapFile::close()
EricWieser 0:ded454e83f81 66 {
EricWieser 0:ded454e83f81 67 if(m_pFile!=NULL)
EricWieser 0:ded454e83f81 68 {
EricWieser 0:ded454e83f81 69 fclose(m_pFile);
EricWieser 0:ded454e83f81 70 m_pFile = NULL;
EricWieser 0:ded454e83f81 71 }
EricWieser 0:ded454e83f81 72 }
EricWieser 0:ded454e83f81 73
EricWieser 0:ded454e83f81 74 /**********************************************************/
EricWieser 0:ded454e83f81 75 /*BMP Header Gets */
EricWieser 0:ded454e83f81 76 /**********************************************************/
EricWieser 0:ded454e83f81 77
EricWieser 0:ded454e83f81 78 int BitmapFile::getFileSize()
EricWieser 0:ded454e83f81 79 {
EricWieser 0:ded454e83f81 80 return BMPHeader.filesize;
EricWieser 0:ded454e83f81 81 }
EricWieser 0:ded454e83f81 82
EricWieser 0:ded454e83f81 83 int BitmapFile::getReserved1()
EricWieser 0:ded454e83f81 84 {
EricWieser 0:ded454e83f81 85 return BMPHeader.reserved1;
EricWieser 0:ded454e83f81 86 }
EricWieser 0:ded454e83f81 87
EricWieser 0:ded454e83f81 88 int BitmapFile::getReserved2()
EricWieser 0:ded454e83f81 89 {
EricWieser 0:ded454e83f81 90 return BMPHeader.reserved2;
EricWieser 0:ded454e83f81 91 }
EricWieser 0:ded454e83f81 92
EricWieser 0:ded454e83f81 93 int BitmapFile::getOffset()
EricWieser 0:ded454e83f81 94 {
EricWieser 0:ded454e83f81 95 return BMPHeader.offset;
EricWieser 0:ded454e83f81 96 }
EricWieser 0:ded454e83f81 97
EricWieser 0:ded454e83f81 98 /**********************************************************/
EricWieser 0:ded454e83f81 99 /*DIB Header Gets */
EricWieser 0:ded454e83f81 100 /**********************************************************/
EricWieser 0:ded454e83f81 101
EricWieser 0:ded454e83f81 102 int BitmapFile::getHeaderType()
EricWieser 0:ded454e83f81 103 {
EricWieser 0:ded454e83f81 104 return m_headerlength;
EricWieser 0:ded454e83f81 105 }
EricWieser 0:ded454e83f81 106
EricWieser 0:ded454e83f81 107 int BitmapFile::getHeight()
EricWieser 0:ded454e83f81 108 {
EricWieser 0:ded454e83f81 109 return DIBHeader.height;
EricWieser 0:ded454e83f81 110 }
EricWieser 0:ded454e83f81 111
EricWieser 0:ded454e83f81 112 int BitmapFile::getWidth()
EricWieser 0:ded454e83f81 113 {
EricWieser 0:ded454e83f81 114 return DIBHeader.width;
EricWieser 0:ded454e83f81 115 }
EricWieser 0:ded454e83f81 116
EricWieser 0:ded454e83f81 117 int BitmapFile::getCPlanes()
EricWieser 0:ded454e83f81 118 {
EricWieser 0:ded454e83f81 119 return DIBHeader.cplanes;
EricWieser 0:ded454e83f81 120 }
EricWieser 0:ded454e83f81 121
EricWieser 0:ded454e83f81 122 int BitmapFile::getColorDepth()
EricWieser 0:ded454e83f81 123 {
EricWieser 0:ded454e83f81 124 return DIBHeader.colordepth;
EricWieser 0:ded454e83f81 125 }
EricWieser 0:ded454e83f81 126
EricWieser 0:ded454e83f81 127 int BitmapFile::getCompression()
EricWieser 0:ded454e83f81 128 {
EricWieser 0:ded454e83f81 129 return DIBHeader.compression;
EricWieser 0:ded454e83f81 130 }
EricWieser 0:ded454e83f81 131
EricWieser 0:ded454e83f81 132 int BitmapFile::getDataSize()
EricWieser 0:ded454e83f81 133 {
EricWieser 0:ded454e83f81 134 return DIBHeader.datasize;
EricWieser 0:ded454e83f81 135 }
EricWieser 0:ded454e83f81 136
EricWieser 0:ded454e83f81 137 int BitmapFile::getHRes()
EricWieser 0:ded454e83f81 138 {
EricWieser 0:ded454e83f81 139 return DIBHeader.hres;
EricWieser 0:ded454e83f81 140 }
EricWieser 0:ded454e83f81 141
EricWieser 0:ded454e83f81 142 int BitmapFile::getVRes()
EricWieser 0:ded454e83f81 143 {
EricWieser 0:ded454e83f81 144 return DIBHeader.vres;
EricWieser 0:ded454e83f81 145 }
EricWieser 0:ded454e83f81 146
EricWieser 0:ded454e83f81 147 int BitmapFile::getNumPaletteColors()
EricWieser 0:ded454e83f81 148 {
EricWieser 0:ded454e83f81 149 return DIBHeader.numpalettecolors;
EricWieser 0:ded454e83f81 150 }
EricWieser 0:ded454e83f81 151
EricWieser 0:ded454e83f81 152 int BitmapFile::getImportantColors()
EricWieser 0:ded454e83f81 153 {
EricWieser 0:ded454e83f81 154 return DIBHeader.importantcolors;
EricWieser 0:ded454e83f81 155 }
EricWieser 0:ded454e83f81 156
EricWieser 0:ded454e83f81 157 /**********************************************************/
EricWieser 0:ded454e83f81 158 /*Data Gets */
EricWieser 0:ded454e83f81 159 /**********************************************************/
EricWieser 0:ded454e83f81 160
EricWieser 0:ded454e83f81 161 int BitmapFile::getRowSize()
EricWieser 0:ded454e83f81 162 {
EricWieser 0:ded454e83f81 163 return m_rowsize;
EricWieser 0:ded454e83f81 164 }
EricWieser 0:ded454e83f81 165
EricWieser 0:ded454e83f81 166 int BitmapFile::getPixel(int row, int col, bool closefile)
EricWieser 0:ded454e83f81 167 {
EricWieser 0:ded454e83f81 168 int color = -1;
EricWieser 0:ded454e83f81 169 if(row>=0 && row < getHeight() && col>=0 && col< getWidth())
EricWieser 0:ded454e83f81 170 {
EricWieser 0:ded454e83f81 171 if(getColorDepth() == 24)
EricWieser 0:ded454e83f81 172 {
EricWieser 0:ded454e83f81 173 open();
EricWieser 0:ded454e83f81 174 color = 0; //make sure the last byte is 00
EricWieser 0:ded454e83f81 175
EricWieser 0:ded454e83f81 176 int index = getOffset();
EricWieser 0:ded454e83f81 177 index += col*3;
EricWieser 0:ded454e83f81 178 index += row*4*ceil(getWidth()*3/4.0);
EricWieser 0:ded454e83f81 179 fseek(m_pFile, index, SEEK_SET);
EricWieser 0:ded454e83f81 180
EricWieser 0:ded454e83f81 181 fread (&color, 3,1,m_pFile);
EricWieser 0:ded454e83f81 182
EricWieser 0:ded454e83f81 183 if(closefile)
EricWieser 0:ded454e83f81 184 {
EricWieser 0:ded454e83f81 185 close();
EricWieser 0:ded454e83f81 186 }
EricWieser 0:ded454e83f81 187 }
EricWieser 0:ded454e83f81 188 }
EricWieser 0:ded454e83f81 189 return color;
EricWieser 0:ded454e83f81 190 }
EricWieser 0:ded454e83f81 191
EricWieser 0:ded454e83f81 192 int *BitmapFile::getRow(int row, bool closefile)
EricWieser 0:ded454e83f81 193 {
EricWieser 0:ded454e83f81 194 open();
EricWieser 0:ded454e83f81 195 int *colors = new int[getWidth()];
EricWieser 0:ded454e83f81 196 int index = getOffset() + m_rowsize*row;
EricWieser 0:ded454e83f81 197 fseek(m_pFile, index, SEEK_SET);
EricWieser 0:ded454e83f81 198 if(getColorDepth() == 24)
EricWieser 0:ded454e83f81 199 {
EricWieser 0:ded454e83f81 200 for(int i=0; i<getWidth(); i++)
EricWieser 0:ded454e83f81 201 {
EricWieser 0:ded454e83f81 202 fread(&colors[i],3,1,m_pFile);
EricWieser 0:ded454e83f81 203 }
EricWieser 0:ded454e83f81 204 }
EricWieser 0:ded454e83f81 205 else if(getColorDepth() == 1)
EricWieser 0:ded454e83f81 206 {
EricWieser 0:ded454e83f81 207 char *temp = new char[m_rowsize];
EricWieser 0:ded454e83f81 208 for(int i=0; i<m_rowsize; i++)
EricWieser 0:ded454e83f81 209 {
EricWieser 0:ded454e83f81 210 fread(&temp[i],sizeof(char),1,m_pFile);
EricWieser 0:ded454e83f81 211 }
EricWieser 0:ded454e83f81 212 for(int i=0; i<getWidth(); i++)
EricWieser 0:ded454e83f81 213 {
EricWieser 0:ded454e83f81 214 int byte = i / 8;
EricWieser 0:ded454e83f81 215 int bit = i % 8;
EricWieser 0:ded454e83f81 216 colors[i] = ((temp[byte] << bit) & 0x80) ? 0xFFFFFF : 0x000000;
EricWieser 0:ded454e83f81 217 }
EricWieser 0:ded454e83f81 218 delete [] temp;
EricWieser 0:ded454e83f81 219 }
EricWieser 0:ded454e83f81 220 if(closefile)
EricWieser 0:ded454e83f81 221 {
EricWieser 0:ded454e83f81 222 close();
EricWieser 0:ded454e83f81 223 }
EricWieser 0:ded454e83f81 224 return colors;
EricWieser 0:ded454e83f81 225 }
EricWieser 0:ded454e83f81 226
EricWieser 0:ded454e83f81 227 int *BitmapFile::getRowBW(int row, bool closefile)
EricWieser 0:ded454e83f81 228 {
EricWieser 0:ded454e83f81 229 open();
EricWieser 0:ded454e83f81 230 int *colors = new int[getWidth()];
EricWieser 0:ded454e83f81 231 int index = getOffset() + m_rowsize*row;
EricWieser 0:ded454e83f81 232 fseek(m_pFile, index, SEEK_SET);
EricWieser 0:ded454e83f81 233 if(getColorDepth() == 24)
EricWieser 0:ded454e83f81 234 {
EricWieser 0:ded454e83f81 235 for(int i=0; i<getWidth(); i++)
EricWieser 0:ded454e83f81 236 {
EricWieser 0:ded454e83f81 237 char temp[3];
EricWieser 0:ded454e83f81 238 fread(temp,sizeof(char),3,m_pFile);
EricWieser 0:ded454e83f81 239 int average = (temp[0]+temp[1]+temp[2])/3;
EricWieser 0:ded454e83f81 240 colors[i] = average>128 ? 0xFFFFFF : 0x000000;
EricWieser 0:ded454e83f81 241 }
EricWieser 0:ded454e83f81 242 }
EricWieser 0:ded454e83f81 243 else if(getColorDepth() == 1)
EricWieser 0:ded454e83f81 244 {
EricWieser 0:ded454e83f81 245 delete [] colors;
EricWieser 0:ded454e83f81 246 colors = getRow(row, closefile);
EricWieser 0:ded454e83f81 247 }
EricWieser 0:ded454e83f81 248 if(closefile)
EricWieser 0:ded454e83f81 249 {
EricWieser 0:ded454e83f81 250 close();
EricWieser 0:ded454e83f81 251 }
EricWieser 0:ded454e83f81 252 return colors;
EricWieser 0:ded454e83f81 253 }
EricWieser 0:ded454e83f81 254
EricWieser 0:ded454e83f81 255 char *BitmapFile::getRowBitstream(int row, bool closefile)
EricWieser 0:ded454e83f81 256 {
EricWieser 0:ded454e83f81 257 open();
EricWieser 0:ded454e83f81 258 int bitsperrow = (getWidth()+7)/8;
EricWieser 0:ded454e83f81 259 char *data = new char[bitsperrow];
EricWieser 0:ded454e83f81 260 for(int i = 0; i<bitsperrow; i++)
EricWieser 0:ded454e83f81 261 {
EricWieser 0:ded454e83f81 262 data[i] = 0;
EricWieser 0:ded454e83f81 263 }
EricWieser 0:ded454e83f81 264 int index = getOffset() + m_rowsize*row;
EricWieser 0:ded454e83f81 265 fseek(m_pFile, index, SEEK_SET);
EricWieser 0:ded454e83f81 266
EricWieser 0:ded454e83f81 267 if(getColorDepth() == 24)
EricWieser 0:ded454e83f81 268 {
EricWieser 0:ded454e83f81 269 for(int i=0; i<getWidth(); i++)
EricWieser 0:ded454e83f81 270 {
EricWieser 0:ded454e83f81 271 char temp[3];
EricWieser 0:ded454e83f81 272 fread(temp,sizeof(char),3,m_pFile);
EricWieser 0:ded454e83f81 273 int average = (temp[0]+temp[1]+temp[2])/3;
EricWieser 0:ded454e83f81 274 int val = average<128?0:1;
EricWieser 0:ded454e83f81 275 data[i/8] |= (val*0x80) >> (i%8);
EricWieser 0:ded454e83f81 276 }
EricWieser 0:ded454e83f81 277 }
EricWieser 0:ded454e83f81 278 else if(getColorDepth() == 1)
EricWieser 0:ded454e83f81 279 {
EricWieser 0:ded454e83f81 280 fread(data,sizeof(char),bitsperrow,m_pFile);
EricWieser 0:ded454e83f81 281 }
EricWieser 0:ded454e83f81 282
EricWieser 0:ded454e83f81 283 if(closefile)
EricWieser 0:ded454e83f81 284 {
EricWieser 0:ded454e83f81 285 close();
EricWieser 0:ded454e83f81 286 }
EricWieser 0:ded454e83f81 287 return data;
EricWieser 0:ded454e83f81 288 }