![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
выделение из BMP массива пикселов [D7]
3DiMaN © (2005-04-07 19:32:00)24 битный BMP находится в Клипборде
подскажите плиз, как получить простой массив его пикселов без всяких TBitmapInfoHeader и прочей ненужной инфы ?
предполагается сделать детектор движения поэтому необходим
анализ изменения пикселов на фотографии
заранее благодарен
programania (2005-04-10 23:46:00) [1]с пикселами очень медленно, может так быстрее:
PROCEDURE clipB_b;
begin
try
b.LoadFromClipBoardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0);
except
er:=true;
showmessage('Нет картинки в ClipBoard'); exit;
end;
for y:=0 to b.height-1 do move(b.ScanLine[y]^,m[y,0,1],b.width*3);
end;
Весь анализ только в массиве:
Массив 3-ех цветов по каждому пикселу:
m :array[0..1200,0..1600{Это макс.размер картинки},1..3] of byte;
>предполагается сделать детектор движения поэтому необходим
анализ изменения пикселов на фотографии
Но у вас же не пикселы движутся
а более крупные обьекты, поэтому для ускорения
усредните этот массив например в 64*64
его и сравнивайте это будет совсем быстро
3DiMaN (2005-04-09 19:08:00) [2]спасибо за ссылочку
попробую
Магнитоныч (2005-04-09 16:21:00) [3]http://www.delphimaster.ru/articles/pixels/index.html
3DiMaN (2005-04-09 14:42:00) [4]сорри, я этот код выдрал из процедуры
там все работает но с тормозами сильными
я бы хотел узнать более эффективный и быстрый алгоритм чтения и сравнения пикселов из битмапа в моем случае
пробовал Bitmap.ScanLine но тормоза почему то еще увеличились
Gero (2005-04-09 11:54:00) [5]Этот код даже не скомпилируется.
Проблема в этом?
3DiMaN (2005-04-09 11:12:00) [6]пытаюсь делать вот так
на большее ума пока не хватает )))
но тормозааааа жуткие
причем почему то из-за строчек
if Image1.Canvas.Pixels[i,j]<>st[k] then s:=s+1;
и
st[k]:=Image1.Canvas.Pixels[i,j];
подскажите плиз как все сделать грамотно
procedure TMain.Button2Click(Sender: TObject);
var
i,j,s,k:integer;
st:array [1..100000] of tcolor; //массив пикселей предидущей картинки
begin
Image1.Picture.Assign(Clipboard);
k:=1; s:=0;
for i:=1 to Image1.Picture.Width do
for j:=1 to Image1.Picture.Height do begin
if Image1.Canvas.Pixels[i,j]<>st[k] then s:=s+1;
st[k]:=Image1.Canvas.Pixels[i,j];
k:=k+1;
end;
edit3.Text:=inttostr(s);
Application.ProcessMessages;
end;
end;
Магнитоныч (2005-04-07 23:01:00) [7]GetBitmapBits
GetDiBits
или Bitmap.ScanLine
Gero (2005-04-07 19:38:00) [8]Загружай в поток, и начиная с SizeOf(TBitmapInfoHeader) + 1 будет массив пикселей.