注册 登录
编程论坛 C图形专区

挑战图像数据处理

hotcls 发布于 2007-08-06 15:09, 2371 次点击
请看附件,把后缀名改为res
一个文件以16进制读取,统计其中每个word的个数。
如56 78 56 e6 78 56
其中56 78 1个
56 e6 1个
78 56 1个
其中78 56就不要算成2个.
我做这个程序的目的是:
有一个res文件里存储了许多bmp文件的位图数据,不包括位图信息,也就是那54个字节。当然,按顺序储存。
我就是要利用图片像素与周围像素的过渡性,找出res文件里各个bmp文件的分割点,还有各个bmp文件的高和宽。
参考http://www.newsmth.net/bbstcon.php?board=Graphics&gid=47754
只有本站会员才能查看附件,请 登录

15 回复
#2
一笔苍穹2007-08-06 16:18
也就是在一个只有数据而没头信息的BMP集合中把每幅BMP提取出来是吧,我很好奇什么工具会把BMP导出成这种格式。
利用BMP图片各自本身的相似度倒是这办法,但肯定不准确,比如一幅老外的三色国旗图片,可能会因此被当成三幅图片提取出来。
如果里面的图片宽度都不相同,至少是两张之间的宽度都不相同,我觉得可以利用BMP的4倍对齐这一特点,也就是BMP宽必须为4的倍数,否则补成4的倍数,应该能得到图形的边界,这样提取到每一行,一直提取到补齐数发生改变时,就应该到了下一幅位图的数据区了。这个只是一个想法,能不能行我还没仔细想,它的局限性就是当两幅连接在一起的BMP是一样宽时,会将其辩认为一幅。
#3
hotcls2007-08-06 19:52
把后缀名改为exe.
呵呵,开眼界了吧,就有这样的工具。
4倍对齐,不一定吧。
只有本站会员才能查看附件,请 登录

#4
一笔苍穹2007-08-07 08:48
如果我没看错的话,貌似这个工具是将BMP转成资源文件的啊,它有反转换功能吗?
#5
hotcls2007-08-07 09:01
我要做的工作就是把资源文件反转过来啊。
#6
一笔苍穹2007-08-07 10:14

哦,我以为你发的是反转过来的程序。

#7
一笔苍穹2007-08-07 11:19
我试过了,当图片原来的宽度不是4的倍数时,可以利用对齐来取得图片的原宽和原高,结果还是很精确的。但图片宽度是4的倍数时,就不能这么处理,可能就涉及到特征识别了。因此可以将这个方案综合考虑进去,这样能提高整体的提取正确率。
#8
hotcls2007-08-07 15:34
当图片原来的宽度不是4的倍数时,可以利用对齐来取得图片的原宽和原高 搞不懂。
能把你的程序给我看看吗?
#9
一笔苍穹2007-08-07 16:58
如果你要处理的数据文件仅仅是去掉了54字节头信息的情况,以4倍对齐特性找边界才有效。
4位对齐原则是这样的,当BMP的宽度不为4的倍数时,以0补齐直到成为4的倍数,譬如图片色深为16位,宽为219像素,每一行像素的最后会补上一个字节使整行宽为220像素,这样就是4的倍数了,此时这些被补上去的0可以视为图片的“边界”。我的想法是如果图片本身内容不为全黑(即所有字节都为0),就可以扫描一遍数据区,扫描它里面每个0值之间的间隔,拿刚才的219为例(我实验过的图片之一),得到的所有间隔值里219占了绝大多数(因为图片中间会有点像素为黑即0,否则就全是219),你可以统计间隔里出现次数最多的非0间隔(我统计得到的是219),这就是图片原来的宽度,有了宽度为基础,高度(行数)也可以算出来,理想状态下也就是图片中没有一个黑点即0值,图片的高就等于所有的219个数加1,如果有也不要紧,可以将小于219的值累加直到宽度219,视为一行,这样一来,最后的宽和高都确定下来了,图片也就可以恢复头信息了。
这个方法有它的局限性:
图片的原宽度不能为4的倍数,否则不会以0补齐,也就没有“边界”了;
图片的色深应该是已知的,否则还要推算图片的色深,不过这应该可以做到;
图片不能全为黑色,否则“边界”和有效像素无法区分开来。
此思路只能视为一个补充方案,具体的实现也不一定就是我说的那个样子,具体对你那个问题能否有用也不好说,只是单独拿出来做的话是的确可以实现的。
另,由于代码是在上班时偷闲写的,很乱,就不献丑了。
#10
RockCarry2007-08-07 20:03
讨论这个问题似乎没有多大意义
要完整的描述一个二维图像,图像的宽高是必不可少的,至少都需要知道宽度。
这样的问题在设计时就犯了严重的错误,因此没有继续讨论和实现的必要。
#11
hotcls2007-08-08 11:12
不敢苟同,
#12
RockCarry2007-08-08 15:52
如果是打算设计自己的资源文件格式,加入图像的宽高信息是必不可少的,而且最多也就占用8个字节,却可以带来程序处理上的极大的方便。因此我说,你所遇到的问题,是由于在最初的设计上犯了严重错误。看了一些人的讨论,居然说要用到人工智能,模式识别等等技术,感觉真是不妥。
如果资源文件中,没有图像的宽高信息,我相信,许多问题,从理论上讲都是无解的,不管你采用何种技术,都是如此。更加没有必要去讨论如何实现的问题了。即便是有办法做出来,我相信复杂度也很高。如果搂住毫不吝惜的在资源文件格式中加入8个字节的图像宽高信息,我相信一切问题已经不是问题。
图像方面的东西,我研究的还算比较深入,这个问题上,我还是有一点自信的。希望楼主仔细思考一下我的建议。
#13
hotcls2007-08-08 16:45

我忘了说明一个问题,资源文件里一个像素只占2个字节,我要还原的bmp文件一个像素占3个字节。
在把许多bmp文件转为res文件时,像素转换的规律为:
10101011 10101111 10100011 取第一个字节的前5位(10101),第二个字节的前6位(101011),第三个字节的前5位(10100),得到2个字节10101101011101000。
还有一点,我相当于是想破解别人的res文件,得到里面的漂亮图片。
别人为了不让你轻易得到,当然不会给高宽了。
我就是要用黑客手段得到别人的图片。

最后一点,非常感谢RockCarry朋友的讨论。

#14
hotcls2007-08-09 15:13
to 一笔苍穹,
你讲的图片宽度4倍对齐,看了之后懵懵懂懂。现在终于明白,我觉得你说的不是很清楚,应该是图片宽度(像素数)*每像素占的位数的4倍对齐。
欢迎指正!


#15
一笔苍穹2007-08-09 15:23

呵呵,对的。

#16
hotcls2007-08-09 16:35
相信是你的疏忽,
以后还有很多东西要讨教你,希望你不吝赐教。
1