|
|
我看的windows游戏编程大师技巧
他的读取文件的程序是这样的。直接把bmp文件的数据拷贝到内存中,但是有的时候会出现扭曲的图片。
我不知道这样的算法要怎么样改进才不会出现扭曲的图片
windows游戏编程大师技巧的代码如下:
typedef struct BITMAP_FILE_TAG
{
BITMAPFILEHEADER bitmapfileheader; // bmp文件的头
BITMAPINFOHEADER bitmapinfoheader; // 位图信息头
PALETTEENTRY palette[256]; // 要储存的调色板的大小
UCHAR *buffer;
} BITMAPFILE,*BITMAP_FILE_PTR;
int FileHandle;
OFSTRUCT FileData;
BITMAPFILE BitMapFile;
//打开一个bmp文件
FileHandle = OpenFile("00.bmp",&FileData,OF_READ);
if (-1==FileHandle)
{
MessageBox(NULL,TEXT("打开bmp文件了"),TEXT("Wrong!"),MB_OK);
return(0);
}
//读取文件头到FileHandle
_lread(FileHandle, &BitMapFile.bitmapfileheader,sizeof(BITMAPFILEHEADER));
//检测bmp文件头的BITMAPFILEHEADER中的bfType必须为0x4D42才为bmp文件
if (BitMapFile.bitmapfileheader.bfType!=0x4D42)
{
//关闭这个文件
_lclose(FileHandle);
MessageBox(NULL,TEXT("不是bmp文件哦"),TEXT("Wrong!"),MB_OK);
return(0);
}
//读取位图信息头到FileHandle
_lread(FileHandle, &BitMapFile.bitmapinfoheader,sizeof(BITMAPINFOHEADER));
//如果是8位色
if (BitMapFile.bitmapinfoheader.biBitCount == 8)
{
int colormax =256; //定义颜色最大值
//读取位图的调色板到FileHandle
_lread(FileHandle, &BitMapFile.palette,colormax*sizeof(PALETTEENTRY));
for (int index=0; index < colormax; index++)
{
// 交换红色和绿色的位置
int temp_color = BitMapFile.palette[index].peRed;
BitMapFile.palette[index].peRed = BitMapFile.palette[index].peBlue;
BitMapFile.palette[index].peBlue = temp_color;
//表示该调色板入口为普通、非动态的调色板入口
BitMapFile.palette[index].peFlags = PC_NOCOLLAPSE;
}
//移动文件指针(biSizeImage位图大小)
_lseek(FileHandle,-(int)(BitMapFile.bitmapinfoheader.biSizeImage),SEEK_END);}
//如果是8位色
if (BitMapFile.bitmapinfoheader.biBitCount==8 )
{
//如果为空那么栓出这个资源
if (BitMapFile.buffer)
free(BitMapFile.buffer);
//创建一个指向文件大小的内存空间的指针buffer
if (!(BitMapFile.buffer = (UCHAR *)malloc(BitMapFile.bitmapinfoheader.biSizeImage)))
{
//关闭这个文件
_lclose(FileHandle);
MessageBox(NULL,TEXT("创建存储空间出错了"),TEXT("Wrong!"),MB_OK);
return(0);
}
//读取文件到这个指针空间
_lread(FileHandle,BitMapFile.buffer,BitMapFile.bitmapinfoheader.biSizeImage);
应该怎么样改动这个函数?
_lread(FileHandle,BitMapFile.buffer,BitMapFile.bitmapinfoheader.biSizeImage); |
|