c读取bmp文件
#ifndef _BMPLOAD_H_ #define _BMPLOAD_H_ #include <stdio.h> #include <stdlib.h> // 纹理图像结构 typedef struct { int imgWidth; // 纹理宽度 int imgHeight; // 纹理高度 unsigned int rgbType; // 每个象素对应的字节数,3:24位图,4:带alpha通道的24位图 unsigned char *data; // 纹理数据 } TEXTUREIMAGE; // BMP文件头 typedef struct { unsigned short bfType; // 文件类型 unsigned int bfSize; // 文件大小 unsigned short bfReserved1; // 保留位 unsigned short bfReserved2; // 保留位 unsigned int bfOffBits; // 数据偏移位置 } BMPFILEHEADER; // BMP信息头 typedef struct { unsigned int biSize; // 此结构大小 int biWidth; // 图像宽度 int biHeight; // 图像高度 unsigned short biPlanes; // 调色板数量 unsigned short biBitCount; // 每个象素对应的位数,24:24位图,32:带alpha通道的24位图 unsigned int biCompression; // 压缩 unsigned int biSizeImage; // 图像大小 int biXPelsPerMeter;// 横向分辨率 int biYPelsPerMeter;// 纵向分辨率 unsigned int biClrUsed; // 颜色使用数 unsigned int biClrImportant; // 重要颜色数 } BMPINFOHEADER; // 读取BMP文件创建纹理 int LoadBmp(char *filename, TEXTUREIMAGE *textureImg) { int i, j; FILE *file; BMPFILEHEADER bmpFile; BMPINFOHEADER bmpInfo; int pixel_size; // 初始化纹理数据 textureImg->imgWidth = 0; textureImg->imgHeight = 0; textureImg->rgbType = 0; // 打开文件 file = fopen(filename, "rb "); if (file == NULL) { perror("Open file error"); return -1; } // 获取文件头 fread(&bmpFile, sizeof(BMPFILEHEADER)-2, 1, file); fread(&bmpInfo, sizeof(BMPINFOHEADER), 1, file); // 验证文件类型 if (bmpFile.bfType != 0x4D42) { printf("File Type Error\n"); fclose(file); return -1; } if (bmpInfo.biCompression != 0) {printf("file compressed!\n");return -1;}if (bmpInfo.biBitCount != 24) {printf("only support 24 bit map\n");fclose(file);return -1;}// 获取图像色彩数 pixel_size = bmpInfo.biBitCount >> 3; // 读取文件数据 textureImg->data = (unsigned char*) malloc(bmpInfo.biWidth * bmpInfo.biHeight * pixel_size); if (textureImg->data == NULL) { fclose(file); return -1; } rewind(file); fseek(file, 54L, 0); for (i = 0; i < bmpInfo.biHeight; i++) { for (j = 0; j < bmpInfo.biWidth; j++) { // 红色分量 fread( textureImg->data + (i * bmpInfo.biWidth + j) * pixel_size + 2, sizeof(unsigned char), 1, file); // 绿色分量 fread( textureImg->data + (i * bmpInfo.biWidth + j) * pixel_size + 1, sizeof(unsigned char), 1, file); // 蓝色分量 fread(textureImg->data + (i * bmpInfo.biWidth + j) * pixel_size + 0, sizeof(unsigned char), 1, file); // Alpha分量 if (pixel_size == 4) { fread(textureImg-> data + (i * bmpInfo.biWidth + j) * pixel_size + 3, sizeof(unsigned char), 1, file); } } } // 记录图像相关参数 textureImg->imgWidth = bmpInfo.biWidth; textureImg->imgHeight = bmpInfo.biHeight; textureImg->rgbType = pixel_size; fclose(file); return 0; } #endifint main(int argc, char **argv) { TEXTUREIMAGE image; if (0 == LoadBmp( "test.bmp", &image)) { printf("加载图片成功\n"); free(image.data);} else { printf("加载图片失败\n"); } return 0; }
?
源自:http://hi.baidu.com/prince_hyai/item/d328959f62360bc7b72531d3?