游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2330|回复: 4

请教:各位大哥来帮我看看下面几个问题,谢谢!

[复制链接]

37

主题

67

帖子

73

积分

注册会员

Rank: 2

积分
73
发表于 2006-11-2 13:56: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);
}


/////////////////////////////////////////////
//翻转BMP文件
/////////////////////////////////////////////
int FlipBMPFile(UCHAR *image, int bytes_per_line, int height)
{
        UCHAR *buffer;
        int index;

        // 分配空间
        if (!(buffer = (UCHAR *)malloc(bytes_per_line*height)))
        {
                MessageBox(NULL,TEXT("flip bmp File buffer error!"),
                        TEXT("Wrong!"),MB_OK);
                return(0);
        }

        //翻转
        memcpy(buffer,image,bytes_per_line*height);
        for (index=0; index < height; index++)
                memcpy(&image[((height-1) - index)*bytes_per_line],
                &buffer[index*bytes_per_line], bytes_per_line);

        free(buffer);
        return(1);

}


请教:

问题1:
为什么要翻转啊?

问题2:
翻转到底是什么意思?
翻转的是什么东西?

问题3:
if (!(buffer = (UCHAR *)malloc(bytes_per_line*height)))

这个有语句有什么功能,为什么要用呢?

问题4:
memcpy(buffer,image,bytes_per_line*height);
        for (index=0; index < height; index++)
                memcpy(&image[((height-1) - index)*bytes_per_line],
                &buffer[index*bytes_per_line], bytes_per_line);

这些语句怎么能实现翻转啊?


问题5:
((height-1) - index)*bytes_per_line
这个语句得到的是什么?

index*bytes_per_line
这个语句得到的是什么?


谢谢!

[em17] [em20] [em3] [em21]

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-11-2 14:49:00 | 显示全部楼层

Re:请教:各位大哥来帮我看看下面几个问题,谢谢!

紧跟在彩色表之后的是图像数据字节阵列。图像的每一扫描行由表示图像像素的连续的字节组成,每一行的字节数取决于图像的颜色数目和用像素表示的图像宽度。扫描行是由底向上存储的,这就是说,阵列中的第一个字节表示位图左下角的像素,而最后一个字节表示位图右上角的像素。

BMP文件格式分析
http://mti.xidian.edu.cn/multimedia/multi/course1-6-1.html

37

主题

67

帖子

73

积分

注册会员

Rank: 2

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

Re:请教:各位大哥来帮我看看下面几个问题,谢谢!

谢谢大哥!
if (!(buffer = (UCHAR *)malloc(bytes_per_line*height)))

这个有语句有什么功能,为什么要用呢?

8

主题

310

帖子

311

积分

中级会员

Rank: 3Rank: 3

积分
311
QQ
发表于 2006-11-2 15:08:00 | 显示全部楼层

Re:请教:各位大哥来帮我看看下面几个问题,谢谢!

分配空间

37

主题

67

帖子

73

积分

注册会员

Rank: 2

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

Re:请教:各位大哥来帮我看看下面几个问题,谢谢!

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

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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