Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Orange_Ferrari_board_functional
EasyBMP.cpp@0:84a8bcfbdec9, 2013-10-07 (annotated)
- Committer:
- liangzhen
- Date:
- Mon Oct 07 22:58:19 2013 +0000
- Revision:
- 0:84a8bcfbdec9
power sensor tested;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
liangzhen | 0:84a8bcfbdec9 | 1 | /************************************************* |
liangzhen | 0:84a8bcfbdec9 | 2 | * * |
liangzhen | 0:84a8bcfbdec9 | 3 | * EasyBMP Cross-Platform Windows Bitmap Library * |
liangzhen | 0:84a8bcfbdec9 | 4 | * * |
liangzhen | 0:84a8bcfbdec9 | 5 | * Author: Paul Macklin * |
liangzhen | 0:84a8bcfbdec9 | 6 | * email: macklin01@users.sourceforge.net * |
liangzhen | 0:84a8bcfbdec9 | 7 | * support: http://easybmp.sourceforge.net * |
liangzhen | 0:84a8bcfbdec9 | 8 | * * |
liangzhen | 0:84a8bcfbdec9 | 9 | * file: EasyBMP.cpp * |
liangzhen | 0:84a8bcfbdec9 | 10 | * date added: 03-31-2006 * |
liangzhen | 0:84a8bcfbdec9 | 11 | * date modified: 12-01-2006 * |
liangzhen | 0:84a8bcfbdec9 | 12 | * version: 1.06 * |
liangzhen | 0:84a8bcfbdec9 | 13 | * * |
liangzhen | 0:84a8bcfbdec9 | 14 | * License: BSD (revised/modified) * |
liangzhen | 0:84a8bcfbdec9 | 15 | * Copyright: 2005-6 by the EasyBMP Project * |
liangzhen | 0:84a8bcfbdec9 | 16 | * * |
liangzhen | 0:84a8bcfbdec9 | 17 | * description: Actual source file * |
liangzhen | 0:84a8bcfbdec9 | 18 | * * |
liangzhen | 0:84a8bcfbdec9 | 19 | *************************************************/ |
liangzhen | 0:84a8bcfbdec9 | 20 | |
liangzhen | 0:84a8bcfbdec9 | 21 | #include "EasyBMP.h" |
liangzhen | 0:84a8bcfbdec9 | 22 | |
liangzhen | 0:84a8bcfbdec9 | 23 | /* These functions are defined in EasyBMP_DataStructures.h */ |
liangzhen | 0:84a8bcfbdec9 | 24 | |
liangzhen | 0:84a8bcfbdec9 | 25 | int ceildiv(int n, int d) |
liangzhen | 0:84a8bcfbdec9 | 26 | { |
liangzhen | 0:84a8bcfbdec9 | 27 | return 1 + ((n - 1) / d); |
liangzhen | 0:84a8bcfbdec9 | 28 | } |
liangzhen | 0:84a8bcfbdec9 | 29 | |
liangzhen | 0:84a8bcfbdec9 | 30 | int IntPow( int base, int exponent ) |
liangzhen | 0:84a8bcfbdec9 | 31 | { |
liangzhen | 0:84a8bcfbdec9 | 32 | int i; |
liangzhen | 0:84a8bcfbdec9 | 33 | int output = 1; |
liangzhen | 0:84a8bcfbdec9 | 34 | for( i=0 ; i < exponent ; i++ ) |
liangzhen | 0:84a8bcfbdec9 | 35 | { output *= base; } |
liangzhen | 0:84a8bcfbdec9 | 36 | return output; |
liangzhen | 0:84a8bcfbdec9 | 37 | } |
liangzhen | 0:84a8bcfbdec9 | 38 | |
liangzhen | 0:84a8bcfbdec9 | 39 | BMFH::BMFH() |
liangzhen | 0:84a8bcfbdec9 | 40 | { |
liangzhen | 0:84a8bcfbdec9 | 41 | bfType = 19778; |
liangzhen | 0:84a8bcfbdec9 | 42 | bfReserved1 = 0; |
liangzhen | 0:84a8bcfbdec9 | 43 | bfReserved2 = 0; |
liangzhen | 0:84a8bcfbdec9 | 44 | } |
liangzhen | 0:84a8bcfbdec9 | 45 | |
liangzhen | 0:84a8bcfbdec9 | 46 | BMIH::BMIH() |
liangzhen | 0:84a8bcfbdec9 | 47 | { |
liangzhen | 0:84a8bcfbdec9 | 48 | biPlanes = 1; |
liangzhen | 0:84a8bcfbdec9 | 49 | biCompression = 0; |
liangzhen | 0:84a8bcfbdec9 | 50 | biXPelsPerMeter = DefaultXPelsPerMeter; |
liangzhen | 0:84a8bcfbdec9 | 51 | biYPelsPerMeter = DefaultYPelsPerMeter; |
liangzhen | 0:84a8bcfbdec9 | 52 | biClrUsed = 0; |
liangzhen | 0:84a8bcfbdec9 | 53 | biClrImportant = 0; |
liangzhen | 0:84a8bcfbdec9 | 54 | } |
liangzhen | 0:84a8bcfbdec9 | 55 | |
liangzhen | 0:84a8bcfbdec9 | 56 | |
liangzhen | 0:84a8bcfbdec9 | 57 | /* These functions are defined in EasyBMP_BMP.h */ |
liangzhen | 0:84a8bcfbdec9 | 58 | |
liangzhen | 0:84a8bcfbdec9 | 59 | unsigned char BMP::GetPixel( int i, int j ) const |
liangzhen | 0:84a8bcfbdec9 | 60 | { |
liangzhen | 0:84a8bcfbdec9 | 61 | if(PixelsBW[i / 32][j] & ( 0x1 << (31 - i % 32))){ |
liangzhen | 0:84a8bcfbdec9 | 62 | return 1; // white |
liangzhen | 0:84a8bcfbdec9 | 63 | }else{ |
liangzhen | 0:84a8bcfbdec9 | 64 | return 0; // black |
liangzhen | 0:84a8bcfbdec9 | 65 | } |
liangzhen | 0:84a8bcfbdec9 | 66 | } |
liangzhen | 0:84a8bcfbdec9 | 67 | |
liangzhen | 0:84a8bcfbdec9 | 68 | bool BMP::SetPixel( int i, int j ) |
liangzhen | 0:84a8bcfbdec9 | 69 | { |
liangzhen | 0:84a8bcfbdec9 | 70 | PixelsR[i / 32][j] |= ( 0x1 << (31 - i % 32)); |
liangzhen | 0:84a8bcfbdec9 | 71 | return true; |
liangzhen | 0:84a8bcfbdec9 | 72 | } |
liangzhen | 0:84a8bcfbdec9 | 73 | |
liangzhen | 0:84a8bcfbdec9 | 74 | BMP::BMP() |
liangzhen | 0:84a8bcfbdec9 | 75 | { |
liangzhen | 0:84a8bcfbdec9 | 76 | Width = 1; |
liangzhen | 0:84a8bcfbdec9 | 77 | Height = 1; |
liangzhen | 0:84a8bcfbdec9 | 78 | BitDepth = 24; |
liangzhen | 0:84a8bcfbdec9 | 79 | PixelsBW = new unsigned int* [1]; |
liangzhen | 0:84a8bcfbdec9 | 80 | PixelsBW[0] = new unsigned int [1]; |
liangzhen | 0:84a8bcfbdec9 | 81 | PixelsR = new unsigned int* [1]; |
liangzhen | 0:84a8bcfbdec9 | 82 | PixelsR[0] = new unsigned int [1]; |
liangzhen | 0:84a8bcfbdec9 | 83 | |
liangzhen | 0:84a8bcfbdec9 | 84 | Colors = NULL; |
liangzhen | 0:84a8bcfbdec9 | 85 | |
liangzhen | 0:84a8bcfbdec9 | 86 | XPelsPerMeter = 0; |
liangzhen | 0:84a8bcfbdec9 | 87 | YPelsPerMeter = 0; |
liangzhen | 0:84a8bcfbdec9 | 88 | |
liangzhen | 0:84a8bcfbdec9 | 89 | MetaData1 = NULL; |
liangzhen | 0:84a8bcfbdec9 | 90 | SizeOfMetaData1 = 0; |
liangzhen | 0:84a8bcfbdec9 | 91 | MetaData2 = NULL; |
liangzhen | 0:84a8bcfbdec9 | 92 | SizeOfMetaData2 = 0; |
liangzhen | 0:84a8bcfbdec9 | 93 | } |
liangzhen | 0:84a8bcfbdec9 | 94 | |
liangzhen | 0:84a8bcfbdec9 | 95 | |
liangzhen | 0:84a8bcfbdec9 | 96 | BMP::~BMP() |
liangzhen | 0:84a8bcfbdec9 | 97 | { |
liangzhen | 0:84a8bcfbdec9 | 98 | int i; |
liangzhen | 0:84a8bcfbdec9 | 99 | for(i=0;i<ceildiv(Width,32);i++) |
liangzhen | 0:84a8bcfbdec9 | 100 | { delete [] PixelsBW[i]; } |
liangzhen | 0:84a8bcfbdec9 | 101 | delete [] PixelsBW; |
liangzhen | 0:84a8bcfbdec9 | 102 | |
liangzhen | 0:84a8bcfbdec9 | 103 | for(i=0;i<ceildiv(Width,32);i++) |
liangzhen | 0:84a8bcfbdec9 | 104 | { delete [] PixelsR[i]; } |
liangzhen | 0:84a8bcfbdec9 | 105 | delete [] PixelsR; |
liangzhen | 0:84a8bcfbdec9 | 106 | |
liangzhen | 0:84a8bcfbdec9 | 107 | if( Colors ) |
liangzhen | 0:84a8bcfbdec9 | 108 | { delete [] Colors; } |
liangzhen | 0:84a8bcfbdec9 | 109 | |
liangzhen | 0:84a8bcfbdec9 | 110 | if( MetaData1 ) |
liangzhen | 0:84a8bcfbdec9 | 111 | { delete [] MetaData1; } |
liangzhen | 0:84a8bcfbdec9 | 112 | if( MetaData2 ) |
liangzhen | 0:84a8bcfbdec9 | 113 | { delete [] MetaData2; } |
liangzhen | 0:84a8bcfbdec9 | 114 | } |
liangzhen | 0:84a8bcfbdec9 | 115 | |
liangzhen | 0:84a8bcfbdec9 | 116 | // int BMP::TellBitDepth( void ) const |
liangzhen | 0:84a8bcfbdec9 | 117 | int BMP::TellBitDepth( void ) |
liangzhen | 0:84a8bcfbdec9 | 118 | { return BitDepth; } |
liangzhen | 0:84a8bcfbdec9 | 119 | |
liangzhen | 0:84a8bcfbdec9 | 120 | // int BMP::TellHeight( void ) const |
liangzhen | 0:84a8bcfbdec9 | 121 | int BMP::TellHeight( void ) |
liangzhen | 0:84a8bcfbdec9 | 122 | { return Height; } |
liangzhen | 0:84a8bcfbdec9 | 123 | |
liangzhen | 0:84a8bcfbdec9 | 124 | // int BMP::TellWidth( void ) const |
liangzhen | 0:84a8bcfbdec9 | 125 | int BMP::TellWidth( void ) |
liangzhen | 0:84a8bcfbdec9 | 126 | { return Width; } |
liangzhen | 0:84a8bcfbdec9 | 127 | |
liangzhen | 0:84a8bcfbdec9 | 128 | // int BMP::TellNumberOfColors( void ) const |
liangzhen | 0:84a8bcfbdec9 | 129 | int BMP::TellNumberOfColors( void ) |
liangzhen | 0:84a8bcfbdec9 | 130 | { |
liangzhen | 0:84a8bcfbdec9 | 131 | int output = IntPow( 2, BitDepth ); |
liangzhen | 0:84a8bcfbdec9 | 132 | return output; |
liangzhen | 0:84a8bcfbdec9 | 133 | } |
liangzhen | 0:84a8bcfbdec9 | 134 | |
liangzhen | 0:84a8bcfbdec9 | 135 | bool BMP::SetBitDepth( int NewDepth ) |
liangzhen | 0:84a8bcfbdec9 | 136 | { |
liangzhen | 0:84a8bcfbdec9 | 137 | using namespace std; |
liangzhen | 0:84a8bcfbdec9 | 138 | if( NewDepth != 1 && NewDepth != 4) |
liangzhen | 0:84a8bcfbdec9 | 139 | { |
liangzhen | 0:84a8bcfbdec9 | 140 | return false; |
liangzhen | 0:84a8bcfbdec9 | 141 | } |
liangzhen | 0:84a8bcfbdec9 | 142 | |
liangzhen | 0:84a8bcfbdec9 | 143 | BitDepth = NewDepth; |
liangzhen | 0:84a8bcfbdec9 | 144 | if( Colors ) |
liangzhen | 0:84a8bcfbdec9 | 145 | { delete [] Colors; } |
liangzhen | 0:84a8bcfbdec9 | 146 | int NumberOfColors = IntPow( 2, BitDepth ); |
liangzhen | 0:84a8bcfbdec9 | 147 | |
liangzhen | 0:84a8bcfbdec9 | 148 | { Colors = new RGBApixel [NumberOfColors]; } |
liangzhen | 0:84a8bcfbdec9 | 149 | { CreateStandardColorTable(); } |
liangzhen | 0:84a8bcfbdec9 | 150 | |
liangzhen | 0:84a8bcfbdec9 | 151 | return true; |
liangzhen | 0:84a8bcfbdec9 | 152 | } |
liangzhen | 0:84a8bcfbdec9 | 153 | |
liangzhen | 0:84a8bcfbdec9 | 154 | bool BMP::SetSize(int NewWidth , int NewHeight ) |
liangzhen | 0:84a8bcfbdec9 | 155 | { |
liangzhen | 0:84a8bcfbdec9 | 156 | using namespace std; |
liangzhen | 0:84a8bcfbdec9 | 157 | if( NewWidth <= 0 || NewHeight <= 0 ) |
liangzhen | 0:84a8bcfbdec9 | 158 | { |
liangzhen | 0:84a8bcfbdec9 | 159 | return false; |
liangzhen | 0:84a8bcfbdec9 | 160 | } |
liangzhen | 0:84a8bcfbdec9 | 161 | |
liangzhen | 0:84a8bcfbdec9 | 162 | int i,j; |
liangzhen | 0:84a8bcfbdec9 | 163 | |
liangzhen | 0:84a8bcfbdec9 | 164 | for(i=0;i<ceildiv(Width,32);i++) |
liangzhen | 0:84a8bcfbdec9 | 165 | { delete [] PixelsBW[i]; } |
liangzhen | 0:84a8bcfbdec9 | 166 | delete [] PixelsBW; |
liangzhen | 0:84a8bcfbdec9 | 167 | |
liangzhen | 0:84a8bcfbdec9 | 168 | for(i=0;i<ceildiv(Width,32);i++) |
liangzhen | 0:84a8bcfbdec9 | 169 | { delete [] PixelsR[i]; } |
liangzhen | 0:84a8bcfbdec9 | 170 | delete [] PixelsR; |
liangzhen | 0:84a8bcfbdec9 | 171 | |
liangzhen | 0:84a8bcfbdec9 | 172 | Width = NewWidth; |
liangzhen | 0:84a8bcfbdec9 | 173 | Height = NewHeight; |
liangzhen | 0:84a8bcfbdec9 | 174 | PixelsBW = new unsigned int* [ ceildiv(Width,32) ]; |
liangzhen | 0:84a8bcfbdec9 | 175 | PixelsR = new unsigned int* [ ceildiv(Width,32) ]; |
liangzhen | 0:84a8bcfbdec9 | 176 | |
liangzhen | 0:84a8bcfbdec9 | 177 | for(i=0;i<ceildiv(Width,32);i++){ |
liangzhen | 0:84a8bcfbdec9 | 178 | PixelsBW[i] = new unsigned int [ Height ]; |
liangzhen | 0:84a8bcfbdec9 | 179 | PixelsR[i] = new unsigned int [ Height ]; |
liangzhen | 0:84a8bcfbdec9 | 180 | for( j=0 ; j < Height ; j++ ){ |
liangzhen | 0:84a8bcfbdec9 | 181 | PixelsBW[i][j] = 0; |
liangzhen | 0:84a8bcfbdec9 | 182 | PixelsR[i][j] = 0; |
liangzhen | 0:84a8bcfbdec9 | 183 | } |
liangzhen | 0:84a8bcfbdec9 | 184 | } |
liangzhen | 0:84a8bcfbdec9 | 185 | |
liangzhen | 0:84a8bcfbdec9 | 186 | return true; |
liangzhen | 0:84a8bcfbdec9 | 187 | } |
liangzhen | 0:84a8bcfbdec9 | 188 | #include<iostream> |
liangzhen | 0:84a8bcfbdec9 | 189 | |
liangzhen | 0:84a8bcfbdec9 | 190 | bool BMP::WriteToFile( const char* FileName ) |
liangzhen | 0:84a8bcfbdec9 | 191 | { |
liangzhen | 0:84a8bcfbdec9 | 192 | |
liangzhen | 0:84a8bcfbdec9 | 193 | using namespace std; |
liangzhen | 0:84a8bcfbdec9 | 194 | |
liangzhen | 0:84a8bcfbdec9 | 195 | cout << "called" << endl; |
liangzhen | 0:84a8bcfbdec9 | 196 | if( !EasyBMPcheckDataSize() ) |
liangzhen | 0:84a8bcfbdec9 | 197 | { |
liangzhen | 0:84a8bcfbdec9 | 198 | return false; |
liangzhen | 0:84a8bcfbdec9 | 199 | } |
liangzhen | 0:84a8bcfbdec9 | 200 | |
liangzhen | 0:84a8bcfbdec9 | 201 | FILE* fp = fopen( FileName, "wb" ); |
liangzhen | 0:84a8bcfbdec9 | 202 | |
liangzhen | 0:84a8bcfbdec9 | 203 | |
liangzhen | 0:84a8bcfbdec9 | 204 | if( fp == NULL ) |
liangzhen | 0:84a8bcfbdec9 | 205 | { |
liangzhen | 0:84a8bcfbdec9 | 206 | cout << "can't write\r\n" << endl; |
liangzhen | 0:84a8bcfbdec9 | 207 | fclose( fp ); |
liangzhen | 0:84a8bcfbdec9 | 208 | return false; |
liangzhen | 0:84a8bcfbdec9 | 209 | } |
liangzhen | 0:84a8bcfbdec9 | 210 | |
liangzhen | 0:84a8bcfbdec9 | 211 | // some preliminaries |
liangzhen | 0:84a8bcfbdec9 | 212 | |
liangzhen | 0:84a8bcfbdec9 | 213 | double dBytesPerPixel = ( (double) BitDepth ) / 8.0; |
liangzhen | 0:84a8bcfbdec9 | 214 | double dBytesPerRow = dBytesPerPixel * (Width+0.0); |
liangzhen | 0:84a8bcfbdec9 | 215 | dBytesPerRow = ceil(dBytesPerRow); |
liangzhen | 0:84a8bcfbdec9 | 216 | |
liangzhen | 0:84a8bcfbdec9 | 217 | int BytePaddingPerRow = 4 - ( (int) (dBytesPerRow) )% 4; |
liangzhen | 0:84a8bcfbdec9 | 218 | if( BytePaddingPerRow == 4 ) |
liangzhen | 0:84a8bcfbdec9 | 219 | { BytePaddingPerRow = 0; } |
liangzhen | 0:84a8bcfbdec9 | 220 | |
liangzhen | 0:84a8bcfbdec9 | 221 | double dActualBytesPerRow = dBytesPerRow + BytePaddingPerRow; |
liangzhen | 0:84a8bcfbdec9 | 222 | |
liangzhen | 0:84a8bcfbdec9 | 223 | double dTotalPixelBytes = Height * dActualBytesPerRow; |
liangzhen | 0:84a8bcfbdec9 | 224 | |
liangzhen | 0:84a8bcfbdec9 | 225 | double dPaletteSize = 0; |
liangzhen | 0:84a8bcfbdec9 | 226 | if( BitDepth == 1 || BitDepth == 4) |
liangzhen | 0:84a8bcfbdec9 | 227 | { dPaletteSize = IntPow(2,BitDepth)*4.0; } |
liangzhen | 0:84a8bcfbdec9 | 228 | |
liangzhen | 0:84a8bcfbdec9 | 229 | double dTotalFileSize = 14 + 40 + dPaletteSize + dTotalPixelBytes; |
liangzhen | 0:84a8bcfbdec9 | 230 | |
liangzhen | 0:84a8bcfbdec9 | 231 | // write the file header |
liangzhen | 0:84a8bcfbdec9 | 232 | |
liangzhen | 0:84a8bcfbdec9 | 233 | BMFH bmfh; |
liangzhen | 0:84a8bcfbdec9 | 234 | bmfh.bfSize = (ebmpDWORD) dTotalFileSize; |
liangzhen | 0:84a8bcfbdec9 | 235 | bmfh.bfReserved1 = 0; |
liangzhen | 0:84a8bcfbdec9 | 236 | bmfh.bfReserved2 = 0; |
liangzhen | 0:84a8bcfbdec9 | 237 | bmfh.bfOffBits = (ebmpDWORD) (14+40+dPaletteSize); |
liangzhen | 0:84a8bcfbdec9 | 238 | |
liangzhen | 0:84a8bcfbdec9 | 239 | fwrite( (char*) &(bmfh.bfType) , sizeof(ebmpWORD) , 1 , fp ); |
liangzhen | 0:84a8bcfbdec9 | 240 | fwrite( (char*) &(bmfh.bfSize) , sizeof(ebmpDWORD) , 1 , fp ); |
liangzhen | 0:84a8bcfbdec9 | 241 | fwrite( (char*) &(bmfh.bfReserved1) , sizeof(ebmpWORD) , 1 , fp ); |
liangzhen | 0:84a8bcfbdec9 | 242 | fwrite( (char*) &(bmfh.bfReserved2) , sizeof(ebmpWORD) , 1 , fp ); |
liangzhen | 0:84a8bcfbdec9 | 243 | fwrite( (char*) &(bmfh.bfOffBits) , sizeof(ebmpDWORD) , 1 , fp ); |
liangzhen | 0:84a8bcfbdec9 | 244 | |
liangzhen | 0:84a8bcfbdec9 | 245 | // write the info header |
liangzhen | 0:84a8bcfbdec9 | 246 | |
liangzhen | 0:84a8bcfbdec9 | 247 | BMIH bmih; |
liangzhen | 0:84a8bcfbdec9 | 248 | bmih.biSize = 40; |
liangzhen | 0:84a8bcfbdec9 | 249 | bmih.biWidth = Width; |
liangzhen | 0:84a8bcfbdec9 | 250 | bmih.biHeight = Height; |
liangzhen | 0:84a8bcfbdec9 | 251 | bmih.biPlanes = 1; |
liangzhen | 0:84a8bcfbdec9 | 252 | bmih.biBitCount = BitDepth; |
liangzhen | 0:84a8bcfbdec9 | 253 | bmih.biCompression = 0; |
liangzhen | 0:84a8bcfbdec9 | 254 | bmih.biSizeImage = (ebmpDWORD) dTotalPixelBytes; |
liangzhen | 0:84a8bcfbdec9 | 255 | if( XPelsPerMeter ) |
liangzhen | 0:84a8bcfbdec9 | 256 | { bmih.biXPelsPerMeter = XPelsPerMeter; } |
liangzhen | 0:84a8bcfbdec9 | 257 | else |
liangzhen | 0:84a8bcfbdec9 | 258 | { bmih.biXPelsPerMeter = DefaultXPelsPerMeter; } |
liangzhen | 0:84a8bcfbdec9 | 259 | if( YPelsPerMeter ) |
liangzhen | 0:84a8bcfbdec9 | 260 | { bmih.biYPelsPerMeter = YPelsPerMeter; } |
liangzhen | 0:84a8bcfbdec9 | 261 | else |
liangzhen | 0:84a8bcfbdec9 | 262 | { bmih.biYPelsPerMeter = DefaultYPelsPerMeter; } |
liangzhen | 0:84a8bcfbdec9 | 263 | |
liangzhen | 0:84a8bcfbdec9 | 264 | bmih.biClrUsed = 0; |
liangzhen | 0:84a8bcfbdec9 | 265 | bmih.biClrImportant = 0; |
liangzhen | 0:84a8bcfbdec9 | 266 | |
liangzhen | 0:84a8bcfbdec9 | 267 | // indicates that we'll be using bit fields for 16-bit files |
liangzhen | 0:84a8bcfbdec9 | 268 | if( BitDepth == 16 ) |
liangzhen | 0:84a8bcfbdec9 | 269 | { bmih.biCompression = 3; } |
liangzhen | 0:84a8bcfbdec9 | 270 | |
liangzhen | 0:84a8bcfbdec9 | 271 | fwrite( (char*) &(bmih.biSize) , sizeof(ebmpDWORD) , 1 , fp ); |
liangzhen | 0:84a8bcfbdec9 | 272 | fwrite( (char*) &(bmih.biWidth) , sizeof(ebmpDWORD) , 1 , fp ); |
liangzhen | 0:84a8bcfbdec9 | 273 | fwrite( (char*) &(bmih.biHeight) , sizeof(ebmpDWORD) , 1 , fp ); |
liangzhen | 0:84a8bcfbdec9 | 274 | fwrite( (char*) &(bmih.biPlanes) , sizeof(ebmpWORD) , 1 , fp ); |
liangzhen | 0:84a8bcfbdec9 | 275 | fwrite( (char*) &(bmih.biBitCount) , sizeof(ebmpWORD) , 1 , fp ); |
liangzhen | 0:84a8bcfbdec9 | 276 | fwrite( (char*) &(bmih.biCompression) , sizeof(ebmpDWORD) , 1 , fp ); |
liangzhen | 0:84a8bcfbdec9 | 277 | fwrite( (char*) &(bmih.biSizeImage) , sizeof(ebmpDWORD) , 1 , fp ); |
liangzhen | 0:84a8bcfbdec9 | 278 | fwrite( (char*) &(bmih.biXPelsPerMeter) , sizeof(ebmpDWORD) , 1 , fp ); |
liangzhen | 0:84a8bcfbdec9 | 279 | fwrite( (char*) &(bmih.biYPelsPerMeter) , sizeof(ebmpDWORD) , 1 , fp ); |
liangzhen | 0:84a8bcfbdec9 | 280 | fwrite( (char*) &(bmih.biClrUsed) , sizeof(ebmpDWORD) , 1 , fp); |
liangzhen | 0:84a8bcfbdec9 | 281 | fwrite( (char*) &(bmih.biClrImportant) , sizeof(ebmpDWORD) , 1 , fp); |
liangzhen | 0:84a8bcfbdec9 | 282 | |
liangzhen | 0:84a8bcfbdec9 | 283 | // write the palette |
liangzhen | 0:84a8bcfbdec9 | 284 | if( BitDepth == 1 || BitDepth == 4 ) |
liangzhen | 0:84a8bcfbdec9 | 285 | { |
liangzhen | 0:84a8bcfbdec9 | 286 | int NumberOfColors = IntPow(2,BitDepth); |
liangzhen | 0:84a8bcfbdec9 | 287 | |
liangzhen | 0:84a8bcfbdec9 | 288 | // if there is no palette, create one |
liangzhen | 0:84a8bcfbdec9 | 289 | if( !Colors ) |
liangzhen | 0:84a8bcfbdec9 | 290 | { |
liangzhen | 0:84a8bcfbdec9 | 291 | if( !Colors ) |
liangzhen | 0:84a8bcfbdec9 | 292 | { Colors = new RGBApixel [NumberOfColors]; } |
liangzhen | 0:84a8bcfbdec9 | 293 | CreateStandardColorTable(); |
liangzhen | 0:84a8bcfbdec9 | 294 | } |
liangzhen | 0:84a8bcfbdec9 | 295 | |
liangzhen | 0:84a8bcfbdec9 | 296 | int n; |
liangzhen | 0:84a8bcfbdec9 | 297 | for( n=0 ; n < NumberOfColors ; n++ ) |
liangzhen | 0:84a8bcfbdec9 | 298 | { fwrite( (char*) &(Colors[n]) , 4 , 1 , fp ); } |
liangzhen | 0:84a8bcfbdec9 | 299 | } |
liangzhen | 0:84a8bcfbdec9 | 300 | |
liangzhen | 0:84a8bcfbdec9 | 301 | // write the pixels |
liangzhen | 0:84a8bcfbdec9 | 302 | int j; |
liangzhen | 0:84a8bcfbdec9 | 303 | { |
liangzhen | 0:84a8bcfbdec9 | 304 | ebmpBYTE* Buffer; |
liangzhen | 0:84a8bcfbdec9 | 305 | int BufferSize = (int) ( (Width*BitDepth)/8.0 ); |
liangzhen | 0:84a8bcfbdec9 | 306 | while( 8*BufferSize < Width*BitDepth ) |
liangzhen | 0:84a8bcfbdec9 | 307 | { BufferSize++; } |
liangzhen | 0:84a8bcfbdec9 | 308 | while( BufferSize % 4 ) |
liangzhen | 0:84a8bcfbdec9 | 309 | { BufferSize++; } |
liangzhen | 0:84a8bcfbdec9 | 310 | |
liangzhen | 0:84a8bcfbdec9 | 311 | Buffer = new ebmpBYTE [BufferSize]; |
liangzhen | 0:84a8bcfbdec9 | 312 | for( j=0 ; j < BufferSize; j++ ) |
liangzhen | 0:84a8bcfbdec9 | 313 | { Buffer[j] = 0; } |
liangzhen | 0:84a8bcfbdec9 | 314 | |
liangzhen | 0:84a8bcfbdec9 | 315 | j=Height-1; |
liangzhen | 0:84a8bcfbdec9 | 316 | |
liangzhen | 0:84a8bcfbdec9 | 317 | while( j > -1 ) |
liangzhen | 0:84a8bcfbdec9 | 318 | { |
liangzhen | 0:84a8bcfbdec9 | 319 | bool Success = false; |
liangzhen | 0:84a8bcfbdec9 | 320 | if( BitDepth == 4 ) |
liangzhen | 0:84a8bcfbdec9 | 321 | { Success = Write4bitRow( Buffer, BufferSize, j ); } |
liangzhen | 0:84a8bcfbdec9 | 322 | if( Success ) |
liangzhen | 0:84a8bcfbdec9 | 323 | { |
liangzhen | 0:84a8bcfbdec9 | 324 | int BytesWritten = (int) fwrite( (char*) Buffer, 1, BufferSize, fp ); |
liangzhen | 0:84a8bcfbdec9 | 325 | if( BytesWritten != BufferSize ) |
liangzhen | 0:84a8bcfbdec9 | 326 | { Success = false; } |
liangzhen | 0:84a8bcfbdec9 | 327 | } |
liangzhen | 0:84a8bcfbdec9 | 328 | if( !Success ) |
liangzhen | 0:84a8bcfbdec9 | 329 | { |
liangzhen | 0:84a8bcfbdec9 | 330 | j = -1; |
liangzhen | 0:84a8bcfbdec9 | 331 | } |
liangzhen | 0:84a8bcfbdec9 | 332 | j--; |
liangzhen | 0:84a8bcfbdec9 | 333 | } |
liangzhen | 0:84a8bcfbdec9 | 334 | |
liangzhen | 0:84a8bcfbdec9 | 335 | delete [] Buffer; |
liangzhen | 0:84a8bcfbdec9 | 336 | } |
liangzhen | 0:84a8bcfbdec9 | 337 | |
liangzhen | 0:84a8bcfbdec9 | 338 | cout << "done " << endl; |
liangzhen | 0:84a8bcfbdec9 | 339 | fclose(fp); |
liangzhen | 0:84a8bcfbdec9 | 340 | return true; |
liangzhen | 0:84a8bcfbdec9 | 341 | } |
liangzhen | 0:84a8bcfbdec9 | 342 | |
liangzhen | 0:84a8bcfbdec9 | 343 | bool BMP::ReadFromFile( const char* FileName ) |
liangzhen | 0:84a8bcfbdec9 | 344 | { |
liangzhen | 0:84a8bcfbdec9 | 345 | using namespace std; |
liangzhen | 0:84a8bcfbdec9 | 346 | if( !EasyBMPcheckDataSize() ) |
liangzhen | 0:84a8bcfbdec9 | 347 | { |
liangzhen | 0:84a8bcfbdec9 | 348 | return false; |
liangzhen | 0:84a8bcfbdec9 | 349 | } |
liangzhen | 0:84a8bcfbdec9 | 350 | |
liangzhen | 0:84a8bcfbdec9 | 351 | FILE* fp = fopen( FileName, "rb" ); |
liangzhen | 0:84a8bcfbdec9 | 352 | if( fp == NULL ) |
liangzhen | 0:84a8bcfbdec9 | 353 | { |
liangzhen | 0:84a8bcfbdec9 | 354 | |
liangzhen | 0:84a8bcfbdec9 | 355 | SetBitDepth(1); |
liangzhen | 0:84a8bcfbdec9 | 356 | SetSize(1,1); |
liangzhen | 0:84a8bcfbdec9 | 357 | return false; |
liangzhen | 0:84a8bcfbdec9 | 358 | } |
liangzhen | 0:84a8bcfbdec9 | 359 | |
liangzhen | 0:84a8bcfbdec9 | 360 | // read the file header |
liangzhen | 0:84a8bcfbdec9 | 361 | |
liangzhen | 0:84a8bcfbdec9 | 362 | BMFH bmfh; |
liangzhen | 0:84a8bcfbdec9 | 363 | bool NotCorrupted = true; |
liangzhen | 0:84a8bcfbdec9 | 364 | |
liangzhen | 0:84a8bcfbdec9 | 365 | NotCorrupted &= SafeFread( (char*) &(bmfh.bfType) , sizeof(ebmpWORD), 1, fp); |
liangzhen | 0:84a8bcfbdec9 | 366 | |
liangzhen | 0:84a8bcfbdec9 | 367 | bool IsBitmap = false; |
liangzhen | 0:84a8bcfbdec9 | 368 | |
liangzhen | 0:84a8bcfbdec9 | 369 | if( bmfh.bfType == 19778 ) |
liangzhen | 0:84a8bcfbdec9 | 370 | { IsBitmap = true; } |
liangzhen | 0:84a8bcfbdec9 | 371 | |
liangzhen | 0:84a8bcfbdec9 | 372 | if( !IsBitmap ) |
liangzhen | 0:84a8bcfbdec9 | 373 | { |
liangzhen | 0:84a8bcfbdec9 | 374 | fclose( fp ); |
liangzhen | 0:84a8bcfbdec9 | 375 | return false; |
liangzhen | 0:84a8bcfbdec9 | 376 | } |
liangzhen | 0:84a8bcfbdec9 | 377 | |
liangzhen | 0:84a8bcfbdec9 | 378 | NotCorrupted &= SafeFread( (char*) &(bmfh.bfSize) , sizeof(ebmpDWORD) , 1, fp); |
liangzhen | 0:84a8bcfbdec9 | 379 | NotCorrupted &= SafeFread( (char*) &(bmfh.bfReserved1) , sizeof(ebmpWORD) , 1, fp); |
liangzhen | 0:84a8bcfbdec9 | 380 | NotCorrupted &= SafeFread( (char*) &(bmfh.bfReserved2) , sizeof(ebmpWORD) , 1, fp); |
liangzhen | 0:84a8bcfbdec9 | 381 | NotCorrupted &= SafeFread( (char*) &(bmfh.bfOffBits) , sizeof(ebmpDWORD) , 1 , fp); |
liangzhen | 0:84a8bcfbdec9 | 382 | |
liangzhen | 0:84a8bcfbdec9 | 383 | // read the info header |
liangzhen | 0:84a8bcfbdec9 | 384 | |
liangzhen | 0:84a8bcfbdec9 | 385 | BMIH bmih; |
liangzhen | 0:84a8bcfbdec9 | 386 | |
liangzhen | 0:84a8bcfbdec9 | 387 | NotCorrupted &= SafeFread( (char*) &(bmih.biSize) , sizeof(ebmpDWORD) , 1 , fp); |
liangzhen | 0:84a8bcfbdec9 | 388 | NotCorrupted &= SafeFread( (char*) &(bmih.biWidth) , sizeof(ebmpDWORD) , 1 , fp); |
liangzhen | 0:84a8bcfbdec9 | 389 | NotCorrupted &= SafeFread( (char*) &(bmih.biHeight) , sizeof(ebmpDWORD) , 1 , fp); |
liangzhen | 0:84a8bcfbdec9 | 390 | NotCorrupted &= SafeFread( (char*) &(bmih.biPlanes) , sizeof(ebmpWORD) , 1, fp); |
liangzhen | 0:84a8bcfbdec9 | 391 | NotCorrupted &= SafeFread( (char*) &(bmih.biBitCount) , sizeof(ebmpWORD) , 1, fp); |
liangzhen | 0:84a8bcfbdec9 | 392 | |
liangzhen | 0:84a8bcfbdec9 | 393 | NotCorrupted &= SafeFread( (char*) &(bmih.biCompression) , sizeof(ebmpDWORD) , 1 , fp); |
liangzhen | 0:84a8bcfbdec9 | 394 | NotCorrupted &= SafeFread( (char*) &(bmih.biSizeImage) , sizeof(ebmpDWORD) , 1 , fp); |
liangzhen | 0:84a8bcfbdec9 | 395 | NotCorrupted &= SafeFread( (char*) &(bmih.biXPelsPerMeter) , sizeof(ebmpDWORD) , 1 , fp); |
liangzhen | 0:84a8bcfbdec9 | 396 | NotCorrupted &= SafeFread( (char*) &(bmih.biYPelsPerMeter) , sizeof(ebmpDWORD) , 1 , fp); |
liangzhen | 0:84a8bcfbdec9 | 397 | NotCorrupted &= SafeFread( (char*) &(bmih.biClrUsed) , sizeof(ebmpDWORD) , 1 , fp); |
liangzhen | 0:84a8bcfbdec9 | 398 | NotCorrupted &= SafeFread( (char*) &(bmih.biClrImportant) , sizeof(ebmpDWORD) , 1 , fp); |
liangzhen | 0:84a8bcfbdec9 | 399 | |
liangzhen | 0:84a8bcfbdec9 | 400 | // a safety catch: if any of the header information didn't read properly, abort |
liangzhen | 0:84a8bcfbdec9 | 401 | // future idea: check to see if at least most is self-consistent |
liangzhen | 0:84a8bcfbdec9 | 402 | |
liangzhen | 0:84a8bcfbdec9 | 403 | if( !NotCorrupted ) |
liangzhen | 0:84a8bcfbdec9 | 404 | { |
liangzhen | 0:84a8bcfbdec9 | 405 | SetSize(1,1); |
liangzhen | 0:84a8bcfbdec9 | 406 | SetBitDepth(1); |
liangzhen | 0:84a8bcfbdec9 | 407 | fclose(fp); |
liangzhen | 0:84a8bcfbdec9 | 408 | return false; |
liangzhen | 0:84a8bcfbdec9 | 409 | } |
liangzhen | 0:84a8bcfbdec9 | 410 | |
liangzhen | 0:84a8bcfbdec9 | 411 | XPelsPerMeter = bmih.biXPelsPerMeter; |
liangzhen | 0:84a8bcfbdec9 | 412 | YPelsPerMeter = bmih.biYPelsPerMeter; |
liangzhen | 0:84a8bcfbdec9 | 413 | |
liangzhen | 0:84a8bcfbdec9 | 414 | // set the bit depth |
liangzhen | 0:84a8bcfbdec9 | 415 | |
liangzhen | 0:84a8bcfbdec9 | 416 | int TempBitDepth = (int) bmih.biBitCount; |
liangzhen | 0:84a8bcfbdec9 | 417 | if( TempBitDepth != 1 && TempBitDepth != 4 ) |
liangzhen | 0:84a8bcfbdec9 | 418 | { |
liangzhen | 0:84a8bcfbdec9 | 419 | SetSize(1,1); |
liangzhen | 0:84a8bcfbdec9 | 420 | SetBitDepth(1); |
liangzhen | 0:84a8bcfbdec9 | 421 | fclose(fp); |
liangzhen | 0:84a8bcfbdec9 | 422 | return false; |
liangzhen | 0:84a8bcfbdec9 | 423 | } |
liangzhen | 0:84a8bcfbdec9 | 424 | SetBitDepth( (int) bmih.biBitCount ); |
liangzhen | 0:84a8bcfbdec9 | 425 | |
liangzhen | 0:84a8bcfbdec9 | 426 | // set the size |
liangzhen | 0:84a8bcfbdec9 | 427 | |
liangzhen | 0:84a8bcfbdec9 | 428 | if( (int) bmih.biWidth <= 0 || (int) bmih.biHeight <= 0 ) |
liangzhen | 0:84a8bcfbdec9 | 429 | { |
liangzhen | 0:84a8bcfbdec9 | 430 | SetSize(1,1); |
liangzhen | 0:84a8bcfbdec9 | 431 | SetBitDepth(1); |
liangzhen | 0:84a8bcfbdec9 | 432 | fclose(fp); |
liangzhen | 0:84a8bcfbdec9 | 433 | return false; |
liangzhen | 0:84a8bcfbdec9 | 434 | } |
liangzhen | 0:84a8bcfbdec9 | 435 | SetSize( (int) bmih.biWidth , (int) bmih.biHeight ); |
liangzhen | 0:84a8bcfbdec9 | 436 | |
liangzhen | 0:84a8bcfbdec9 | 437 | // some preliminaries |
liangzhen | 0:84a8bcfbdec9 | 438 | |
liangzhen | 0:84a8bcfbdec9 | 439 | double dBytesPerPixel = ( (double) BitDepth ) / 8.0; |
liangzhen | 0:84a8bcfbdec9 | 440 | double dBytesPerRow = dBytesPerPixel * (Width+0.0); |
liangzhen | 0:84a8bcfbdec9 | 441 | dBytesPerRow = ceil(dBytesPerRow); |
liangzhen | 0:84a8bcfbdec9 | 442 | |
liangzhen | 0:84a8bcfbdec9 | 443 | int BytePaddingPerRow = 4 - ( (int) (dBytesPerRow) )% 4; |
liangzhen | 0:84a8bcfbdec9 | 444 | if( BytePaddingPerRow == 4 ) |
liangzhen | 0:84a8bcfbdec9 | 445 | { BytePaddingPerRow = 0; } |
liangzhen | 0:84a8bcfbdec9 | 446 | |
liangzhen | 0:84a8bcfbdec9 | 447 | // skip blank data if bfOffBits so indicates |
liangzhen | 0:84a8bcfbdec9 | 448 | |
liangzhen | 0:84a8bcfbdec9 | 449 | int BytesToSkip = bmfh.bfOffBits - 54;; |
liangzhen | 0:84a8bcfbdec9 | 450 | if( BitDepth == 16 && bmih.biCompression == 3 ) |
liangzhen | 0:84a8bcfbdec9 | 451 | { BytesToSkip -= 3*4; } |
liangzhen | 0:84a8bcfbdec9 | 452 | if( BytesToSkip < 0 ) |
liangzhen | 0:84a8bcfbdec9 | 453 | { BytesToSkip = 0; } |
liangzhen | 0:84a8bcfbdec9 | 454 | if( BytesToSkip > 0 && BitDepth != 16 ) |
liangzhen | 0:84a8bcfbdec9 | 455 | { |
liangzhen | 0:84a8bcfbdec9 | 456 | ebmpBYTE* TempSkipBYTE; |
liangzhen | 0:84a8bcfbdec9 | 457 | TempSkipBYTE = new ebmpBYTE [BytesToSkip]; |
liangzhen | 0:84a8bcfbdec9 | 458 | SafeFread( (char*) TempSkipBYTE , BytesToSkip , 1 , fp); |
liangzhen | 0:84a8bcfbdec9 | 459 | delete [] TempSkipBYTE; |
liangzhen | 0:84a8bcfbdec9 | 460 | } |
liangzhen | 0:84a8bcfbdec9 | 461 | |
liangzhen | 0:84a8bcfbdec9 | 462 | // This code reads 1, 4, 8, 24, and 32-bpp files |
liangzhen | 0:84a8bcfbdec9 | 463 | // with a more-efficient buffered technique. |
liangzhen | 0:84a8bcfbdec9 | 464 | |
liangzhen | 0:84a8bcfbdec9 | 465 | int j; |
liangzhen | 0:84a8bcfbdec9 | 466 | if( BitDepth != 16 ) |
liangzhen | 0:84a8bcfbdec9 | 467 | { |
liangzhen | 0:84a8bcfbdec9 | 468 | int BufferSize = (int) ( (Width*BitDepth) / 8.0 ); |
liangzhen | 0:84a8bcfbdec9 | 469 | while( 8*BufferSize < Width*BitDepth ) |
liangzhen | 0:84a8bcfbdec9 | 470 | { BufferSize++; } |
liangzhen | 0:84a8bcfbdec9 | 471 | while( BufferSize % 4 ) |
liangzhen | 0:84a8bcfbdec9 | 472 | { BufferSize++; } |
liangzhen | 0:84a8bcfbdec9 | 473 | ebmpBYTE* Buffer; |
liangzhen | 0:84a8bcfbdec9 | 474 | Buffer = new ebmpBYTE [BufferSize]; |
liangzhen | 0:84a8bcfbdec9 | 475 | j= Height-1; |
liangzhen | 0:84a8bcfbdec9 | 476 | while( j > -1 ) |
liangzhen | 0:84a8bcfbdec9 | 477 | { |
liangzhen | 0:84a8bcfbdec9 | 478 | int BytesRead = (int) fread( (char*) Buffer, 1, BufferSize, fp ); |
liangzhen | 0:84a8bcfbdec9 | 479 | if( BytesRead < BufferSize ) |
liangzhen | 0:84a8bcfbdec9 | 480 | { |
liangzhen | 0:84a8bcfbdec9 | 481 | j = -1; |
liangzhen | 0:84a8bcfbdec9 | 482 | } |
liangzhen | 0:84a8bcfbdec9 | 483 | else |
liangzhen | 0:84a8bcfbdec9 | 484 | { |
liangzhen | 0:84a8bcfbdec9 | 485 | bool Success = false; |
liangzhen | 0:84a8bcfbdec9 | 486 | if( BitDepth == 1 ) |
liangzhen | 0:84a8bcfbdec9 | 487 | { Success = Read1bitRow( Buffer, BufferSize, j ); } |
liangzhen | 0:84a8bcfbdec9 | 488 | if( !Success ) |
liangzhen | 0:84a8bcfbdec9 | 489 | { |
liangzhen | 0:84a8bcfbdec9 | 490 | j = -1; |
liangzhen | 0:84a8bcfbdec9 | 491 | } |
liangzhen | 0:84a8bcfbdec9 | 492 | } |
liangzhen | 0:84a8bcfbdec9 | 493 | j--; |
liangzhen | 0:84a8bcfbdec9 | 494 | } |
liangzhen | 0:84a8bcfbdec9 | 495 | delete [] Buffer; |
liangzhen | 0:84a8bcfbdec9 | 496 | } |
liangzhen | 0:84a8bcfbdec9 | 497 | fclose(fp); |
liangzhen | 0:84a8bcfbdec9 | 498 | return true; |
liangzhen | 0:84a8bcfbdec9 | 499 | } |
liangzhen | 0:84a8bcfbdec9 | 500 | |
liangzhen | 0:84a8bcfbdec9 | 501 | bool BMP::CreateStandardColorTable( void ) |
liangzhen | 0:84a8bcfbdec9 | 502 | { |
liangzhen | 0:84a8bcfbdec9 | 503 | using namespace std; |
liangzhen | 0:84a8bcfbdec9 | 504 | if( BitDepth != 1 && BitDepth != 4) |
liangzhen | 0:84a8bcfbdec9 | 505 | { |
liangzhen | 0:84a8bcfbdec9 | 506 | return false; |
liangzhen | 0:84a8bcfbdec9 | 507 | } |
liangzhen | 0:84a8bcfbdec9 | 508 | |
liangzhen | 0:84a8bcfbdec9 | 509 | if( BitDepth == 1 ) |
liangzhen | 0:84a8bcfbdec9 | 510 | { |
liangzhen | 0:84a8bcfbdec9 | 511 | int i; |
liangzhen | 0:84a8bcfbdec9 | 512 | for( i=0 ; i < 2 ; i++ ) |
liangzhen | 0:84a8bcfbdec9 | 513 | { |
liangzhen | 0:84a8bcfbdec9 | 514 | Colors[i].Red = i*255; |
liangzhen | 0:84a8bcfbdec9 | 515 | Colors[i].Green = i*255; |
liangzhen | 0:84a8bcfbdec9 | 516 | Colors[i].Blue = i*255; |
liangzhen | 0:84a8bcfbdec9 | 517 | Colors[i].Alpha = 0; |
liangzhen | 0:84a8bcfbdec9 | 518 | } |
liangzhen | 0:84a8bcfbdec9 | 519 | return true; |
liangzhen | 0:84a8bcfbdec9 | 520 | } |
liangzhen | 0:84a8bcfbdec9 | 521 | |
liangzhen | 0:84a8bcfbdec9 | 522 | for(int i=0; i<16; i++){ |
liangzhen | 0:84a8bcfbdec9 | 523 | Colors[i].Red = 0; |
liangzhen | 0:84a8bcfbdec9 | 524 | Colors[i].Blue = 0; |
liangzhen | 0:84a8bcfbdec9 | 525 | Colors[i].Green = 0; |
liangzhen | 0:84a8bcfbdec9 | 526 | Colors[i].Alpha = 0; |
liangzhen | 0:84a8bcfbdec9 | 527 | } |
liangzhen | 0:84a8bcfbdec9 | 528 | |
liangzhen | 0:84a8bcfbdec9 | 529 | Colors[1].Red = 255; |
liangzhen | 0:84a8bcfbdec9 | 530 | |
liangzhen | 0:84a8bcfbdec9 | 531 | Colors[15].Red = 255; |
liangzhen | 0:84a8bcfbdec9 | 532 | Colors[15].Blue = 255; |
liangzhen | 0:84a8bcfbdec9 | 533 | Colors[15].Green = 255; |
liangzhen | 0:84a8bcfbdec9 | 534 | |
liangzhen | 0:84a8bcfbdec9 | 535 | return true; |
liangzhen | 0:84a8bcfbdec9 | 536 | } |
liangzhen | 0:84a8bcfbdec9 | 537 | |
liangzhen | 0:84a8bcfbdec9 | 538 | bool SafeFread( char* buffer, int size, int number, FILE* fp ) |
liangzhen | 0:84a8bcfbdec9 | 539 | { |
liangzhen | 0:84a8bcfbdec9 | 540 | using namespace std; |
liangzhen | 0:84a8bcfbdec9 | 541 | int ItemsRead; |
liangzhen | 0:84a8bcfbdec9 | 542 | if( feof(fp) ) |
liangzhen | 0:84a8bcfbdec9 | 543 | { return false; } |
liangzhen | 0:84a8bcfbdec9 | 544 | ItemsRead = (int) fread( buffer , size , number , fp ); |
liangzhen | 0:84a8bcfbdec9 | 545 | if( ItemsRead < number ) |
liangzhen | 0:84a8bcfbdec9 | 546 | { return false; } |
liangzhen | 0:84a8bcfbdec9 | 547 | return true; |
liangzhen | 0:84a8bcfbdec9 | 548 | } |
liangzhen | 0:84a8bcfbdec9 | 549 | |
liangzhen | 0:84a8bcfbdec9 | 550 | #include<iostream> |
liangzhen | 0:84a8bcfbdec9 | 551 | bool BMP::Read1bitRow( ebmpBYTE* Buffer, int BufferSize, int Row ) |
liangzhen | 0:84a8bcfbdec9 | 552 | { |
liangzhen | 0:84a8bcfbdec9 | 553 | using namespace std; |
liangzhen | 0:84a8bcfbdec9 | 554 | if( Width > 8*BufferSize ) |
liangzhen | 0:84a8bcfbdec9 | 555 | { return false; } |
liangzhen | 0:84a8bcfbdec9 | 556 | |
liangzhen | 0:84a8bcfbdec9 | 557 | int i=0; |
liangzhen | 0:84a8bcfbdec9 | 558 | for(i=0; i < BufferSize; i++){ |
liangzhen | 0:84a8bcfbdec9 | 559 | PixelsBW[i/4][Row] |= Buffer[i] << (8 * (3 - i%4)); |
liangzhen | 0:84a8bcfbdec9 | 560 | } |
liangzhen | 0:84a8bcfbdec9 | 561 | return true; |
liangzhen | 0:84a8bcfbdec9 | 562 | } |
liangzhen | 0:84a8bcfbdec9 | 563 | |
liangzhen | 0:84a8bcfbdec9 | 564 | bool BMP::Write4bitRow( ebmpBYTE* Buffer, int BufferSize, int Row ) |
liangzhen | 0:84a8bcfbdec9 | 565 | { |
liangzhen | 0:84a8bcfbdec9 | 566 | int PositionWeights[2] = {16,1}; |
liangzhen | 0:84a8bcfbdec9 | 567 | |
liangzhen | 0:84a8bcfbdec9 | 568 | int i=0; |
liangzhen | 0:84a8bcfbdec9 | 569 | int j; |
liangzhen | 0:84a8bcfbdec9 | 570 | int k=0; |
liangzhen | 0:84a8bcfbdec9 | 571 | if( Width > 2*BufferSize ) |
liangzhen | 0:84a8bcfbdec9 | 572 | { return false; } |
liangzhen | 0:84a8bcfbdec9 | 573 | while( i < Width ) |
liangzhen | 0:84a8bcfbdec9 | 574 | { |
liangzhen | 0:84a8bcfbdec9 | 575 | j=0; |
liangzhen | 0:84a8bcfbdec9 | 576 | int Index = 0; |
liangzhen | 0:84a8bcfbdec9 | 577 | while( j < 2 && i < Width ) |
liangzhen | 0:84a8bcfbdec9 | 578 | { |
liangzhen | 0:84a8bcfbdec9 | 579 | int closest = 0; // black |
liangzhen | 0:84a8bcfbdec9 | 580 | if(PixelsBW[i / 32][Row] & ( 0x1 << (31 - i % 32))){ |
liangzhen | 0:84a8bcfbdec9 | 581 | closest = 15; // white |
liangzhen | 0:84a8bcfbdec9 | 582 | } |
liangzhen | 0:84a8bcfbdec9 | 583 | if(PixelsR[i / 32][Row] & ( 0x1 << (31 - i % 32))){ |
liangzhen | 0:84a8bcfbdec9 | 584 | closest = 1; // red |
liangzhen | 0:84a8bcfbdec9 | 585 | } |
liangzhen | 0:84a8bcfbdec9 | 586 | Index += ( PositionWeights[j]* closest ); |
liangzhen | 0:84a8bcfbdec9 | 587 | i++; j++; |
liangzhen | 0:84a8bcfbdec9 | 588 | } |
liangzhen | 0:84a8bcfbdec9 | 589 | Buffer[k] = (ebmpBYTE) Index; |
liangzhen | 0:84a8bcfbdec9 | 590 | k++; |
liangzhen | 0:84a8bcfbdec9 | 591 | } |
liangzhen | 0:84a8bcfbdec9 | 592 | return true; |
liangzhen | 0:84a8bcfbdec9 | 593 | } |
liangzhen | 0:84a8bcfbdec9 | 594 | |
liangzhen | 0:84a8bcfbdec9 | 595 | bool EasyBMPcheckDataSize( void ) |
liangzhen | 0:84a8bcfbdec9 | 596 | { |
liangzhen | 0:84a8bcfbdec9 | 597 | using namespace std; |
liangzhen | 0:84a8bcfbdec9 | 598 | bool ReturnValue = true; |
liangzhen | 0:84a8bcfbdec9 | 599 | if( sizeof( ebmpBYTE ) != 1 ) |
liangzhen | 0:84a8bcfbdec9 | 600 | { |
liangzhen | 0:84a8bcfbdec9 | 601 | ReturnValue = false; |
liangzhen | 0:84a8bcfbdec9 | 602 | } |
liangzhen | 0:84a8bcfbdec9 | 603 | if( sizeof( ebmpWORD ) != 2 ) |
liangzhen | 0:84a8bcfbdec9 | 604 | { |
liangzhen | 0:84a8bcfbdec9 | 605 | ReturnValue = false; |
liangzhen | 0:84a8bcfbdec9 | 606 | } |
liangzhen | 0:84a8bcfbdec9 | 607 | if( sizeof( ebmpDWORD ) != 4 ) |
liangzhen | 0:84a8bcfbdec9 | 608 | { |
liangzhen | 0:84a8bcfbdec9 | 609 | ReturnValue = false; |
liangzhen | 0:84a8bcfbdec9 | 610 | } |
liangzhen | 0:84a8bcfbdec9 | 611 | return ReturnValue; |
liangzhen | 0:84a8bcfbdec9 | 612 | } |