bmp图像常被称为位图,这实际是对位图的误解,具体可见opengl superbible中对图像的说明。
代码如下:
#include <stdio.h> #include <stdlib.h> #include <GL/glew.h> #ifdef _APPLE_ #include <glut/glut.h> #else #define FREEGLUT_STATIC #include <GL/glut.h> #endif GLuint loadBMP_custom(const char * imagepath); // Data read from the header of the BMP file unsigned char header[54]; // Each BMP file begins by a 54-bytes header unsigned int dataPos; // Position in the file where the actual data begins unsigned int width, height; unsigned int imageSize; // = width*height*3 // Actual RGB data unsigned char * data; int main(int argc, char **argv) { FILE * file = fopen("1.bmp", "rb"); if (!file) { printf("Image could not be openedn"); return 0; } if ( fread(header, 1, 54, file)!=54 ) { // If not 54 bytes read :problem printf("Not a correct BMP filen"); return 0; } if ( header[0]!=‘B‘ || header[1]!=‘M‘ ) { printf("Not a correct BMP filen"); return 0; } // Read ints from the byte array dataPos = *(int*)&(header[0x0A]); imageSize = *(int*)&(header[0x22]); width = *(int*)&(header[0x12]); height = *(int*)&(header[0x16]); printf("%d \t %d \t %d \t %d \n", dataPos, imageSize, width, height); printf("%d \t %d \t %d \t %d \n", &(header[0x0A]),&(header[0x22]),&(header[0x12]), &(header[0x16])); printf("%d \t %d \t %d \t %d \n", &(header[0x0A]),&(header[0x22]),(int *)&(header[0x12]), &(header[0x16])); printf("%d\t %d\t",*(int*)&(header[0x12]), *(char*)&(header[0x16])); getchar(); return 0; }
使用的图像:
测试结果如下: