| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 673 人关注过本帖
标题:c语言bmp文件读取的问题
只看楼主 加入收藏
乖宝宝宝宝乖
Rank: 2
等 级:论坛游民
帖 子:7
专家分:21
注 册:2013-10-20
收藏
 问题点数:0 回复次数:4 
c语言bmp文件读取的问题
很纠结的一个问题 下面的程序 我分别对两个图片(都是24位的灰度图)操作 有一个成功了 一个失败了一直找不到原因一个是400*400 一个是320*213 帮忙看看 分析一下哈谢谢啦
新建 360压缩 ZIP 文件.zip (227.9 KB)

程序代码:
#include <stdio.h> 
#include <stdlib.h>
#include<Windows.h>
struct color{
    unsigned char red;
    unsigned char green;
    unsigned char blue;
}color;
void main(){
    BITMAPFILEHEADER file;
    BITMAPINFOHEADER info;
    FILE *p,*p1;
    int i,j;
    long x,y;
    struct color temp[450][450];
        p=fopen("MM.bmp","rb");
    p1=fopen("CHMM.bmp","wb");
    fread(&file,sizeof(BITMAPFILEHEADER),1,p);//头文件的读取与存储
    fread(&info,sizeof(BITMAPINFOHEADER),1,p);
    fwrite(&file,sizeof(BITMAPFILEHEADER),1,p1);
    fwrite(&info,sizeof(BITMAPINFOHEADER),1,p1);
    y=info.biHeight;//读取文件高度
    x=info.biWidth;//读取文件宽度
    printf("%d %d\n",x,y);
    if(file.bfType!=0x4d42){//检验是否为bmp文件
        printf("不是bmp图片\n");
        return;
    }
    for(i=1;i<=x;i++){//用for循环读取像素(这个bmp为24位,所以没有颜色表)
        for(j=1;j<=y;j++){
            fread(&color,sizeof(struct color),1,p);
            temp[i][j].blue=color.blue;
            temp[i][j].green=color.green;
            temp[i][j].red=color.red;
        }
    }
    for(i=1;i<=x;i++){//读取之后再存入文件
        for(j=1;j<=y;j++){
            fwrite(&temp[i][j],sizeof(struct color),1,p1);
        }
    }
    fclose(p1);
    fclose(p);
    getchar();

}
搜索更多相关主题的帖子: c语言 color 图片 
2013-10-29 13:35
乖宝宝宝宝乖
Rank: 2
等 级:论坛游民
帖 子:7
专家分:21
注 册:2013-10-20
收藏
得分:0 
不用告诉我用其他的程序或其他方法实现这个功能哈 我就是想知道我这个错在哪了 为什么会是一个可以成功 一个失败了 (400*400)成功了(320*213)那个失败了(输出之后打开显示文件损坏)
2013-10-29 13:40
C_printf
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:122
注 册:2010-1-26
收藏
得分:0 
你认真看过BITMAPINFOHEADER?
从哪里开始读取像素值,是有个字段来决定的。
2013-10-29 15:47
C_printf
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:122
注 册:2010-1-26
收藏
得分:0 
printf("%d %d\n",x,y);
    if(file.bfType!=0x4d42){//检验是否为bmp文件
        printf("不是bmp图片\n");
        return;
    }
     fseek(p,info.biSize-sizeof(BITMAPINFOHEADER),SEEK_CUR);
    for(i=1;i<=x;i++){//用for循环读取像素(这个bmp为24位,所以没有颜色表)
        for(j=1;j<=y;j++){
            fread(&color,sizeof(struct color),1,p);
            temp[i][j].blue=color.blue;
            temp[i][j].green=color.green;
            temp[i][j].red=color.red;
        }
    }
    fwrite(temp,1,info.biSize-sizeof(BITMAPINFOHEADER),p1);
    for(i=1;i<=x;i++){//读取之后再存入文件
        for(j=1;j<=y;j++){
            fwrite(&temp[i][j],sizeof(struct color),1,p1);
        }
      
    }
2013-10-29 15:49
乖宝宝宝宝乖
Rank: 2
等 级:论坛游民
帖 子:7
专家分:21
注 册:2013-10-20
收藏
得分:0 
回复 4楼 C_printf
不好意思 我仔细看了一下 原来是bfOffBits这个表示信息偏移量 多谢了 果然还是得认真些
不过还有个小疑问 就是为什么同样是24位 这个bfOffBits还会不一样 在BITMAPFILEHEADER BITMAPINFOHEADER直接存储位图信息不就行了么 不是没有颜色表了么?
2013-10-29 21:57
快速回复:c语言bmp文件读取的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020182 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved