作者:呵呵哒 | 来源:互联网 | 2024-11-10 02:13
目前我有两张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 个解决方案
你应该先把BMP文件的格式看明白。然后再做这个。如果BMP文件格式明白了,这个问题就是一个循环的问题。算出图象的高度的一半,在A中取i,在B中去2*i-1。读取行的时候必须将图象的宽度乘像素点的位数。比如,32位的得乘以4,16位的乘以2等。具体不明白的可以和我用MSN联系:yuhpvct@hotmail.com
ffish——胖胖鱼
我用vb做过。vc没有试验过。看看有没有什么取各个相素点的RGB值得函数然后再在新的图形里进行绘画就可以了!还能做处理。我有vb的代码。
谢谢上面两位关注,
跟胖胖鱼说:我看了一下bmp的格式,在不同的象素位下它的格式不一样如8和24,8的数据值是颜色表的索引,然而24的值就是(RGB),还有一些文件是经过压缩的(行程长度编码,rle),
那会给我们在处理不同色深的bmp文件带来许多问题,是否有vc或者vb中有这样的函数,不用管这些东西,只管合并就好了。还有你上面讲的,是否是指直接从a,b读字节,然后写文件。
跟病毒情书说:这位朋友,能否把你的代码贴出来,分享一下,VB的也好!多谢!
理论上用GetPixel()是可以取得的,但那样太慢了,如果你想做好一点的话,只有分析DIB格式(即Bitmap),不仅仅是8Bit, 24Bit,还有16Bit, 32Bit等等,16Bit是555格式的,如果是写游戏,还要考虑显卡的565格式,DIB的16Bit是555格式的。
我不记得GetPixel()会不会帮你在各种颜色深度下自动帮你转换正确的RGB,VB下是很容易写的,我N年前就写过,不过那实在太慢了,GetPixel()太慢。
还要注意一点,Bitmap是从左下角开始扫描数据的,Y轴是倒过来的,不注意图像就倒立了,呵呵。研究一下Bitmap格式有好处,以后可以用来写DirectX(DirectDraw)
至于rle压缩的,一般的程序考虑的很少,可以暂时不理,如果你写完善了再去处理不迟。
是应该从简单到难的入手。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位不一定是黑白图像,很多都是彩色的,调色板是256色的,每个颜色索引是4个字节,其结构定义是:
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
然后每个像素的值都是这个颜色的索引值,从索引里取得真正的颜色值。
补充一点,8位不一定是黑白图像,很多都是彩色的,调色板是256色的,每个颜色索引是4个字节,其结构定义是:
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
然后每个像素的值都是这个颜色的索引值,从索引里取得真正的颜色值。
我现在有个问题,如果我要合并8位的位图,那么他们的调色板是否一样的,就是
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;数组中的数据是否一样的?如果不一样的话,那么仅仅合并位图的数据会导致颜色
的改变。