读书人

怎么用c语言实现bmp图片的读写

发布时间: 2012-03-26 15:46:56 作者: rapoo

如何用c语言实现bmp图片的读写?
如何用c语言实现bmp图片的读写?
请高手指点,最好给源程序!!

[解决办法]
fopen( "a.bmp ",rb)
fread()
fclose();
[解决办法]
bmp文件格式分析及其编程
http://www.laogu.com/ds_851.htm
[解决办法]
以前正好写过一个,你试试:

#ifndef _BMPLOAD_H_
#define _BMPLOAD_H_
#include <iostream>
#include <stdio.h>
using namespace std;

/*-------------
类型定义
--------------*/

// 纹理图像结构
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 long bfSize; // 文件大小
unsigned short bfReserved1; // 保留位
unsigned short bfReserved2; // 保留位
unsigned long bfOffBits; // 数据偏移位置
} BMPFILEHEADER;

// BMP信息头
typedef struct {
unsigned long biSize; // 此结构大小
long biWidth; // 图像宽度
long biHeight; // 图像高度
unsigned short biPlanes; // 调色板数量
unsigned short biBitCount; // 每个象素对应的位数,24:24位图,32:带alpha通道的24位图
unsigned long biCompression; // 压缩
unsigned long biSizeImage; // 图像大小
long biXPelsPerMeter;// 横向分辨率
long biYPelsPerMeter;// 纵向分辨率
unsigned long biClrUsed; // 颜色使用数
unsigned long biClrImportant; // 重要颜色数
} BMPINFOHEADER;

// 读取BMP文件创建纹理
bool 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;
if (textureImg-> data != NULL) {
delete []textureImg-> data;
}

// 打开文件
file = fopen(filename, "rb ");
if (file == NULL) {
cout < < "Open File Error " < <endl;
return false;

}

// 获取文件头
rewind(file);
// 这里是因为C中对结构体的内存对齐,所以要减去2,否则得不到正确的结果
fread(&bmpFile, sizeof(BMPFILEHEADER)-2, 1, file);
//因为C语言对结构按四位对齐,所以不能直接用sizeof(BMPFILEHEADER)
fread(&bmpInfo, sizeof(BMPINFOHEADER), 1, file);

// 验证文件类型
if (bmpFile.bfType != 0x4D42) {
cout < < "File Type Error " < <endl;
fclose(file);
return false;
}

// 获取图像色彩数
pixel_size = bmpInfo.biBitCount > > 3;

// 读取文件数据
textureImg-> data = new unsigned char[bmpInfo.biWidth * bmpInfo.biHeight * pixel_size];
if (textureImg-> data == NULL) {
fclose(file);
return false;
}
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 false;
}

#endif

[解决办法]
你再调试一下,改些地方试试,我的opengl程序一直就是用这个来读取bmp图片的,呵呵,已经用过N多次了,没遇到过任何问题。这是一个最简单的小程序,如果这个程序没问题,可能是出现在你程序其他的地方:
#include <iostream>
#include "BMPLoad.h "

int void main() {
TEXTUREIMAGE image;
if (LoadBmp( "test.bmp ", &image) {
cout < < "加载图片成功 " < < endl;
} else {
cout < < "加载图片失败 " < < endl;
}

return 0;
}
[解决办法]
--》Inhibitory():
没有考虑width要是4的整数倍呀,
[解决办法]
他是想得到图象的数据
而不是 图像宽度 图像高度 调色板数量 横向分辨率 纵向分辨率 颜色使用数
这是结构里的数据
应该使用映射的方法将图片映射到内存
这样得到的才是图象数据

读书人网 >C语言

热点推荐