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?
    




  • 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.asp

    evtl 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);
    			}
    

Anmelden zum Antworten