LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 647|回复: 2

我的BMP文件分析小程序

[复制链接]
发表于 2004-6-7 00:23:34 | 显示全部楼层 |阅读模式
[PHP]
#include<stdio.h>
#include<wchar.h>
#include<fcntl.h>
int main(int argc,char *argv[])
{
        int fd;
        unsigned char char_a,char_b,char_c;
        unsigned int int_a;
        unsigned short short_a;

        int i;//循环用

        fd=open(argv[1],O_RDONLY);   //用argv标识出要分析的BMP文件的文件名
        if(fd==-1)
        {
                printf("Open BMP file fail!!!\n");
                exit(0);
        }
        read(fd,&char_a,sizeof(char));
        read(fd,&char_b,sizeof(char));
        printf("文件标识为:%c %c\n",char_a,char_b);

        read(fd,&int_a,sizeof(int));
        printf("文件大小为:%d\n",int_a);

        read(fd,&int_a,sizeof(int));
        printf("保留位为:%d\n",int_a);

        read(fd,&int_a,sizeof(int));
        printf("到位图数据的偏移量为:%d\n",int_a);
       
        read(fd,&int_a,sizeof(int));
        printf("信息头为:%d\n",int_a);

        read(fd,&int_a,sizeof(int));
        printf("位图宽度为:%d\n",int_a);

        read(fd,&int_a,sizeof(int));
        printf("位图高度为:%d\n",int_a);

        read(fd,&short_a,sizeof(short));
        printf("位图位面为:%d\n",short_a);

        read(fd,&short_a,sizeof(short));
        printf("位图色位为:%d\n",short_a);

        read(fd,&int_a,sizeof(int));
        printf("压缩说明标识为:%d\n",int_a);

        read(fd,&int_a,sizeof(int));
        printf("位图数据大小为:%d\n",int_a);

        read(fd,&int_a,sizeof(int));
        printf("位图水平分辨率为:%d\n",int_a);

        read(fd,&int_a,sizeof(int));
        printf("位图垂直分辨率为:%d\n",int_a);

        read(fd,&int_a,sizeof(int));
        printf("位图使用的颜色数目为:%d\n",int_a);

        read(fd,&int_a,sizeof(int));
        printf("位图中重要的颜色数目为:%d\n",int_a);

        for(i=0;i<300;i++)
        {
                read(fd,&char_a,sizeof(char));
                read(fd,&char_b,sizeof(char));
                read(fd,&char_c,sizeof(char));
                printf("位图中第%d个颜色的R为:%d G为%d B为%d",i,(unsigned int)char_a,(unsigned int)char_b,(unsigned int)char_c);
                printf("\n");
                //printf("位图中第%d个颜色的E为:%d\n",i,(unsigned int)char_a);
                //24位颜色没有填充符
        }

        close(fd);
        return 0;
}[/PHP]

注意:这个程序里读取RGB信息的部分好象有问题
还有BMP文件的图象信息区的第一个数值是从图象左下角开始的
发表于 2004-6-7 19:47:57 | 显示全部楼层
位图中的颜色是rgb,它是作为一个整体使用的,而x86是小尾端的,所以存储的实际顺序应该是bgr。
另外,你的程序没有考虑调色板。
发表于 2004-6-8 14:19:14 | 显示全部楼层
还有字节补齐的问题,BMP规定没行象素的字节数为4的倍数,不够的话会补零填充。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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