Пример #1
0
    Image* loadBMP( std::string filename) {
        ifstream input;
        input.open(filename.c_str(), ifstream::binary);
        assert(!input.fail() || !"Could not find file");
        char buffer[2];
        input.read(buffer, 2);
        assert((buffer[0] == 'B' && buffer[1] == 'M') || !"Not a bitmap file");
        input.ignore(8);
        int dataOffset = readInt(input);
        
        //Read the header
        int headerSize = readInt(input);
        int width;
        int height;
        switch(headerSize) {
            case 40:
                //V3
                width = readInt(input);
                height = readInt(input);
                input.ignore(2);
                assert(readShort(input) == 24 || !"Image is not 24 bits per pixel");
                assert(readShort(input) == 0 || !"Image is compressed");
                break;
            case 12:
                //OS/2 V1
                width = readShort(input);
                height = readShort(input);
                input.ignore(2);
                assert(readShort(input) == 24 || !"Image is not 24 bits per pixel");
                break;
            case 64:
                //OS/2 V2
                assert(!"Can't load OS/2 V2 bitmaps");
                break;
            case 108:
                //Windows V4
                assert(!"Can't load Windows V4 bitmaps");
                break;
            case 124:
                //Windows V5
                assert(!"Can't load Windows V5 bitmaps");
                break;
            default:
                assert(!"Unknown bitmap format");
        }
        
        //Read the data
        int bytesPerRow = ((width * 3 + 3) / 4) * 4 - (width * 3 % 4);
        int size = bytesPerRow * height;
        auto_array<char> pixels(new char[size]);
        input.seekg(dataOffset, ios_base::beg);
        input.read(pixels.get(), size);

        //Get the data into the right format
        auto_array<char> pixels2(new char[width * height * 3]);
        for(int y = 0; y < height; y++) {
            for(int x = 0; x < width; x++) {
                for(int c = 0; c < 3; c++) {
                    pixels2[3 * (width * y + x) + c] =
                        pixels[bytesPerRow * y + 3 * x + (2 - c)];
                }
            }
        }
        
        input.close();
        return new Image(pixels2.release(), width, height);
    }
Пример #2
0
	bool Image2D::LoadBMP(char* filename)
	{
		std::ifstream input;
		input.open(filename, std::ifstream::binary);
		assert(!input.fail() || !"Could not find file");
		char buffer[2];
		input.read(buffer, 2);
		assert(buffer[0] == 'B' && buffer[1] == 'M' || !"Not a bitmap file");
		input.ignore(8);
		int dataOffset = readInt(input);
		
		//Read the header
		int headerSize = readInt(input);
		switch(headerSize) 
		{
			case 40:
				//V3
				this->width = readInt(input);
				this->height = readInt(input);
				input.ignore(2);
				assert(readShort(input) == 24 || !"Image is not 24 bits per pixel");
				assert(readShort(input) == 0 || !"Image is compressed");
				break;
			case 12:
				//OS/2 V1
				this->width = readShort(input);
				this->height = readShort(input);
				input.ignore(2);
				assert(readShort(input) == 24 || !"Image is not 24 bits per pixel");
				break;
			case 64:
				//OS/2 V2
				assert(!"Can't load OS/2 V2 bitmaps");
				break;
			case 108:
				//Windows V4
				assert(!"Can't load Windows V4 bitmaps");
				break;
			case 124:
				//Windows V5
				assert(!"Can't load Windows V5 bitmaps");
				break;
			default:
				assert(!"Unknown bitmap format");
		}
		
		//Read the data
		int bytesPerRow = ((this->width * 3 + 3) / 4) * 4 - (this->width * 3 % 4);
		int size = bytesPerRow * this->height;
		cgl::auto_array<char> pixels(new char[size]);
		input.seekg(dataOffset, std::ios_base::beg);
		input.read(pixels.Get(), size);
		
		//Get the data into the right format
		cgl::auto_array<char> pixels2(new char[this->width * this->height * 3]);
		for(int y = 0; y < this->height; y++) 
		{
			for(int x = 0; x < this->width; x++) 
			{
				for(int c = 0; c < 3; c++) 
				{
					pixels2[3 * (this->width * y + x) + c] = pixels[bytesPerRow * y + 3 * x + (2 - c)];
				}
			}
		}	
		input.close();
		this->dataBMP = pixels2.Release();
		glGenTextures(1, &this->ID); //Make room for our texture
		glBindTexture(GL_TEXTURE_2D, this->ID); //Tell OpenGL which texture to edit
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D,                //Always GL_TEXTURE_2D
					 0,                            //0 for now
					 GL_RGB,                       //Format OpenGL uses for image
					 this->width, this->height,  //Width and height
					 0,                            //The border of the image
					 GL_RGB, //GL_RGB, because pixels are stored in RGB format
					 GL_UNSIGNED_BYTE, //GL_UNSIGNED_BYTE, because pixels are stored
									   //as unsigned numbers
					 this->dataBMP);               //The actual pixel data*/

		return true;
	}