Bitmap
-
Ich habe mir eine eigene Bmp Klasse geschrieben. sie funzt auch prima, aber habe probleme die speicherfunktion zu schreiben.
Ich weiß nicht, wie ich die beiden header so ichtig auffüllen soll.#pragma pack(1) struct BMFH // Bitmap File Header { char bmtype_[2]; unsigned int fileSize_; short int reserved1_; short int reserved2_; unsigned int offsetBits_; }; // 18 Bytes #pragma pack() #pragma pack(1) struct BMIF // Bitmap Info Header { unsigned int sizeHeader_; unsigned int width_; unsigned int height_; short int planes_; short int bpp_; unsigned int compression_; unsigned int sizeImage_; unsigned int xPelsPerMeter_; unsigned int yPelsPerMeter_; unsigned int clrUsed_; unsigned int clrImportant_; }; // 40 Bytes #pragma pack() enum BitCompression { RGB = 0, RLE8, RLE4, BITFIELDS };BMFH bmfh; BMIF bmif; bmfh.bmtype_[0] = 'B'; bmfh.bmtype_[1] = 'M'; bmfh.fileSize_ = sizeof(BMFH) + sizeof(BMIF) + sizeof(image_->rgb_); // rgb ist das array mit den daten bmfh.reserved1_ = 0; // darf das 0 sein? bmfh.reserved2_ = 0; // darf das 0 sein? bmfh.offsetBits_ = 54; bmif.sizeHeader_ = sizeof(BMFH); bmif.width_ = image_->width_; bmif.height_ = image_->height_; bmif.planes_ = 1; bmif.bpp_ = image_->bpp_; bmif.compression_ = RGB; -- bmif.sizeImage_ = sizeof(image_->rgb_); bmif.xPelsPerMeter_ = 0;// darf das 0 sein? bmif.yPelsPerMeter_ = 0;// darf das 0 sein? bmif.clrUsed_ = 0;// darf das 0 sein? bmif.clrImportant_ = 0;// darf das 0 sein?
-
hilft dir der beitrag aus den faq?
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39400.htmllw
-
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_62uq.asp
msdn schrieb:
bfReserved1
Reserved; must be zero.
bfReserved2
Reserved; must be zero.zu bih: dürfte vermutlich für dich uninteressant für dich sein.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_62uq.aspevtl hilft dir die ein beispiel aus meiner bitmap klasse
static void Write( std::ostream &s, size_t nWidth, size_t nHeight, size_t nBpp, unsigned char *pData) { // bitmapfileheader struct { unsigned char B, M; unsigned long nSize; unsigned short nReserved1; unsigned short nReserved2; unsigned long nOffsetBits; } Bfh; // bitmapimageheader struct { unsigned long nSize; long nWidth; long nHeight; unsigned short nPlanes; unsigned short nBPP; unsigned long nCompression; unsigned long nImageSize; long nWidthPPM; long nHeightPPM; unsigned long nColorUsed; unsigned long nColorImportant; } Bih; Bfh.nSize = sizeof(Bfh); // grösse überprüfen Bfh.B = 'B'; Bfh.M = 'M'; Bfh.nReserved1 = 0; Bfh.nReserved2 = 0; Bfh.nOffsetBits = sizeof(Bfh) + sizeof(Bih); // grösse überprüfen Bih.nSize = sizeof(Bih); // grösse überprüfen Bih.nPlanes = 1; Bih.nBPP = static_cast<unsigned short>(nBpp); Bih.nCompression = 0; Bih.nImageSize = nWidth * nHeight * (nBpp >> 3); Bih.nWidthPPM = 0; Bih.nHeightPPM = 0; Bih.nColorUsed = 0; Bih.nColorImportant = 0; Bih.nWidth = nWidth; Bih.nHeight = nHeight; // um 'padding-bytes' zu vermeiden wird alles einzeln gespeichert s.write((char*)&Bfh.B, sizeof(unsigned char)); s.write((char*)&Bfh.M, sizeof(unsigned char)); s.write((char*)&Bfh.nSize, sizeof(unsigned long)); s.write((char*)&Bfh.nReserved1, sizeof(unsigned short)); s.write((char*)&Bfh.nReserved2, sizeof(unsigned short)); s.write((char*)&Bfh.nOffsetBits, sizeof(unsigned long)); s.write((char*)&Bih, sizeof(Bih)); s.write((char*)pData, Bih.nImageSize); }