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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрое сравнение двух рисунков 
:(
    Опции темы
Чучмек
Дата 26.10.2012, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 2
Всего: 41



На два года опоздал,но все равно. 
Вот.
Сравнение 32битных битмапов
Код

type
 tcbp=function(bmp:tbitmap;x,y,pc,ud:cardinal):bool;stdcall;

function CmpBmp(bmp1,bmp2:TBitmap;pc:cardinal;cbp:tcbp;ud:cardinal):boolean;
var
 xn,yn,
 adr1,adr2,
 linesize1,
 linesize2:cardinal;
begin
if not Assigned(bmp1) or not Assigned(bmp2) or not Assigned(cbp)or(pc=0)or(pc>8192)then
 begin
 result:=false;
 exit;
 end;
if bmp2.PixelFormat<>pf32bit then bmp2.PixelFormat:=pf32bit;
xn:=bmp2.Width div pc;
if bmp2.Width>xn*pc then
 begin
 inc(xn);
 bmp2.Width:=xn*pc;
 end;
yn:=bmp2.Height div pc;
if bmp2.Height>yn*pc then
 begin
 inc(yn);
 bmp2.Height:=yn*pc;
 end;
if bmp1.PixelFormat<>bmp2.PixelFormat then bmp1.PixelFormat:=bmp2.PixelFormat;
if bmp1.Width<>bmp2.Width then bmp1.Width:=bmp2.Width;
if bmp1.Height<>bmp2.Height then bmp1.Height:=bmp2.Height;
if bmp2.Height=1 then
 begin
 linesize1:=bmp2.Width*4;
 linesize2:=linesize1;
 end else
 begin
 linesize1:=cardinal(bmp1.ScanLine[0])-cardinal(bmp1.ScanLine[1]);
 linesize2:=cardinal(bmp2.ScanLine[0])-cardinal(bmp2.ScanLine[1]);
 end;
pointer(adr1):=bmp1.ScanLine[bmp1.Height-1];
pointer(adr2):=bmp2.ScanLine[bmp2.Height-1];
asm
pushad
mov eax,linesize1
mul pc
mov ebx,eax
mov eax,linesize2
mul pc
mov edx,esp
sub esp,32                               
mov [edx-28],ebx
mov [edx-32],eax
mov ebx,adr1
mov [edx-20],ebx
mov ebx,adr2
mov [edx-24],ebx
mov eax,pc
shl eax,2
mov ecx,yn
@a:
   push ecx
   mov ecx,xn
   mov ebx,[edx-20]
   mov [edx-12],ebx
   mov ebx,[edx-24]
   mov [edx-16],ebx
   @b:
      push ecx
      mov ecx,pc
      mov ebx,[edx-12]
      mov [edx-4],ebx
      mov ebx,[edx-16]
      mov [edx-8],ebx
      @c:
         push ecx
         mov ecx,pc
         mov esi,[edx-4]  
         mov edi,[edx-8]
         repe cmpsd       
         jz @d
         pushad
         push ud
         push pc
         mov ebx,[edx-12]
         sub ebx,[edx-20]
         shr ebx,2
         mov eax,[edx-36]
         dec eax
         mul pc
         push eax
         push ebx
         push bmp1
         call cbp
         cmp eax,0
         popad
         jz @br2
         add esp,4
         jmp @br1
         @d:
         mov ebx,linesize1
         add [edx-4],ebx
         mov ebx,linesize2
         add [edx-8],ebx
         pop ecx
      loop @c
      @br1:
      add [edx-12],eax
      add [edx-16],eax
      pop ecx
   loop @b
   mov ebx,[edx-28]
   add [edx-20],ebx
   mov ebx,[edx-32]
   add [edx-24],ebx
   pop ecx
loop @a
@br2:
mov esp,edx
popad
end;
result:=true;
end;

Код

function cbp(bmp:tbitmap;x,y,pc,ud:cardinal):bool;stdcall;
begin
BitBlt(form1.Canvas.Handle,x,y,pc,pc,bmp.Canvas.Handle,x,y,SRCCOPY);
result:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
var bmp1,bmp2:tbitmap;
begin
bmp1:=TBitmap.Create;
bmp2:=TBitmap.Create;
bmp1.LoadFromFile('1.bmp');
bmp2.LoadFromFile('2.bmp');
CmpBmp(bmp1,bmp2,50,cbp,0);
end;



Это сообщение отредактировал(а) Чучмек - 26.10.2012, 22:49


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Чучмек
Дата 27.10.2012, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 2
Всего: 41



Вот, сейчас потестил, для интереса.
32битные битмапы 2000*1500
Проц AMD  AthlonII 3.1ГГц
Число сравнений в секунду, для абсолютно идентичных и для абсолютно различных битмапов. При различных N 
Код

 ------------------------------------------------
 |    N    |    ==    |    !=    |
 ------------------------------------------------
 |    1    |    17    |    15    |
 ------------------------------------------------
 |    5    |    72    |    248    |
 ------------------------------------------------
 |    10    |    74    |    918    |
 ------------------------------------------------
 |    50    |    73    |    7812    |
 ------------------------------------------------
 |    100    |    86    |    21276    |
 ------------------------------------------------
 |    500    |    101    |    166666    |
 ------------------------------------------------ 


Это сообщение отредактировал(а) Чучмек - 27.10.2012, 15:25


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

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


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

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


 




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


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

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