| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4016 人关注过本帖, 1 人收藏
标题:请教,关于基础的bmp图片解析
只看楼主 加入收藏
ergg
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2016-5-20
结帖率:80%
收藏(1)
已结贴  问题点数:20 回复次数:30 
请教,关于基础的bmp图片解析
老师布置的一个小作业,虽然老师说起来好像很随意,但是就是不会写。。。

目标:1. 输入一张准备好的bmp图片,能自动输出图片的大小。
            2. 输入坐标(x,y),能自动输出处点(x,y)的颜色信息。
搜索更多相关主题的帖子: 图片 信息 
2017-01-28 18:10
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:10 
了解一下bmp文件结构就可以直接从bmp文件获取相关数据。
2017-01-28 20:52
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:10 
    
Ø         bmp文件头(bmp file header):提供文件的格式、大小等信息Ø         位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息Ø         调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表Ø         位图数据(bitmap data):就是图像数据啦^_^见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示,这样的图像我们称为真彩色,这种情况下是不需要调色板的,也就是所位图信息头后面紧跟的就是位图数据了。因此,我们常常见到有这样一种说法:位图文件从文件头开始偏移54个字节就是位图数据了,这其实说的是24或32位图的情况。这也就解释了我们按照这种程序写出来的程序为什么对某些位图文件没用了。   这是一幅16位的位图文件,因此它是含有调色板的。   在拉出图像数据进行分析之前,我们首先进行几个约定:   1. 在BMP文件中,如果一个数据需要用几个字节来表示的话,那么该数据的存放字节顺序为“低地址存放低位数据,高地址存放高位数据”。如数据0x1756在内存中的存储顺序为:                                这存储方式称为小端方式(little endian) , 与之相反的是大端方式(big endian)。对两者的使用情况有兴趣的可以深究一下,其中还是有学问的。  :424dh = 'BM',表示这是Windows支持的位图格式。有很多声称开头两个字节必须为'BM'才是位图文件,从上表来看应为开头两个字节必须为'BM'才是Windows位图文件。3-5  :00010436h = 66614 B = 65.05 kB,通过查询文件属性发现一致。6-9  :这是两个保留段,为0。A-D:00000436h = 1078。即从文件头到位图数据需偏移1078字节。我们稍后将验证这个数据。共有14个字节。   28h = 40,这就是说我这个位图信息头的大小为40个字节。前面我们已经说过位图信息头一般有40个字节,既然是这样,为什么这里还要给一个字段来说明呢?这里涉及到一些历史,其实位图信息头原本有很多大小的版本的。我们看一下下表:  
    出于兼容性的考虑,大多数应用使用了旧版的位图信息头来保存文件。而 OS/2 已经过时了,因此现在最常用的格式就仅有V3 header了。因此,我们在前面说位图信息头的大小为40字节。12-15:00000100h = 256,图像宽为255像素,与文件属性一致。16-19:00000100h = 256,图像高为255像素,与文件属性一致。这是一个正数,说明图像数据是从图像左下角到右上角排列的。1A-1B:0001h, 该值总为1。1C-1D:0008h = 8, 表示每个像素占8个比特,即该图像共有256种颜色。1E-21:00000000h,BI_RGB,说明本图像不压缩。22-25:00000000h,图像的大小,因为使用BI_RGB,所以设置为0。26-29:00000000h,水平分辨率,缺省。2A-2D:00000000h,垂直分辨率,缺省。2E-31:00000100h = 256,说明本位图实际使用的颜色索引数为256,与1C-ID得到的结论一致。32-35:00000100h = 256,说明本位图重要的颜色索引数为256,与前面得到的结论一致。

我是硬件工程师
2017-01-28 21:27
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:0 
http://


我是硬件工程师
2017-01-28 21:29
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:0 
bmp文件开头地址偏移量0022h字节,之后4字节个就是文件大小。0a地址存放图像的开始地址,一般为36,就是从36字节后开始就是图像,如果是彩色图像,每四个字节就是一个图像的红蓝绿分量

我是硬件工程师
2017-01-28 21:54
ergg
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2016-5-20
收藏
得分:0 
回复 5楼 qdcs
你好,可以帮我写一下吗。。。实在是搞不懂。。。

我在网上找到这个,但是不知道为什么无法运行。。。我也看不出来。。。

谢谢了!!

#include <stdio.h>

int main(int argc, char *argv[]) {
   
    typedef struct tagPOINT{  
        BYTE b;  
        BYTE g;  
        BYTE r;  
    } POINT;
    POINT **pix;
 
    pix = (POINT **)malloc(sizeof(POINT*)*bi_in.biHeight);  
    for(i=0;i<bi_in.biHeight;i++)  
        *(pix+i)=(POINT*)malloc(sizeof(POINT)*bi_in.biWidth);
   
    for(i=0;i<bi_in.biHeight;i++)  
    for(j=0;j<bi_in.biWidth;j++)  
    fread(*(pix+i)+j,sizeof(POINT),1,fi);  
            
}
2017-01-31 21:34
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:0 
文件操作我还没学到那里,不过大略看了一下,这段代码没有打开文件,怎么运行呢?

我是硬件工程师
2017-02-01 13:22
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{  FILE *fp;
    int i;
    char ch,daxiao[6];
  

   if((fp=fopen("D:\\CC\\test.bmp","rb+"))==NULL)     // 打开磁盘文件 

    {
       printf("can't open file!\n");
       exit(0);
   }
   printf("文件大小是:");
   fread(&daxiao,1,6,fp);
   for (i=5;i>=0;i--)
   printf("%d",daxiao[i]);
   return 0;
}

//等大家来补充吧,这个的输出值有问题不知道问题在哪

我是硬件工程师
2017-02-01 15:14
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:0 
好了,正常了
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{  FILE *fp;
    int i,buf;
    char ch,daxiao[6];
  

   if((fp=fopen("D:\\CC\\test.bmp","rb+"))==NULL)     // 打开磁盘文件 

    {
       printf("can't open file!\n");
       exit(0);
   }
   printf("文件大小是:");
   fread(&daxiao,1,6,fp);                              ///把文件前六个字节放到数组里
    buf=daxiao[2]+daxiao[3]*256+daxiao[4]*256*256+daxiao[5]*256*256*256;//把内存中倒置的数放正
   printf("%d",buf);  //输出文件的大小buf
   return 0;
   fclose(fp);// 关闭文件
}


我是硬件工程师
2017-02-01 16:13
ergg
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2016-5-20
收藏
得分:0 
回复 9楼 qdcs
太谢谢了!!!!!

这个要怎么输入图片啊? 用vs直接运行也可以打开图片吗?

小白不懂得太多了,多多指教。。。
2017-02-01 22:30
快速回复:请教,关于基础的bmp图片解析
数据加载中...
 
   



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

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