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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2020, 13:25   #1
Иван Ежик
Новичок
Джуниор
 
Регистрация: 18.11.2018
Сообщений: 2
По умолчанию Вопрос возник...Вложенные циклы делают лишнюю работу или ошибка доступа по указателю.

Код:
function CmpBmp(a:TBitmap;var b:tbitmap):Extended;
var
  x,y : Integer;
  Bit1,Bit2 : TBitMap;
  P1,P2 : PIntArray;
  Simil:Integer;
 SBytes1,SBytes2:  INTEGER;
begin
   Simil:=0;
  Bit1 := TBitMap.create;
    Bit1.PixelFormat:=pf32bit;
  Bit1.Height:=32;Bit1.Width:=32;
    b.PixelFormat:=pf32bit;
    a.PixelFormat:=pf32bit;
    SetStretchBltMode(Bit1.Canvas.Handle, STRETCH_DELETESCANS);
  Bit1.Canvas.StretchDraw(Bit1.Canvas.ClipRect,a);

    for y := 0 to 31 do
    begin
      P1 := Bit1.ScanLine[y];
      P2 := b.ScanLine[y];
      for x := 0 to 31  do
       if P1[x]=P2[x] then inc(Simil);
    end;
    result:=(Simil/1024)*100;
   // result:=Simil;
    Bit1.Free;
   // Bit2.Free;
  end;
На одинаковых изображениях 1024 совпадения если раскоментировать // result:=Simil;
Код:
 function FastCmpBmp(a:TBitmap;var b:tbitmap):Extended;
var
  x,y : Integer;
  Bit1,Bit2 : TBitMap;
  P1,P2: PIntArray;
  o1,o2,o3 :PInt;
  Simil:Integer;
 SBytes1,SBytes2:  INTEGER;
begin
   Simil:=0;
  Bit1 := TBitMap.create;
    Bit1.PixelFormat:=pf32bit;
  Bit1.Height:=32;Bit1.Width:=32;

    b.PixelFormat:=pf32bit;
    a.PixelFormat:=pf32bit;
  SetStretchBltMode(Bit1.Canvas.Handle, STRETCH_DELETESCANS);
  Bit1.Canvas.StretchDraw(Bit1.Canvas.ClipRect,a);

      o1 := Bit1.ScanLine[0];
      o2 := b.ScanLine[0];

    for x := 992 downto 0 do
    begin
    //  form1.mmo1.Lines.Add('X:'+IntToStr(x));
    //  form1.mmo1.Lines.Add('O1:'+Format('$%x',[ Integer(o1) ]));
       if o1^=o2^ then inc(Simil);// else  o3^:=$00000000;
       dec(o1,1);
       dec(o2,1);
      // inc(o3,1);
    end;
    result:=(Simil/992)*100;
   //   result:=Simil;
    Bit1.Free;
  end;
Но если "смотреть" пиксели через указатели, то не возможно получить доступ к 1024 штукам,только на 32 меньше, иначе вылетает ошибка.
Иван Ежик вне форума Ответить с цитированием
Старый 03.12.2020, 13:31   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

В памяти картинка хранится в перевёрнутом виде. Верхние строки идут первыми. А 0 последний. У вас банально выход за приделы битовой карты.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 03.12.2020, 13:34   #3
Иван Ежик
Новичок
Джуниор
 
Регистрация: 18.11.2018
Сообщений: 2
По умолчанию

Pavia, Разобрался,Спасибо.теперь ясно представляю КУДА именно указывает Scanline.

Последний раз редактировалось Иван Ежик; 04.12.2020 в 04:00.
Иван Ежик вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Здравствуйте! У меня возник вопрос m4son Общие вопросы C/C++ 1 08.01.2018 19:34
программа или библиотека на си или c++, которые делают аппроксимацию Neumnyu paren Общие вопросы C/C++ 0 18.03.2017 01:18
Возник один вопрос. Shad0wF1rst Общие вопросы C/C++ 6 11.07.2013 13:07
Вложенные циклы или пирамида из кирпичей. PascalABC AntoshkaK Паскаль, Turbo Pascal, PascalABC.NET 0 20.01.2012 16:27