| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 783 人关注过本帖
标题:编程能力强的看过来,具有挑战性的程序!
只看楼主 加入收藏
zdffhm
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2006-11-18
收藏
 问题点数:0 回复次数:8 
编程能力强的看过来,具有挑战性的程序!
我有一些.bmp的图形,图形是一条封闭的曲线,我在PictureBox控件里画了一个正方形的坐标区域,并且在横坐标上以一个小步长x画竖线,在这个区域里显示.bmp图形,那么曲线和这些竖线就有交点(x,y),如何得到这些交点(x,y)的值呢?(也就是把一条连续的曲线离散化)。请高手帮帮我吧,很棘手的问题,在此谢了,感激不尽!!!
搜索更多相关主题的帖子: 挑战性 曲线 图形 能力 
2006-11-18 11:01
purana
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:广东-广州
等 级:版主
威 望:66
帖 子:6039
专家分:0
注 册:2005-6-17
收藏
得分:0 
不懂..

我的msn: myfend@
2006-11-18 12:11
qspidan
Rank: 1
等 级:新手上路
帖 子:125
专家分:0
注 册:2006-10-22
收藏
得分:0 

你把曲线方程和直线方程的求解过程编成程序不就行了吗?


2006-11-18 13:24
zdffhm
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2006-11-18
收藏
得分:0 

方程不知道,只知道曲线,曲线是现场测得的,没有函数式,画竖线就是以一定的采样步长取曲线上的点,请各位帮帮忙,提供一下方法和思路,如果有源程序更好,感激不尽!!谢谢!!!!

2006-11-18 15:27
flamsky
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-11-17
收藏
得分:0 

摆渡得
1. 黑白BMP文件图的像素大多是从62字节(从0数起)开始。具体从哪一字节开始, 决定于文件中第10字节(从0数起)开始处4字节的整形数是多少. 因为文件头后面不是紧接着像素值.

2. 黑白BMP图的一个像素用一个bit表示。一般0表示背景(缺省为白色),1表示前景色(缺省为黑色)。即一个字节代表相邻的8个像素。

3. 320*240的黑白BMP图,每行320个像素用40个字节表示,240行,应占40*240=9600字节。加上前头62字节,文件大小应为9662字节。

4. BMP图像素的存储顺序是自底向上。所以文件最后40个字节表示的是第一行的像素值。

5. 行宽如不是8的倍数,也扩展到8的倍数。如行宽321, 则每行像素需用41个字节存储。你的行宽320,恰好是8的倍数,没有这个问题。

一、BMP文件结构

1. BMP文件组成

BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。文件头主要包含文件的大小、文件类型、图像数据偏离文件头的长度等信息;位图信息头包含图象的尺寸信息、图像用几个比特数值来表示一个像素、图像是否压缩、图像所用的颜色数等信息。颜色信息包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为真彩色,既图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操作调色板。文件中的数据块表示图像的相应的像素值,需要注意的是:图像的像素值在文件中的存放顺序为从左到右,从下到上,也就是说,在BMP文件中首先存放的是图像的最后一行像素,最后才存储图像的第一行像素,但对与同一行的像素,则是按照先左边后右边的的顺序存储的;另外一个需要读者朋友关注的细节是:文件存储图像的每一行像素值时,如果存储该行像素值所占的字节数为4的倍数,则正常存储,否则,需要在后端补0,凑足4的倍数。

2. BMP文件头

BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。其结构定义如下:

typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 位图文件的类型,必须为"BM"
DWORD bfSize; // 位图文件的大小,以字节为单位
WORD bfReserved1; // 位图文件保留字,必须为0
WORD bfReserved2; // 位图文件保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER;该结构占据14个字节。

3. 位图信息头

BMP位图信息头数据用于说明位图的尺寸等信息。其结构如下:

typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 本结构所占用字节数
LONG biWidth; // 位图的宽度,以像素为单位
LONG biHeight; // 位图的高度,以像素为单位
WORD biPlanes; // 目标设备的平面数不清,必须为1
WORD biBitCount// 每个像素所需的位数,必须是1(双色), 4(16色),8(256色)或24(真彩色)之一
DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORD biSizeImage; // 位图的大小,以字节为单位
LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数
LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数
DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
DWORD biClrImportant;// 位图显示过程中重要的颜色数
} BITMAPINFOHEADER;该结构占据40个字节。

注意:对于BMP文件格式,在处理单色图像和真彩色图像的时候,无论图象数据多么庞大,都不对图象数据进行任何压缩处理,一般情况下,如果位图采用压缩格式,那么16色图像采用RLE4压缩算法,256色图像采用RLE8压缩算法。

4. 颜色表

颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:

typedef struct tagRGBQUAD {
BYTErgbBlue;// 蓝色的亮度(值范围为0-255)
BYTErgbGreen; // 绿色的亮度(值范围为0-255)
BYTErgbRed; // 红色的亮度(值范围为0-255)
BYTErgbReserved;// 保留,必须为0
} RGBQUAD;

颜色表中RGBQUAD结构数据的个数由BITMAPINFOHEADER 中的biBitCount项来确定,当biBitCount=1,4,8时,分别有2,16,256个颜色表项,当biBitCount=24时,图像为真彩色,图像中每个像素的颜色用三个字节表示,分别对应R、G、B值,图像文件没有颜色表项。位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:

typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; // 位图信息头
RGBQUAD bmiColors[1]; // 颜色表
} BITMAPINFO;

注意:RGBQUAD数据结构中,增加了一个保留字段rgbReserved,它不代表任何颜色,必须取固定的值为"0",同时, RGBQUAD结构中定义的颜色值中,红色、绿色和蓝色的排列顺序与一般真彩色图像文件的颜色数据排列顺序恰好相反,既:若某个位图中的一个像素点的颜色的描述为"00,00,ff,00",则表示该点为红色,而不是蓝色。

5. 位图数据

位图数据记录了位图的每一个像素值或该对应像素的颜色表的索引值,图像记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。这种格式我们又称为Bottom_Up位图,当然与之相对的还有Up_Down形式的位图,它的记录顺序是从上到下的,对于这种形式的位图,也不存在压缩形式。位图的一个像素值所占的字节数:当biBitCount=1时,8个像素占1个字节;当biBitCount=4时,2个像素占1个字节;当 biBitCount=8时,1个像素占1个字节;当biBitCount=24时,1个像素占3个字节,此时图像为真彩色图像。当图像不是为真彩色时,图像文件中包含颜色表,位图的数据表示对应像素点在颜色表中相应的索引值,当为真彩色时,每一个像素用三个字节表示图像相应像素点彩色值,每个字节分别对应R、G、B分量的值,这时候图像文件中没有颜色表。上面我已经讲过了,Windows规定图像文件中一个扫描行所占的字节数必须是4的倍数(即以字为单位),不足的以0填充,图像文件中一个扫描行所占的字节数计算方法:

DataSizePerLine= (biWidth* biBitCount+31)/8;// 一个扫描行所占的字节数

位图数据的大小按下式计算(不压缩情况下):

DataSize= DataSizePerLine* biHeight。

上述是BMP文件格式的说明,搞清楚了以上的结构,就可以正确的操作图像文件,对它进行读或写操作了。

以上是我摆渡到的
也就是说你只要用二进制方法打开这个bmp文件,从像素部分开始读取,对每一个读入的像素进行值的判断(假设是黑线),查到相应的有用点像素位置,然后还必须设计一套算法,去取其中的具体坐标值(因为图形中的线宽往往不是只一个像素,工程应用的话我想往往是取线宽的中点像素作为值点)。然后就能够声称你要的数值表了。具体我也没有做过,但我想程序的框架应该是这样的。
另外,我觉得应该有已经做好的程序代码,你可以查找一下。

2006-11-19 19:07
zdffhm
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2006-11-18
收藏
得分:0 

谢谢啊!

2006-11-19 19:12
purana
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:广东-广州
等 级:版主
威 望:66
帖 子:6039
专家分:0
注 册:2005-6-17
收藏
得分:0 
........

我的msn: myfend@
2006-11-19 19:16
flamsky
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-11-17
收藏
得分:0 
2006-11-19 19:21
zdffhm
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2006-11-18
收藏
得分:0 
谢谢
2006-11-19 19:29
快速回复:编程能力强的看过来,具有挑战性的程序!
数据加载中...
 
   



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

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