游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2971|回复: 2

请教_lseek(file_handle,-(int)(bitmap->bitmapinfoheader.biSizeImage

[复制链接]

37

主题

67

帖子

73

积分

注册会员

Rank: 2

积分
73
发表于 2006-11-2 11:47:00 | 显示全部楼层 |阅读模式
/////////////////////////////////////////////
//读取BMP文件
/////////////////////////////////////////////
int LoadBMPFile(BMP_FILE bitmap, char *filename)
{
        int file_handle;  //文件句柄
        UCHAR   *temp_buffer = NULL;
        OFSTRUCT file_data;         

        //打开文件
        if ((file_handle = OpenFile(filename,&file_data,OF_READ))==-1)
        {
                MessageBox(NULL,TEXT("Open bmp File error!"),
                        TEXT("Wrong!"),MB_OK);
                return(0);
        }

        //读取文件头
        _lread(file_handle, &bitmap->bitmapfileheader,sizeof(BITMAPFILEHEADER));

        //是否BMP图形格式
        if (bitmap->bitmapfileheader.bfType!=BITMAP_ID)
        {
                //关闭文件
                _lclose(file_handle);
                   MessageBox(NULL,TEXT("bmp File ID error!"),
                        TEXT("Wrong!"),MB_OK);
                return(0);
        }
       
        //读取文件头
        _lread(file_handle, &bitmap->bitmapinfoheader,sizeof(BITMAPINFOHEADER));

        //读数据
        _lseek(file_handle,-(int)(bitmap->bitmapinfoheader.biSizeImage),SEEK_END);

        //将24位转为16位
        if (bitmap->bitmapinfoheader.biBitCount==16 || bitmap->bitmapinfoheader.biBitCount==24)
        {
                //删除已有信息
                if (bitmap->buffer)
                        free(bitmap->buffer);

                //分配空间
                if (!(bitmap->buffer = (UCHAR *)malloc(bitmap->bitmapinfoheader.biSizeImage)))
                {
                        //关闭文件
                        _lclose(file_handle);                       
                        MessageBox(NULL,TEXT("bmp File buffer error!"),
                                TEXT("Wrong!"),MB_OK);
                        return(0);
                }

                //读取
                _lread(file_handle,bitmap->buffer,bitmap->bitmapinfoheader.biSizeImage);
        }
        else
        {
                //出错
                MessageBox(NULL,TEXT("bmp File read error!"),
                        TEXT("Wrong!"),MB_OK);
                return(0);       
        }

        //关闭文件
        _lclose(file_handle);

        //翻转图形
        FlipBMPFile(bitmap->buffer,
                bitmap->bitmapinfoheader.biWidth*(bitmap->bitmapinfoheader.biBitCount/8),
                bitmap->bitmapinfoheader.biHeight);

        return(1);
}


请教:
各位大哥:
_lseek(file_handle,-(int)(bitmap->bitmapinfoheader.biSizeImage),SEEK_END);
是什么意思啊?
再这里有什么用?


_lread(file_handle,bitmap->buffer,bitmap->bitmapinfoheader.biSizeImage);
这句话呢?又有什么用?

谢谢!
[em17] [em20]

2

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
发表于 2006-11-2 12:05:00 | 显示全部楼层

Re:请教_lseek(file_handle,-(int)(bitmap->bitmapinfoheader.biSizeImage)

前一句是定位的,从文件末尾将读取的位置倒置bitmap->bitmapinfoheader.biSizeImage个字节。这个大小是定义在bmp头文件里面的,是除去文件头之后的bmp图像数据的大小。

后一个就是将图像数据读入buffer里面。

37

主题

67

帖子

73

积分

注册会员

Rank: 2

积分
73
 楼主| 发表于 2006-11-2 13:39:00 | 显示全部楼层

Re:请教_lseek(file_handle,-(int)(bitmap->bitmapinfoheader.biSizeImage)

谢谢 大哥!
大哥牛牛!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 18:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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