![]() |
|
|
|
|
#1
|
|||
|
|||
|
Доброго времени суток!
Возник вопрос, хотел бы попросить помощи в реализации одной задачи. Есть компонент TImage, делаются скриншоты экрана и в него загоняются эти скриншоты периодично. Необходимо отловить зависание экрана. Т.е. необходимо узнать произошли ли изменения в картинке. Если изменилось содержимое Image то сделать "действие A", а если экран завис и скрины загоняются одни и те же, то сделать "действие Б" Нужно быстрое решение, без прогона всего имейджа по пиксельно, возможно, путем взвешивания всех пикселей или еще как-то. Чтобы не было большой задержки по времени и ресурсам. Буду очень признателен за коддинг.Спасибо! ![]() |
|
#2
|
||||
|
||||
|
Цитата:
Самый надёжный вариант проверить изменилась или нет картинка - сравнить попиксельно новое изображение с предыдущим. Если же изображение будет в основном изменяться, тогда можно попробовать вариант с вычислением суммы пикселей - в этом случае если сумма изменилась, то и изображение изменилось (и не нужно выполнять сравнение с предыдущим изображением), если же сумма не изменилась тогда придётся выполнить ещё и цикл сравнения с предыдущим изображением. |
|
#3
|
|||
|
|||
|
Цитата:
был бы очень признателен....хотя бы наброскам... к примеру таймер раз в 10 секунд прогонет Image1, если изменилось содержимое Image1 за эти 10 сек - то действие А, если нет - Б Последний раз редактировалось Creator13, 06.01.2014 в 16:50. |
|
#4
|
||||
|
||||
|
Цитата:
|
|
#5
|
||||
|
||||
|
Возможно вам этот код знаком (вариант как предложил 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; |