Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как-бы мне тут сравнить два TBitmap, с максимальной скоростью? 
:(
    Опции темы
Ak47black
  Дата 5.6.2007, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Здравствуйте.
Вообшем я хочю найти способ функцию, как найти различия между двумя TBitmap.
Тоесть есть два снимка(скриншота 1280x1024) и хочю найти те участки в виде кардинат прямоугольников.
Хотел-бы найти очень быстрый способ, что-бы был меньше 30ms.
Реально-ли такое?

Это сообщение отредактировал(а) Ak47black - 5.6.2007, 18:14
PM MAIL   Вверх
Alexeis
Дата 5.6.2007, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Ak47black, Чего от RLE отказался? Он быстрый. Жмет всего за 1 проход.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ak47black
Дата 5.6.2007, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



А что за RLE? Я про него ничего незнаю (знаю только что такой кодек от M$ так называеться).
Насшет пересылки я посвоему буду сжимать zlib.

Добавлено @ 20:38
Я хочю какбы вычислить те области на скриншоте которые изменились.
Тоесть прямоугольники или квадраты.

Это сообщение отредактировал(а) Ak47black - 5.6.2007, 20:38
PM MAIL   Вверх
Alexeis
Дата 5.6.2007, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Суть RLE состоит в кодировании последовательности чисел с одинаковым значением как спец символ, число повторений и сам символ который повторяется. Если вычесть одно изображение из другого получиться много черных полей, которые отлично жмутся RLE.

Добавлено через 2 минуты и 6 секунд
Пример тут http://256bit.ru/informat/eu_archivs/arh5.htm


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ak47black
Дата 5.6.2007, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Alexeis, гы я чето похожее думал(я домал что какнибудь тут маску с AND или чтонибудь такое можно сделать). 
Шас попробую.

Добавлено через 3 минуты и 18 секунд
Хмм.. тут такая проблема что 
Код

bmp1.ScanLine[0]

Очень много берёт время как нестранно :(
PM MAIL   Вверх
Alexeis
Дата 5.6.2007, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(Ak47black @  5.6.2007,  21:41 Найти цитируемый пост)
Очень много берёт время как нестранно :( 

  Возможно это оптимизация делфи, т.е. операция может DDB->DIB производиться при вызове bmp1.ScanLine[0]


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ak47black
Дата 5.6.2007, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



А может какой-нибудь другой есть способ получить расположения первого бита картинки?

Это сообщение отредактировал(а) Ak47black - 5.6.2007, 22:48
PM MAIL   Вверх
Alexeis
Дата 6.6.2007, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



GetDibBits(); - это то что действительно конвертирует DDB->DIB

Добавлено через 1 минуту и 51 секунду
Указатель на память куда будет записан растр передается в нее, потому он известен изначально.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ak47black
Дата 6.6.2007, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Alexeis, сорри неособо понял, как твой способ заюзать( я насшет того как получить расположение первого бита)?

Это сообщение отредактировал(а) Ak47black - 6.6.2007, 14:33
PM MAIL   Вверх
Alexeis
Дата 6.6.2007, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Ak47black, А хелп для чего дядки из микрософта стараются пишут? Для того что бы другие дядки из борланд его в пустую передирали? 

Код

procedure TForm1.FormCreate(Sender: TObject);
var
  b : TBitmap;
  buf : Pointer;
  bmp : tagBITMAP;
  BMI : BITMAPINFO;
begin
   b := TBitmap.Create;
   b.Width := 5;
   b.Height := 5;
   b.Canvas.LineTo(4, 4);
   FillChar(BMI, sizeof(BMI), 0);
   BMI.bmiHeader.biSize      := sizeof(BMI);
   BMI.bmiHeader.biWidth     := b.Width;
   BMI.bmiHeader.biHeight    := b.Height;
   BMI.bmiHeader.biPlanes    := 1;
   BMI.bmiHeader.biBitCount  := 24;
   BMI.bmiHeader.biSizeImage := ((b.Width * 3 + 3) div 4) * 4 * b.Height;
    GetMem(buf, BMI.bmiHeader.biSizeImage);
   GetDiBits(b.Canvas.Handle,
             b.Handle,
             0, 5,
             buf, BMI, DIB_RGB_COLORS);
   //buf <- указатель на данные
   FreeMem(buf);
   b.Free;
end;


Добавлено через 12 минут и 16 секунд
Цитата(Ak47black @  5.6.2007,  21:41 Найти цитируемый пост)
Очень много берёт время как нестранно :( 

  Фигасе  smile , чего курили борландовцы когда писали следующий код.
Код

function TBitmap.GetScanLine(Row: Integer): Pointer;
begin
  Changing(Self);
  with FImage.FDIB, dsbm, dsbmih do
  begin
    if (Row < 0) or (Row >= bmHeight) then
      InvalidOperation(@SScanLine);
    DIBNeeded;
    GDIFlush;
    if biHeight > 0 then  // bottom-up DIB
      Row := biHeight - Row - 1;
    Integer(Result) := Integer(bmBits) +
      Row * BytesPerScanline(biWidth, biBitCount, 32);
  end;
end;


Главное тут вызов DIBNeeded;

Код

procedure TBitmap.DIBNeeded;
begin
  with FImage do
  begin
    if (FHandle = 0) or (FDIBHandle <> 0) then Exit;
    PaletteNeeded;
    if FDIB.dsbmih.biSize = 0 then
    begin
      GetObject(FHandle, sizeof(FDIB), @FDIB);
      with FDIB, dsbm, dsbmih do
      begin
        biSize := sizeof(dsbmih);
        biWidth := bmWidth;
        biHeight := bmHeight;
        biPlanes := 1;
        biBitCount := bmPlanes * bmBitsPixel;
      end;
    end;
    FDIBHandle := CopyBitmap(FHandle, FPalette, FPalette, FDIB, nil);
  end;
end;


  Замечаем что для каждого вызова GetScanLine будет вызван CopyBitmap(FHandle, FPalette, FPalette, FDIB, nil);  smile оч. милая операция... копирования всего битмапа.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ak47black
Дата 6.6.2007, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Мда тут сплошные барьеры  smile 
Alexeis, а у самого TBitmapа по другому нельзя узнать или тока так делать как-бы структуру и от нее узнавать как ты показал?

Добавлено через 10 минут и 26 секунд
А вообще если своими словами ,то из скольки бит pfDevice состоит?
Я смотрел но так и неврубился.
Если по твоиму я буду делать то у меня тут
Код

   BMI.bmiHeader.biBitCount  := 24;
и тут
  BMI.bmiHeader.biSizeImage := ((bmp1.Width * 3 + 3) div 4) * 4 * bmp1.Height;

Другое количество.
У меня сам TBitmap.PixelFormat = pfDevice.
Если в 24 переводить то много времени занимает.
PM MAIL   Вверх
Alexeis
Дата 6.6.2007, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Ak47black, в pfDevice нельзя получить доступ к битам в принципе. pfDevice годиться только для макроопераций. 

Цитата(Ak47black @  6.6.2007,  17:07 Найти цитируемый пост)
Если в 24 переводить то много времени занимает. 

  Так приведенная функция как раз этим и занимается что переводит из pfDevice в pf24Bit, только это ускоренная реализация на API. Аналогично Scanline будет работать только с pf24Bit, в старых версиях делфи для pfDevice она просто не срабатывала. В новой видимо производиться проверка и автоматическое конвертирование pfDevice в pf24Bit при вызове Scanline, потому операция такая длительная.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ak47black
Дата 6.6.2007, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



:( не не помогает этот код.
Вообшем если его выполнять то он занимает гдето 78ms так-же как вот этот код
Код

   TBitmap.PixelFormat:= pf24bit;

А напрямую с pfDevice форматом пикселей я могу както работать или я пытаюсь сделать чтото нереальное?

Это сообщение отредактировал(а) Ak47black - 6.6.2007, 20:09
PM MAIL   Вверх
Alexeis
Дата 6.6.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Ak47black, очень может быть, так как основное время уходит на преобразование. Тогда думаю прийдеться грести в сторону DSPack и переходить на DirectDraw.

Добавлено @ 20:20
Еще вариант использовать GDI+, а сжимать в TIFF (он тоже использует RLE)

Добавлено через 7 минут и 20 секунд
Цитата(Ak47black @  6.6.2007,  20:05 Найти цитируемый пост)
А напрямую с pfDevice форматом пикселей я могу както работать или я пытаюсь сделать чтото нереальное?

  Винда не предоставляет прямой доступ к этой памяти.

Это сообщение отредактировал(а) Alexeis - 6.6.2007, 20:21


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.