Comboy
asked on
Access pixels (I need for speed!)
Hi Experts,
I want to get about 500 squares with different size from a bitmap and stretch them into 40 x 40 squares. these lines are to slow to do it:
bmp:=Tbitmap.create;
bitmap:=tbitmap.create;
strbitmap:=tbitmap;
bitmap.assign(image1.pictu re.bitmap) ;
bmp.canvas.copyrect(rect(0 ,0,100,100 ),bitmap.c anvas,rect (0,0,100,1 00));
strbitmap.canvas.stretchdr aw(rect(0, 0,40,40),b itmap.canv as);
to make 500 of strbitmaps it takes more than a second. how can I make it faster. and also I want to access pixels faster - for example I want to count pixels with redvalue of 200~255. don't tell ScanLine is fast ;)
If DirectX or OpenGL are to solve it, please name some good packages which do that.
Thank U,
Comboy
I want to get about 500 squares with different size from a bitmap and stretch them into 40 x 40 squares. these lines are to slow to do it:
bmp:=Tbitmap.create;
bitmap:=tbitmap.create;
strbitmap:=tbitmap;
bitmap.assign(image1.pictu
bmp.canvas.copyrect(rect(0
strbitmap.canvas.stretchdr
to make 500 of strbitmaps it takes more than a second. how can I make it faster. and also I want to access pixels faster - for example I want to count pixels with redvalue of 200~255. don't tell ScanLine is fast ;)
If DirectX or OpenGL are to solve it, please name some good packages which do that.
Thank U,
Comboy
ASKER
It's faster with DirectX, isn't it? Oh well, it's not fast in my case... ;)
anything faster than ScanLine existed and I wasnt told??
Thanks Kunfufaresi, Im not alone!
Shane
Shane
you could read the bitmap into an array like 1..1000000,1..3, with RGB already seperated and work on that if you plan many operations/countings on the same bitmap.
Hello,
here is a doc about scanlines optimization
http://homepages.borland.com/efg2lab/ImageProcessing/Scanline.htm#Examples
it has lots of information about scanlines, but no magic to boost the speed more than 10%, although there is a mention that if you could get access to your PCI/AGP screen card directly the speed dial would jump 10 times, but how to do that it doesnt say, guess you could reverse enginere your screen card drivers! :O
Kunfu Faresi
here is a doc about scanlines optimization
http://homepages.borland.com/efg2lab/ImageProcessing/Scanline.htm#Examples
it has lots of information about scanlines, but no magic to boost the speed more than 10%, although there is a mention that if you could get access to your PCI/AGP screen card directly the speed dial would jump 10 times, but how to do that it doesnt say, guess you could reverse enginere your screen card drivers! :O
Kunfu Faresi
Hey, Comboy! don't say that ScanLines aren't fast ;) I've made color counter some time ago, that counts all used colors in 1600x1200 picture in about 30 msecs on my PC (and I used ScanLines)!
You said that you want to count pixels with redvalue of 200~255. If you need my alghorithm (you'll have to change some places in it) - just say, I'll copy it here.
You said that you want to count pixels with redvalue of 200~255. If you need my alghorithm (you'll have to change some places in it) - just say, I'll copy it here.
ASKER
Hi,
ZhaawA > is it the way you count:
var
bitmap:tbitmap;
p:pbytearray;
x,y,q,w,i:integer;
begin
bitmap:=tbitmap.Create;
bitmap.Assign(image1.Pictu re.Bitmap) ;
q:=gettickcount;
for i:=0 to 100 do begin
for x:=0 to bitmap.Height-1 do begin
p:=bitmap.ScanLine[x];
for y:=0 to bitmap.Width-1 do begin
if (p[y*3+2]>200) and (p[y*3+2]<255) then begin
p[y*3+0]:=255;
p[y*3+1]:=255;
p[y*3+2]:=255;
end;
end;
end;
end;
w:=gettickcount;
image1.Picture.Bitmap.Assi gn(bitmap) ;
showmessage:=(inttostr(w-q ));
end;
Ok, image1.height is 240 and image1.width is 320. in this code I looked for 200<redvalue<255 for 100 times. it takes about 32~47 milliseconds by an ATi Radeon 7000 64MB. and 450 milliseconds for 1000 scans.
But I'm sure DirectX can increase it. If you know how to touch top speed with G32 components (or any other accelerators), please let me know.
Thanks
ZhaawA > is it the way you count:
var
bitmap:tbitmap;
p:pbytearray;
x,y,q,w,i:integer;
begin
bitmap:=tbitmap.Create;
bitmap.Assign(image1.Pictu
q:=gettickcount;
for i:=0 to 100 do begin
for x:=0 to bitmap.Height-1 do begin
p:=bitmap.ScanLine[x];
for y:=0 to bitmap.Width-1 do begin
if (p[y*3+2]>200) and (p[y*3+2]<255) then begin
p[y*3+0]:=255;
p[y*3+1]:=255;
p[y*3+2]:=255;
end;
end;
end;
end;
w:=gettickcount;
image1.Picture.Bitmap.Assi
showmessage:=(inttostr(w-q
end;
Ok, image1.height is 240 and image1.width is 320. in this code I looked for 200<redvalue<255 for 100 times. it takes about 32~47 milliseconds by an ATi Radeon 7000 64MB. and 450 milliseconds for 1000 scans.
But I'm sure DirectX can increase it. If you know how to touch top speed with G32 components (or any other accelerators), please let me know.
Thanks
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
<SMILE>
Shane