Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.01.2014, 18:51
Creator13 Creator13 вне форума
Прохожий
 
Регистрация: 18.09.2013
Сообщения: 15
Версия Delphi: Delphi 7
Репутация: 10
Лампочка Изменения в Image

Доброго времени суток!
Возник вопрос, хотел бы попросить помощи в реализации одной задачи.

Есть компонент TImage, делаются скриншоты экрана и в него загоняются эти скриншоты периодично. Необходимо отловить зависание экрана.

Т.е. необходимо узнать произошли ли изменения в картинке. Если изменилось содержимое Image то сделать "действие A", а если экран завис и скрины загоняются одни и те же, то сделать "действие Б"

Нужно быстрое решение, без прогона всего имейджа по пиксельно, возможно, путем взвешивания всех пикселей или еще как-то. Чтобы не было большой задержки по времени и ресурсам.

Буду очень признателен за коддинг.Спасибо!
Ответить с цитированием
  #2  
Старый 06.01.2014, 10:56
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Creator13
Нужно быстрое решение, без прогона всего имейджа по пиксельно, возможно, путем взвешивания всех пикселей или еще как-то. Чтобы не было большой задержки по времени и ресурсам.
Взвешивание всех пикселей это и будет прогоном по всем пикселям - иначе никак, ведь изменение всего одного пикселя является изменением изображения, а чтобы быть уверенным, что ни один пиксель не изменился нужно делать прогон по всем пикселям. А для ускорения обращайся к пикселям напрямую через "TBitmap.ScanLine" вместо медленного "TBitmap.Canvas.Pixels".
Самый надёжный вариант проверить изменилась или нет картинка - сравнить попиксельно новое изображение с предыдущим. Если же изображение будет в основном изменяться, тогда можно попробовать вариант с вычислением суммы пикселей - в этом случае если сумма изменилась, то и изображение изменилось (и не нужно выполнять сравнение с предыдущим изображением), если же сумма не изменилась тогда придётся выполнить ещё и цикл сравнения с предыдущим изображением.
Ответить с цитированием
  #3  
Старый 06.01.2014, 16:41
Creator13 Creator13 вне форума
Прохожий
 
Регистрация: 18.09.2013
Сообщения: 15
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
poli-smen
можете с кодом помочь в реализации ScanLine ?
был бы очень признателен....хотя бы наброскам...

к примеру таймер раз в 10 секунд прогонет Image1, если изменилось содержимое Image1 за эти 10 сек - то действие А, если нет - Б

Последний раз редактировалось Creator13, 06.01.2014 в 16:50.
Ответить с цитированием
  #4  
Старый 06.01.2014, 17:33
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Creator13
можете с кодом помочь в реализации ScanLine ?
был бы очень признателен....хотя бы наброскам...

к примеру таймер раз в 10 секунд прогонет Image1, если изменилось содержимое Image1 за эти 10 сек - то действие А, если нет - Б
Одного Image1 недостаточно - нужно два изображения чтобы их сравнивать: старое и новое.
Ответить с цитированием
  #5  
Старый 06.01.2014, 17:50
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Возможно вам этот код знаком (вариант как предложил poli-smen )
Код:
...

 type
    FRes = record
    found: boolean;
    x,y: integer;
   end;
...

TBuf = array of array of integer;
var

...

  FindResult: FRes;
  buf1, buf2: TBuf;

...

procedure ReadIMG(var buffer: TBuf; img: TImage);
var
  x,y,c: integer;
  p: pByteArray;
begin
  img.Picture.Bitmap.PixelFormat:=pf24Bit; // pf8Bit;
  SetLength(buffer, img.Height, img.Width);
  for y:=0 to img.Height-1 do
    begin
      p:=img.Picture.Bitmap.ScanLine[y];
      for x:=0 to img.Width-1 do
        begin
         c:=((p[x*3+0] shl 8+p[x*3+1]) shl 8)+p[x*3+2];
         buffer[y,x]:=c;
        end;
    end;
end;

function CompareIMGS(Im1:TImage; Im2:TImage): FRes;
var
  y, x, yy, xx: integer;
begin
  ReadIMG(buf2, Im2);
  y:=0;
  repeat
    x:=0;
    repeat
      Result.found:=true;
      yy:=0;
      repeat
        xx:=0;
        repeat
          if buf1[y+yy, x+xx]<>buf2[yy,xx] then Result.found:=false;
          inc(xx);
        until (xx>=Im2.Width) or (Not Result.found);
        inc(yy);
      until (yy>=Im2.Height) or (Not Result.found);
      inc(x);
    until (x>Im1.Width-Im2.Width) or (Result.found);
    inc(y);
  until (y>Im1.Height-Im2.Height) or (Result.found);
  if Result.found then begin
    Result.x:=x-1;
    Result.y:=y-1;
  end;

  end;
использование
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
FindResult:= CompareIMGS(Image1, Image2); // сравниваемые скрины 
 if FindResult.found then ... // различий нет
 else ... // есть несовпадения
 end;
изначально здесь идёт поиск похожего фрагмента на изображении, но можно и целиком рисунки сравнивать
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter