游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1050|回复: 0

关于bmp文件读取问题

[复制链接]

6

主题

13

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2005-9-9 12:12:00 | 显示全部楼层 |阅读模式
我看的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);
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-27 18:37

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表