首页 > 代码库 > BMP Header Structure
BMP Header Structure
1 /* ***** BEGIN LICENSE BLOCK ***** 2 * 3 * $Id: bitmap.h,v 1.3 2004/06/30 16:44:52 asuraparaju Exp $ $Name: Dirac_1_0_2 $ 4 * 5 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 6 * 7 * The contents of this file are subject to the Mozilla Public License 8 * Version 1.1 (the "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * http://www.mozilla.org/MPL/ 11 * 12 * Software distributed under the License is distributed on an "AS IS" basis, 13 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for 14 * the specific language governing rights and limitations under the License. 15 * 16 * The Original Code is BBC Research and Development code. 17 * 18 * The Initial Developer of the Original Code is the British Broadcasting 19 * Corporation. 20 * Portions created by the Initial Developer are Copyright (C) 2004. 21 * All Rights Reserved. 22 * 23 * Contributor(s): 24 * 25 * Alternatively, the contents of this file may be used under the terms of 26 * the GNU General Public License Version 2 (the "GPL"), or the GNU Lesser 27 * Public License Version 2.1 (the "LGPL"), in which case the provisions of 28 * the GPL or the LGPL are applicable instead of those above. If you wish to 29 * allow use of your version of this file only under the terms of the either 30 * the GPL or LGPL and not to allow others to use your version of this file 31 * under the MPL, indicate your decision by deleting the provisions above 32 * and replace them with the notice and other provisions required by the GPL 33 * or LGPL. If you do not delete the provisions above, a recipient may use 34 * your version of this file under the terms of any one of the MPL, the GPL 35 * or the LGPL. 36 * ***** END LICENSE BLOCK ***** */ 37 38 /*********************************************************************** 39 File bitmap.h 40 41 Defines bitmap header class for uncompressed image IO. 42 Bitmap files are native to Windows on X86 and usually have a file 43 extension .BMP. 44 45 This class only supports uncompressed bitmaps using 46 24 bits per pixel.These are the common form of .BMP file. 47 48 I have tried to make the class platform independent - no guarantee. 49 50 At present the only useful parameters from the header seem to be the 51 width and height of the bitmap. 52 53 The bitmap format used (24bit uncompressed)is as follows: 54 55 BitMapFileHeader: 14 bytes 56 signature: 2 bytes Always ‘BM‘ 57 fileSize: 4 bytes File size in bytes 58 reserved: 2 bytes 59 reserved: 2 bytes 60 dataOffset: 4 bytes Offset of raster data from beginning of file 61 62 BitMapInfoHeader: 40 bytes 63 size: 4 bytes Size of InfoHeader = 40 64 width: 4 bytes Bitmap width (pixels) 65 height: 4 bytes Bitmap height (pixels) 66 planes: 2 bytes Number of planes = 1 67 bitCount: 2 bytes Bits per pixel = 24 68 compression: 4 bytes Type of compression = 0 (no compression) 69 imageSize: 4 bytes Bytes of raster image data (including pading) 70 = 0 (valid for uncompressed) 71 xPixelsPerM 4 bytes Horizontal pixels per metre (meaningless) = 0 72 yPixelsPerM 4 bytes Vertical pixels per metre (meaningless) = 0 73 coloursUsed 4 bytes Number of colours used = 0 74 coloursImportant 4 bytes Number of important colours = 0 75 76 BitMapLine: multiple of 4 bytes = height*4*((3*width + 3)/4) 77 width*BGRTriple 3*Width bytes 78 padding Up to 3 bytes 79 80 BGRTriple: 3 bytes 81 blue: 1 byte 82 green: 1 byte 83 red: 1 byte 84 85 Original author: Tim Borer 86 *********************************************************************/ 87 88 #ifndef dirac_utilities_bitmap 89 #define dirac_utilities_bitmap 90 91 #include <iosfwd> 92 93 namespace dirac_vu { //dirac video utilities namespace 94 95 class BitmapHeader { 96 public: 97 BitmapHeader() {} //used for reading bitmaps 98 BitmapHeader(int x, int y): w(x), h(y) {} 99 int width() const { 100 return w; } 101 void width(int x) { 102 w = x;} 103 int height() const { 104 return h; } 105 void height(int y) { 106 h = y; } 107 //Size of one picture line, in bytes, including padding 108 int lineBufferSize() const { 109 return 4*((3*w + 3)/4); } 110 friend std::ostream& operator<<(std::ostream& stream, 111 const BitmapHeader& header) { 112 return header.putTo(stream); } 113 friend std::istream& operator>>(std::istream& stream, 114 BitmapHeader& header) { 115 return header.getFrom(stream); } 116 private: 117 std::ostream& putTo(std::ostream& output) const; 118 std::istream& getFrom(std::istream& input); 119 int w; 120 int h; 121 }; 122 123 } // end namespace dirac_vu 124 125 #endif // dirac_utilities_bitmap
1 /* ***** BEGIN LICENSE BLOCK ***** 2 * 3 * $Id: bitmap.cpp,v 1.3 2004/06/30 16:44:52 asuraparaju Exp $ $Name: Dirac_1_0_2 $ 4 * 5 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 6 * 7 * The contents of this file are subject to the Mozilla Public License 8 * Version 1.1 (the "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * http://www.mozilla.org/MPL/ 11 * 12 * Software distributed under the License is distributed on an "AS IS" basis, 13 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for 14 * the specific language governing rights and limitations under the License. 15 * 16 * The Original Code is BBC Research and Development code. 17 * 18 * The Initial Developer of the Original Code is the British Broadcasting 19 * Corporation. 20 * Portions created by the Initial Developer are Copyright (C) 2004. 21 * All Rights Reserved. 22 * 23 * Contributor(s): 24 * Tim Borer (Original Author) 25 * 26 * Alternatively, the contents of this file may be used under the terms of 27 * the GNU General Public License Version 2 (the "GPL"), or the GNU Lesser 28 * Public License Version 2.1 (the "LGPL"), in which case the provisions of 29 * the GPL or the LGPL are applicable instead of those above. If you wish to 30 * allow use of your version of this file only under the terms of the either 31 * the GPL or LGPL and not to allow others to use your version of this file 32 * under the MPL, indicate your decision by deleting the provisions above 33 * and replace them with the notice and other provisions required by the GPL 34 * or LGPL. If you do not delete the provisions above, a recipient may use 35 * your version of this file under the terms of any one of the MPL, the GPL 36 * or the LGPL. 37 * ***** END LICENSE BLOCK ***** */ 38 39 #include <ostream> 40 #include <istream> 41 42 #include <iostream> 43 44 #include "bitmap.h" 45 46 namespace { 47 48 //Funtions to read and write a sequence of little endian bytes, 49 //stored in a byte array, 50 //to/from an integer in an endian independent way. 51 //Functions assume ints are at least 4 bytes. 52 53 int read2bytes(const char* bytes) { 54 int value=http://www.mamicode.com/0; 55 value |= (*(bytes+1))& 0xff; 56 value <<= 8; 57 value |= ( (*bytes)& 0xff ); 58 return value; } 59 60 int read4bytes(const char* bytes) { 61 int value=http://www.mamicode.com/0; 62 value |= (*(bytes+3))& 0xff; 63 value <<= 8; 64 value |= (*(bytes+2))& 0xff; 65 value <<= 8; 66 value |= (*(bytes+1))& 0xff; 67 value <<= 8; 68 value |= ( (*bytes)& 0xff ); 69 return value; } 70 71 void write2bytes(char* bytes, int value) { 72 (*bytes) = value & 0xff; 73 value >>= 8; 74 (*(bytes+1)) = value & 0xff; 75 value >>= 8; 76 } 77 78 void write4bytes(char* bytes, int value) { 79 (*bytes) = value & 0xff; 80 value >>= 8; 81 (*(bytes+1)) = value & 0xff; 82 value >>= 8; 83 (*(bytes+2)) = value & 0xff; 84 value >>= 8; 85 (*(bytes+3)) = value & 0xff; 86 value >>= 8; 87 } 88 89 } //end anonymous namespace 90 91 namespace dirac_vu { //dirac video utilities namespace 92 93 std::ostream& BitmapHeader::putTo(std::ostream& output) const { 94 //Define variables for bitmap parameters 95 const char signature[2] = { ‘B‘, ‘M‘ }; 96 const int dataOffset = 54; 97 const int fileSize = dataOffset + height()*lineBufferSize(); 98 const int reserved = 0; 99 const int size = 40; 100 const int planes = 1; 101 const int bitCount = 24; 102 const int compression = 0; 103 const int imageSize = 0; 104 const int xPixelsPerM = 0, yPixelsPerM = 0; 105 const int coloursUsed = 0 ; 106 const int coloursImportant = 0; 107 //Define buffer to read bytes into. 108 const int bufferSize = 54; 109 char buffer[bufferSize]; 110 //Write header parameters into buffer 111 *buffer = signature[0]; 112 *(buffer+1) = signature[1]; 113 write4bytes(buffer+2, fileSize); 114 write4bytes(buffer+6, reserved); 115 write4bytes(buffer+10, dataOffset); 116 write4bytes(buffer+14, size); 117 write4bytes(buffer+18, width()); 118 write4bytes(buffer+22, height()); 119 write2bytes(buffer+26, planes); 120 write2bytes(buffer+28, bitCount); 121 write4bytes(buffer+30, compression); 122 write4bytes(buffer+34, imageSize); 123 write4bytes(buffer+38, xPixelsPerM); 124 write4bytes(buffer+42, yPixelsPerM); 125 write4bytes(buffer+46, coloursUsed); 126 write4bytes(buffer+50, coloursImportant); 127 //Do pre & post processing by creating a sentry object 128 std::ostream::sentry s(output); 129 //Check all is well for output 130 if (!s) { 131 output.setstate(std::ios::failbit); 132 return output; } 133 //Use stream buffer directly for efficiency 134 std::streambuf& outbuf = *output.rdbuf(); 135 if (outbuf.sputn(buffer, bufferSize) < bufferSize) { 136 output.setstate(std::ios::eofbit); 137 output.setstate(std::ios::failbit); } 138 return output; } 139 140 std::istream& BitmapHeader::getFrom(std::istream& input) { 141 //Define variables for bitmap parameters 142 char signature[2]; 143 int fileSize; 144 int dataOffset; 145 int size; 146 int planes; 147 int bitCount; 148 int compression; 149 int imageSize; 150 int xPixelsPerM, yPixelsPerM; 151 int coloursUsed; 152 int coloursImportant; 153 //Define buffer to read bytes into. 154 const int bufferSize = 54; 155 char buffer[bufferSize]; 156 //Ensure pre & post processing by constructing a sentry object 157 //The "true" parameter means "don‘t ignore leading whitespace" 158 std::istream::sentry s(input, true); 159 //Check that all is well for input to start 160 if (!s) { 161 input.setstate(std::ios::failbit); 162 return input; } 163 //Use stream buffer directly to avoid the overhead of sentry 164 //objects created by the unformatted stream I/O functions 165 //First create a reference to the input stream buffer 166 std::streambuf& inbuf = *input.rdbuf(); 167 if (inbuf.sgetn(buffer, bufferSize) < bufferSize) { 168 input.setstate(std::ios_base::eofbit); 169 input.setstate(std::ios_base::failbit); } 170 signature[0]=*buffer; 171 signature[1]=*(buffer+1); 172 if ( (signature[0]!=‘B‘) || (signature[1]!=‘M‘) ) input.setstate(std::ios::failbit); 173 fileSize = read4bytes(buffer+2); 174 dataOffset= read4bytes(buffer+10); 175 //Reposition input buffer to skip over extra header data if necessary 176 //Should check success of operation (see The C++ Stand Lib, Josuttis, p665) 177 if (dataOffset>54) inbuf.pubseekoff(dataOffset-54, std::ios_base::cur, std::ios_base::in); 178 size = read4bytes(buffer+14); 179 w = read4bytes(buffer+18); 180 h = read4bytes(buffer+22); 181 if ( fileSize != (dataOffset + height()*lineBufferSize()) ) input.setstate(std::ios::failbit); 182 planes = read2bytes(buffer+26); 183 if ( planes != 1 ) input.setstate(std::ios::failbit); 184 bitCount = read2bytes(buffer+28); 185 if ( bitCount != 24 ) input.setstate(std::ios::failbit); 186 compression = read4bytes(buffer+30); 187 if ( compression != 0 ) input.setstate(std::ios::failbit); 188 imageSize = read4bytes(buffer+34); 189 xPixelsPerM = read4bytes(buffer+38); 190 yPixelsPerM = read4bytes(buffer+42); 191 coloursUsed = read4bytes(buffer+46); 192 coloursImportant = read4bytes(buffer+50); 193 return input; } 194 195 } // end namespace dirac_vu
BMP Header Structure
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。