游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3506|回复: 7

BMP图像倒转的问题

[复制链接]

11

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2005-5-4 22:26:00 | 显示全部楼层 |阅读模式
BMP文件的biHeight为负值则表示图像为uper-left开始,为正则是lower-left开始,所以偶作了个很简单的倒转BMP文件的程序,结果出问题咧

#include <windows.h>
#include <stdio.h>
bool TransBmp(char* SrcName,char* DestName)
{
        //打开文件
        FILE *fileSrc;
        FILE *fileDest;
        if(NULL==(fileSrc=fopen(SrcName,"r")))
                return false;
        //读文件头
        BITMAPFILEHEADER fileHeader;
        fread(&fileHeader,sizeof(fileHeader),1,fileSrc);
        if(fileHeader.bfType!=0x4d42)
                return false;
        //读信息头
        BITMAPINFOHEADER infoHeader;
        fread(&infoHeader,sizeof(infoHeader),1,fileSrc);
        //16色,256色时 读调色板
        RGBQUAD* quad=NULL;
        int N_COLOR;
        if(infoHeader.biBitCount==4||infoHeader.biBitCount==8)
        {
                N_COLOR = 1<<infoHeader.biBitCount;
                quad = new RGBQUAD[N_COLOR];
                fseek(fileSrc,fileHeader.bfOffBits-sizeof(RGBQUAD)*N_COLOR,0);
                fread(quad,sizeof(RGBQUAD),N_COLOR,fileSrc);
       
        }
        else
                N_COLOR=0;
        //读数据信息
        fseek(fileSrc,fileHeader.bfOffBits,0);

        unsigned char* buffer=new unsigned char[fileHeader.bfSize-fileHeader.bfOffBits];

        fread(buffer,sizeof(unsigned char),
                (fileHeader.bfSize-fileHeader.bfOffBits)
                ,fileSrc);

        //关闭源文件
        fclose(fileSrc);
        //24位色 转换数据
        infoHeader.biHeight= -infoHeader.biHeight;
        fileDest=fopen(DestName,"w");
        fwrite(&fileHeader,sizeof(BITMAPFILEHEADER),1,fileDest);
        fwrite(&infoHeader,sizeof(BITMAPINFOHEADER),1,fileDest);
        if(N_COLOR>0)
        {
                fwrite(quad,sizeof(RGBQUAD),N_COLOR,fileDest);
        }
        fseek(fileDest,fileHeader.bfOffBits,0);
        fwrite(buffer,sizeof(unsigned char),
                //infoHeader.biSizeImage
                (fileHeader.bfSize-fileHeader.bfOffBits)
                ,fileDest);
        fclose(fileDest);
        if(buffer) delete []buffer;
        if(quad) delete []quad;
}

void main()
{
        TransBmp("1.bmp","2.bmp");
}

11

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
 楼主| 发表于 2005-5-4 22:28:00 | 显示全部楼层

Re: BMP图像倒转的问题

1。bmp源位图
sf_20055422289.bmp

11

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
 楼主| 发表于 2005-5-4 22:28:00 | 显示全部楼层

Re: BMP图像倒转的问题

2。bmp倒转后位图
sf_200554222838.bmp

11

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
 楼主| 发表于 2005-5-4 22:30:00 | 显示全部楼层

Re:BMP图像倒转的问题

瓦考,IE都放不了,认为是错误的,ACDSEE可以,大家下下来看一下,很壮观

248

主题

2674

帖子

2702

积分

金牌会员

Rank: 6Rank: 6

积分
2702
QQ
发表于 2005-5-5 06:12:00 | 显示全部楼层

Re:BMP图像倒转的问题

好像出现了对齐错误,画面有一条条的彩带线。

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2005-5-5 10:20:00 | 显示全部楼层

Re:BMP图像倒转的问题

IE放不了,那你肯定把文件头弄错了!

11

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
 楼主| 发表于 2005-5-5 21:36:00 | 显示全部楼层

Re:BMP图像倒转的问题

偶来公布偶在其他论坛得到的正确答案
偶用DEBUG把文件1.bmp 2.bmp打开后,发现凡源文件0x0a数据在保存后都变成了0x0d 0a
好端端的多出了个0D所以文件对齐发生了错误
因为fwrite("","w")默认的是文本方式,0x0d 0a正好是一个回车符号
改为fwrite("","wb")则是二进制方式存储,则问题OK

每次有些问题我都喜欢到GameRes上发贴请教(在发贴之前我都已经尽力自己解决问题,实在不行才会上网求教)但GameRes上的高手似乎都不屑于帮助新人,或者说没有高手,每次偶的小问题在其他论坛上可以得到很多高手的响应,一般都能得到满意的答复,但在GameRes却总是石沉大海

但偶还是喜欢逛逛GameRes,因为这里有一群想要作游戏的人,

偶知道这个问题知道后很简单,但偶还是把答案帖出来了,虽然高手们可能不屑一顾,但我相信,有很多和我一样的菜菜是非常想知道答案的

11

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
 楼主| 发表于 2005-5-5 21:40:00 | 显示全部楼层

Re:BMP图像倒转的问题

感谢楼上两位,虽然答的不够详细
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-25 13:44

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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