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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2012, 15:17   #1
ClMlD
Форумчанин
 
Аватар для ClMlD
 
Регистрация: 09.07.2011
Сообщений: 185
Вопрос Сравнивание двух файлов (bmp)

Доброго времени суток , сравниваю два bmp файла по байтно,
первая картинка берется уже из готовой базы вторая скриншотом с добавлением во временный bmp . Сравнение делаю с помощью этого кода
s:=TmemoryStream.create;
f:=TmemoryStream.create;
s.LoadFromFile(card[i]);
f.LoadFromFile('c:/1.bmp');
if comparemem(s.memory, f.memory, s.size) then
button5.Click
else
i:= i + 1;
s.free;
f.free;
Большинство файлов сравнивает отлично но некоторые файлы не узнает
в чем может быть причина?

Ошибка следующего вида:
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00404272 in modul Project1.exe' Read of address 00000031'.Proccess stopped. Use Step or Run to continue.

После ошибки выделяет эту часть кода s:=TmemoryStream.create;

В Label просматриваю как идет сканирование и видно что он пролистывает всю базу и не видит. Визуально видно что файлы копия похожи и вес и размер.
Скриншот делается из трёх разных мест но скриншоты абсолютно одинаковы . В чем может быть проблема ? и как будет лучше её решить?
ClMlD вне форума Ответить с цитированием
Старый 29.04.2012, 15:31   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

для начала сравните размеры потоков наверно?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.04.2012, 15:35   #3
ClMlD
Форумчанин
 
Аватар для ClMlD
 
Регистрация: 09.07.2011
Сообщений: 185
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
для начала сравните размеры потоков наверно?
А я в поток даже не добавлял , так прям юзаю проверку, использую таймер и все вроде работает, проверку файлов в поток нужно добавить или я не так понял?
ClMlD вне форума Ответить с цитированием
Старый 29.04.2012, 16:18   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от ClMlD Посмотреть сообщение
... или я не так понял?
Да, вы поняли не так.
TmemoryStream это и есть поток.
У вас может быть разный размер у потока s и потока f.
Вы должны сравнивать до минимума из размеров потоков. Или сразу не делать сравнения, если размеры потоков разные.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 29.04.2012 в 16:20.
BDA вне форума Ответить с цитированием
Старый 29.04.2012, 16:30   #5
ClMlD
Форумчанин
 
Аватар для ClMlD
 
Регистрация: 09.07.2011
Сообщений: 185
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Да, вы поняли не так.
TmemoryStream это и есть поток.
У вас может быть разный размер у потока s и потока f.
Вы должны сравнивать до минимума из размеров потоков. Или сразу не делать сравнения, если размеры потоков разные.
что то типо
if s.size = f.size then
-сравниваем
end;
Или всё более серьёзнее?
ClMlD вне форума Ответить с цитированием
Старый 29.04.2012, 16:49   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

ClMlD, по-моему, этого будет достаточно.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 30.04.2012, 01:46   #7
ClMlD
Форумчанин
 
Аватар для ClMlD
 
Регистрация: 09.07.2011
Сообщений: 185
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
ClMlD, по-моему, этого будет достаточно.
Вобщем высполся и свежой головой опять занялся:
Код:
 if s.Size = f.Size then
  if comparemem(s.memory, f.memory, s.size) then
   button5.Click
  else
  i:= i + 1;
end;
Пробовал так, первые две карты норм отобразились, я уж было обрадовался, но потом опять ошибка! Пробовал даже прогу чутка переделывать и сразу с первого же запуска начинал проверять эти две карты всёровно ошибка.

Может быть вы посмотрите ну или попробуете сравнить эти две картинки
Вот картинка с экрана:
1.bmp
А эта картинка с базы:
9b.bmp
С виду обсалютно одинаковы, в чем загвостка не пойму
Изображения
Тип файла: bmp 1.bmp (5.5 Кб, 131 просмотров)
Тип файла: bmp 9b.bmp (5.5 Кб, 136 просмотров)

Последний раз редактировалось ClMlD; 30.04.2012 в 01:48.
ClMlD вне форума Ответить с цитированием
Старый 30.04.2012, 02:14   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Что вы подразумеваете под ошибкой? EAccessViolation?
Скомпилировал код в Delphi 7, TDLite Delphi 2006, Delphi Rad Studio 2010.
Все 3 сказали, что картинки различны.
Код:
var
  s, f: tmemorystream;
begin
  s := TmemoryStream.create;
  f := TmemoryStream.create;
  s.LoadFromFile('1.bmp');
  f.LoadFromFile('9b.bmp');
  if s.Size = f.Size then
    if comparemem(s.memory, f.memory, s.size) then
      showmessage('ok')
    else
      showmessage('different');
  s.free;
  f.free;
end;
[offtop]Смотрю, вы пишите бота для игры в карты)[/offtop]
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 30.04.2012, 02:31   #9
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

ClMlD Вы бы показали код целиком, а то гадать приходиться.
=master= вне форума Ответить с цитированием
Старый 30.04.2012, 03:10   #10
ClMlD
Форумчанин
 
Аватар для ClMlD
 
Регистрация: 09.07.2011
Сообщений: 185
По умолчанию

Цитата:
Сообщение от =master= Посмотреть сообщение
ClMlD Вы бы показали код целиком, а то гадать приходиться.
Оке . В общем пишу что то на подобии покерного калькулятора чтобы он подщитывал шанс моей руки , и так как программа былабы написана мною я бы смог свободно прикрепить её к любому покер руму.

Код:
var
  Form1: TForm1;
     card: array[1..52] of string;
  i : integer;
implementation

{$R *.dfm}
//Делаю скриншот экрана в определёных кардинатах в файл 1.bmp
procedure TForm1.Button1Click(Sender: TObject);
var
DeskHw,DeskHdC : Longint;
begin
deskHw:=getdesktopwindow;
DeskHdc:=getdc(deskHw);
img.Height:=strtoint(txtH.Text);
img.Width:=strtoint(txtW.Text);
BitBlt(img.Canvas.Handle,0,0,strtoint(txtW.Text),
strtoint(txtH.Text),DeskHdc,strtoint(txtX.Text),
strtoint(txtY.Text),SRCCOPY);
img.Picture.SaveToFile('c:/1.bmp');

end;
//Двигаю окно при необходимости в верхний левый угол что бы
//не выставлять каждый раз новые координаты
procedure TForm1.Button2Click(Sender: TObject);
var
  h: Integer;
begin
  h := findwindow(nil, 'KEmulator Lite v0.9.8');
  if h <> 0 then
    SetWindowPos(h, HWND_BOTTOM, 0, 0, 0, 0, swp_nosize);
    end;


//При необходимости удаляю временный файл
procedure TForm1.Button3Click(Sender: TObject);
begin
DeleteFile('c:/1.bmp');
end;
//Что то вроде цикла перебора использую массив для перебора карт с базы , вот гдето здесь мне 
//кажется я и напартачил
procedure TForm1.Timer1Timer(Sender: TObject);

var
  s, f: TmemoryStream;
begin
card[1]:='c:/2b.bmp';
card[2]:='c:/2h.bmp';
card[3]:='c:/2p.bmp';
card[4]:='c:/2k.bmp';
card[5]:='c:/3b.bmp';
card[6]:='c:/3h.bmp';
card[7]:='c:/3p.bmp';
card[8]:='c:/3k.bmp';
card[9]:='c:/4b.bmp';
card[10]:='c:/4h.bmp';
card[11]:='c:/4p.bmp';
card[12]:='c:/4k.bmp';
card[13]:='c:/5b.bmp';
card[14]:='c:/5h.bmp';
card[15]:='c:/5p.bmp';
card[16]:='c:/5k.bmp';
card[17]:='c:/6b.bmp';
card[18]:='c:/6h.bmp';
card[19]:='c:/6p.bmp';
card[20]:='c:/6k.bmp';
card[21]:='c:/7b.bmp';
card[22]:='c:/7h.bmp';
card[23]:='c:/7p.bmp';
card[24]:='c:/7k.bmp';
card[25]:='c:/8b.bmp';
card[26]:='c:/8h.bmp';
card[27]:='c:/8p.bmp';
card[28]:='c:/8k.bmp';
card[29]:='c:/9b.bmp';
card[30]:='c:/9h.bmp';
card[31]:='c:/9p.bmp';
card[32]:='c:/9k.bmp';
card[33]:='c:/10b.bmp';
card[34]:='c:/10h.bmp';
card[35]:='c:/10p.bmp';
card[36]:='c:/10k.bmp';
card[37]:='c:/Jb.bmp';
card[38]:='c:/Jh.bmp';
card[39]:='c:/Jp.bmp';
card[40]:='c:/Jk.bmp';
card[41]:='c:/Qb.bmp';
card[42]:='c:/Qh.bmp';
card[43]:='c:/Qp.bmp';
card[44]:='c:/Qk.bmp';
card[45]:='c:/Kb.bmp';
card[46]:='c:/Kh.bmp';
card[47]:='c:/Kp.bmp';
card[48]:='c:/Kk.bmp';
card[49]:='c:/Ab.bmp';
card[50]:='c:/Ah.bmp';
card[51]:='c:/Ap.bmp';
card[52]:='c:/Ak.bmp';
label1.Caption:=card[i];
  s:=TmemoryStream.create;
  f:=TmemoryStream.create;
  s.LoadFromFile(card[i]);
  f.LoadFromFile('c:/1.bmp');
  //Побайтное сравнение файлов
  if comparemem(s.memory, f.memory, s.size) then
  
   button5.Click
  else
  i:= i + 1;
  s.free;
  f.free;
end;
//Кнопка старта
procedure TForm1.Button4Click(Sender: TObject);
begin
i:= 1;
Button1.Click;
timer1.Enabled:= true;
end;
//Кнопка Стопа
procedure TForm1.Button5Click(Sender: TObject);
begin
    label6.Caption:= card[i];
  timer1.Enabled:=false;
end;
//Кнопка с добовлением кардинат карты Флоп1
procedure TForm1.Button6Click(Sender: TObject);
begin
txtX.Text:='138';
txtY.Text:='349';
txtH.Text:='40';
txtW.Text:='35';
end;
//Кнопка с добовлением кардинат карты Флоп2
procedure TForm1.Button7Click(Sender: TObject);
begin
txtX.Text:='182';
txtY.Text:='349';
txtH.Text:='40';
txtW.Text:='35';
end;
//Кнопка с добовлением кардинат карты Флоп3
procedure TForm1.Button8Click(Sender: TObject);
begin
txtX.Text:='226';
txtY.Text:='349';
txtH.Text:='40';
txtW.Text:='35';
end;
//Кнопка для очистки полей ввода кардинат
procedure TForm1.Button9Click(Sender: TObject);
begin
txtX.Text:='';
txtY.Text:='';
txtH.Text:='';
txtW.Text:='';
end;
В коде я не селён писал сам с нуля как придумал так и написал , надеюсь ситуация проясниться , буду рад даже новому подходу к задаче лижбы всё получилось

Последний раз редактировалось ClMlD; 30.04.2012 в 03:13.
ClMlD вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск файлов формата bmp по заданным параметрам LinaSh Помощь студентам 17 18.04.2011 21:08
XOR двух bmp Pavel_S Мультимедиа в Delphi 4 05.03.2011 07:53
Преобразование bmp файлов Lerank Помощь студентам 2 21.09.2010 12:15
Сравнивание ячеек двух таблиц Rainkhz Общие вопросы Delphi 2 29.05.2010 19:16