Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

выделение из 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 будет массив пикселей.


Наверх

Титульная страница Поиск, карта сайта Написать письмо