Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2014, 19:07   #1
MARTY
 
Регистрация: 06.04.2009
Сообщений: 3
Лампочка Изменения в Image

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

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

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

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

Буду очень признателен за коддинг.Спасибо!
MARTY вне форума Ответить с цитированием
Старый 05.01.2014, 22:29   #2
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

а в каком формате скриншоты?
быстрей ScanLine'a думаю не найдете, попиксельное сравнение
ZuBy вне форума Ответить с цитированием
Старый 05.01.2014, 22:43   #3
MARTY
 
Регистрация: 06.04.2009
Сообщений: 3
По умолчанию

Цитата:
Сообщение от ZuBy Посмотреть сообщение
а в каком формате скриншоты?
быстрей ScanLine'a думаю не найдете, попиксельное сравнение
формат бмп 24пикс.
можете помочь с кодом используя ScanLine?
MARTY вне форума Ответить с цитированием
Старый 05.01.2014, 23:51   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Работайте с изображениями на прямую в памяти, это быстрее.
Человек_Борща вне форума Ответить с цитированием
Старый 06.01.2014, 11:00   #5
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Работайте с изображениями на прямую в памяти, это быстрее.
например? ScanLine вроде и работает с памятью Bitmap'a
ZuBy вне форума Ответить с цитированием
Старый 06.01.2014, 16:51   #6
MARTY
 
Регистрация: 06.04.2009
Сообщений: 3
По умолчанию

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

к примеру таймер раз в 10 секунд прогонет Image1, если изменилось содержимое Image1 за эти 10 сек - то действие А, если нет - Б
MARTY вне форума Ответить с цитированием
Старый 06.01.2014, 22:49   #7
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Код:
// для PixelFormat = 24 bit
const
  PixelCountMax = 32768;

type
  pRGBArray = ^TRGBArray;
  TRGBArray = array [0 .. PixelCountMax - 1] of TRGBTriple;

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  Original, Buffer: TBitmap;
  I, Y: integer;
  OrinalRGB: pRGBArray;
  BufferRGB: pRGBArray;
begin
  Caption := '';
  Buffer := TBitmap.Create;
  Original := TBitmap.Create;

  Buffer.PixelFormat := pf24bit;
  Original.PixelFormat := pf24bit;

  Original.Assign(Image1.Picture.Bitmap); // оригинал
  Buffer.Assign(Image2.Picture.Bitmap); // измененное

  for I := Original.Height - 1 downto 0 do
  begin
    OrinalRGB := pRGBArray(Original.ScanLine[I]);
    BufferRGB := pRGBArray(Buffer.ScanLine[I]);

    for Y := Original.Width - 1 downto 0 do
    begin
      if (OrinalRGB[Y].rgbtBlue <> BufferRGB[Y].rgbtBlue) or (OrinalRGB[Y].rgbtGreen <> BufferRGB[Y].rgbtGreen) or
        (OrinalRGB[Y].rgbtRed <> BufferRGB[Y].rgbtRed) then
        Caption := 'Изменено!';
    end;
  end;

  FreeAndNil(Buffer);
  FreeAndNil(Original);
end;
Учитываем что PixelFormat = pf24bit и размеры Битмапов одинаковы

Последний раз редактировалось ZuBy; 06.01.2014 в 22:51.
ZuBy вне форума Ответить с цитированием
Старый 06.01.2014, 23:07   #8
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

На самом деле правильней всего использовать CompareMem, который вроде код из FastCode использует. И сравнивать сплошняком, естественно. ScanLine вроде же подразумевает непрерывный массив?
Vapaamies вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При столкновении между image переместить другой Image Алексей_2012 Общие вопросы Delphi 1 07.03.2013 09:32
Плавно убрать Image или Image+AlphaBlend ViniPux1112 Мультимедиа в Delphi 1 10.12.2012 23:55
EPNGMissingMultipleIDAT. This PNG Image is invalid because it has missing image parts kardinal94 Общие вопросы Delphi 0 08.10.2010 20:31
Вопрос по Image (скачанная картинка не хочет выводиться в Image) Radnor Мультимедиа в Delphi 2 06.07.2009 02:20
Изменения размера изображения в Image BredoZavR Мультимедиа в Delphi 0 02.07.2009 13:30