热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

求教各位关于BMP图像处理的专业问题及解决方案

目前我有两张BMP图像文件a.bmp和b.bmp,希望将它们按照以下方式进行融合:首先提取a.bmp的所有奇数行像素(如第1、3、5行),接着获取b.bmp的所有偶数行像素(如第2、4、6行)。最终目标是将这些行像素交替排列,生成一张新的图像。此过程需要确保像素顺序正确,并保持图像的整体结构和质量。
现在有两幅bmp图象a.bmp,b.bmp,我现在想以如下方式把这两幅图象合并成一幅图象:
取图象a.bmp的奇数行象素(1,3,5...),再取b.bmp的偶数行象素(2,4,6...),
然后把这些象素合并成一幅图象,请问我该怎么实现,望大家不吝指教,多谢!
问题解决,立即结帐^_^

10 个解决方案

#1


关注

#2


你应该先把BMP文件的格式看明白。然后再做这个。如果BMP文件格式明白了,这个问题就是一个循环的问题。算出图象的高度的一半,在A中取i,在B中去2*i-1。读取行的时候必须将图象的宽度乘像素点的位数。比如,32位的得乘以4,16位的乘以2等。具体不明白的可以和我用MSN联系:yuhpvct@hotmail.com
ffish——胖胖鱼

#3


我用vb做过。vc没有试验过。看看有没有什么取各个相素点的RGB值得函数然后再在新的图形里进行绘画就可以了!还能做处理。我有vb的代码。

#4


谢谢上面两位关注,
跟胖胖鱼说:我看了一下bmp的格式,在不同的象素位下它的格式不一样如8和24,8的数据值是颜色表的索引,然而24的值就是(RGB),还有一些文件是经过压缩的(行程长度编码,rle),
那会给我们在处理不同色深的bmp文件带来许多问题,是否有vc或者vb中有这样的函数,不用管这些东西,只管合并就好了。还有你上面讲的,是否是指直接从a,b读字节,然后写文件。

跟病毒情书说:这位朋友,能否把你的代码贴出来,分享一下,VB的也好!多谢!

#5


理论上用GetPixel()是可以取得的,但那样太慢了,如果你想做好一点的话,只有分析DIB格式(即Bitmap),不仅仅是8Bit, 24Bit,还有16Bit, 32Bit等等,16Bit是555格式的,如果是写游戏,还要考虑显卡的565格式,DIB的16Bit是555格式的。

我不记得GetPixel()会不会帮你在各种颜色深度下自动帮你转换正确的RGB,VB下是很容易写的,我N年前就写过,不过那实在太慢了,GetPixel()太慢。

还要注意一点,Bitmap是从左下角开始扫描数据的,Y轴是倒过来的,不注意图像就倒立了,呵呵。研究一下Bitmap格式有好处,以后可以用来写DirectX(DirectDraw)

#6


至于rle压缩的,一般的程序考虑的很少,可以暂时不理,如果你写完善了再去处理不迟。

#7


是应该从简单到难的入手。8位的一般是黑白图象。上面有一个调色板的东西,我在书上看过代码,感觉是从0开始付值,格式是每次付4个字节,如4的付值为0010,0010,0010,0000(位数可能部不对)。我想不出来它到底有什么用处,所以在提取的时候可以直接读想素点信息。16位的基本上已经不使用了。它的主要格式是RGB的555或者565(真彩16色), 就是每个像素点为一个字节(16),RGB颜色如前分的。24位和32位的就简单多了。24位为每个像素点为一个字(8),但是主要问题是RGB或者BGR32位的是在24位的基础上多一个字(8)的空位。也是注意空的位置。另外BMP图象中含有图象的宽度和高度信息,高度信息可以不做处理,直接使用,但是宽度信息需要做处理,原因是这两个信息都是表示像素点个数的,而一个像素又是不同字节(字)的,因此需要乘以这个数,才能一次读取一行的像素。至于最终显示,我认为是合成之后的事情了。一种可能是使用GetPixel()函数,另一种就是重新合成BMP文件格式的内存段,对内存段进行图象的显示。函数为:SetStretchBltMode()和StretchDIBits()。一家之言,仅供参考。
ffish——胖胖鱼

#8


补充一点,8位不一定是黑白图像,很多都是彩色的,调色板是256色的,每个颜色索引是4个字节,其结构定义是:

typedef struct tagRGBQUAD {
  BYTE    rgbBlue; 
  BYTE    rgbGreen; 
  BYTE    rgbRed; 
  BYTE    rgbReserved; 
} RGBQUAD;

然后每个像素的值都是这个颜色的索引值,从索引里取得真正的颜色值。

#9


补充一点,8位不一定是黑白图像,很多都是彩色的,调色板是256色的,每个颜色索引是4个字节,其结构定义是:

typedef struct tagRGBQUAD {
  BYTE    rgbBlue; 
  BYTE    rgbGreen; 
  BYTE    rgbRed; 
  BYTE    rgbReserved; 
} RGBQUAD;

然后每个像素的值都是这个颜色的索引值,从索引里取得真正的颜色值。

#10


我现在有个问题,如果我要合并8位的位图,那么他们的调色板是否一样的,就是
typedef struct tagRGBQUAD {
  BYTE    rgbBlue; 
  BYTE    rgbGreen; 
  BYTE    rgbRed; 
  BYTE    rgbReserved; 
} RGBQUAD;数组中的数据是否一样的?如果不一样的话,那么仅仅合并位图的数据会导致颜色
的改变。

推荐阅读
author-avatar
呵呵哒
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有