怎样将位图的每一个点颜色信息一下子读到一个数组中(100分)

  • 主题发起人 主题发起人 xFairy
  • 开始时间 开始时间
X

xFairy

Unregistered / Unconfirmed
GUEST, unregistred user!
将位图的每一个点颜色信息一下子读到一个数组中
好像用 GetBitmapBits,但我不知怎么用,数组又用
什么数据类型???
除了用GetBitmapBits还有更好的方法吗???
望高手指教!!!
 
只知道用 Canvas.Pixels或TBitmap.ScanLine,
“一下子”是指多快?
 
其实ScanLine速度挺快,搞个循环做一下,应该可以,但要注意颜色的长度
 
“一下子”在256色的位图上也就是0.X秒
 
try api
GetPixel
 
用scanline
 
或许是我的功力浅不会提问,其实是:
在做不规则窗体时如果使用 Bitmap.Canvas.Pixels[x,y] 循环扫描
实在很慢,我想先把图像的颜色信息一下子迅速扫描到数组中,然后
再做循环对比,GetBitmapBits就可以把图像信息一瞬间加入数组中,
但我不会用这个函数,GetBitmapBits第三参数设置的指针是什么?
GetDiBits好像也可以,我也不会用。
 
建议用Scanline,GetBitmapBits是位了兼容16位的程序保留的,32位程序应该用GetDiBits
,其实与ScanLine的速度差不多,而Scanline更易使用
 
我曾看到这样的 VB 原码:
Dim bmpColor() As Byte
Public Sub......
.
.
ReDim bmpColor(1 To Bitmap.Width, 1 To Bitmap.Height)
GetBitmapBits hbm, Wid * Hgt, bmpColor(1, 1) '获取图像数组
.
.
这段代码就实现了一下子(比用GetPixel等快多了)将位图的每一个点颜色信息读到一个数
组中,且还灵活的设置了数组的大小,不知用 Delphi 要实现上边同样的功能应该如何做?
当然不一定要用GetBitmapBits,只要读取颜色信息的速度跟它一样就行,希望能给出原码!!!
非常感谢!!!
 
其实Scanline就可以了,但是有点不同:
var
x,y : Integer;
BitMap : TBitMap;
P : PByteArray;
begin
BitMap := TBitMap.create;
try
BitMap.LoadFromFile('C:/Program Files/Common Files/Borland Shared/Images/Splash/256color/factory.bmp');
P := BitMap.ScanLine[BitMap.height-1];
for y := 0 to BitMap.height-1 do
begin
for x := 0 to BitMap.width -1 do
P[(BitMap.height-1-y)*BitMap.Width+x] := y;
//注意这句是关键,注意坐标到数组位置的换算方法
end;
Canvas.draw(0,0,BitMap);
finally
BitMap.free;
end;
end;
也是一下子:)
 
用GETOBJECT,如果传给他一个位图,那么BITMAP结构的最后一个成员就是指向位数据区的指针,
直接拿来用吧,根本不用自己定义数组。
 
可以先将图像转换为Bitmap(用Image.picture.Bitmap.assign),
然后对Image.picture.Bitmap选用下列方法之一:
1.用ScanLine速度挺快,搞个两重循环做一下就可以了(看一下Delphi关于
ScanLine的help);
2.直接用Pixels[i,j]可取得第j行第i列点的值(TColor类型的)。
 
我在使用中时这句
P[(BitMap.height-1-y)*BitMap.Width+x] := y;
老是出错,无法运行;
在调用时,如果要调用某坐标的像素是不是这样
p[x*y];
 
这样用Bitmap.Canvas.Pixels[i,j]就可取得第j行第i列点的值
(也就是(i,j)坐标的像素值)呀!
 
可以直接操作文件么?去掉文件的头部,然后每个点有定长的长度,仔细看看就可以了
以前见别人作过,挺好玩的,不过就是有局限性
 
还可这样处理
 将Bmp存入Stream中,然后利用Stream进行操作,要除文件头,还要将bitmap转换成24位的,具体也可以看fastbmp和思路。
 
Bitmap.Canvas.Pixels[i,j]实在太慢了!
 
这100分在各位高手眼中也许只是个零头,但我是真诚请教各位,感谢各位参与。
我真的很苯,老师说不清楚问题,可能各位早已回答了我,但我看不明白,又或不知怎样
调用,我只好最后再问一次:

在制作不规则窗体时,因为图像上每一个像素点Color都需要与Transparent Color做
比较才能确定出窗体的不规则区域,但是使用Pixels,GetPixel等时,实在很慢(也许是
我的机子太老了吧),往往要停顿一会儿,窗体才会出现,虽然可以使用掩模文件的方法
先做出区域信息文件,再用窗体调用,但是每换副图像,又要再做一次掩模文件,太麻烦
了,我想是不是可以先把图像的颜色信息通过某种更快的方法一次性,按[X,Y]坐标顺序读
入到数组中,然后再通过调用数组[X,Y]与Transparent Color做比较。这样就不再需要每
次都读图像的点,速度上应该会快些吧,不过这只是我的想法,成不成立我并不知道,后
来曾看到有人用GetBitmapBits做过,在速度上确实很快,没有明显的停顿了,可惜是用VB
做的,我刚学编程不久,不会改它的原码,所以只有来请教各位高手。

在这里再次感谢各位!!!
 
多人接受答案了。
 
后退
顶部