Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Excel VBA, CAD, Софт, ОС, Windows, Ubuntu, Android, VPS
Win Api, Assembler, C++, Java, Pascal, Lazarus, Delphi, OpenGL, DirectX
C#, Qt, .NET, ASP.NET, Windows Forms, ADO.NET, Framework, WPF, UWP, WinRT, XAML
HTML, CSS, JavaScript, Ajax, PHP, Perl, Python, Ruby, SQL, WordPress, API, XML, JSON, ActionScript, Flash

Ответ
 
Опции темы
Старый 15.08.2016, 14:51   #1
yan11
Пользователь
 
Регистрация: 15.08.2016
Сообщений: 14
Репутация: 10
По умолчанию Сравнение Bitmap и bmp из photoshop

Здравствуйте.

Столкнулся с такой проблемой. Сохраняю изображение с помощью следующей функции, после чего вырезаю кусок сохранённого изображения с помощью фотошопа. В не зависимости от того как сохраняю BMP, поиск по картинке отказывает работать.

В то же время, если обе картинки сохраняю в фотошопе, поиск работает!
Подскажите пожалуйста как скорректировать работу функций чтобы картинки распознавались.



Функция сохранения изображения

Код:

function SavePartOfScreen(ARect : TRect; Way:string) : TBitmap;
var
  ScreenDC: HDC;
  Width, Height, Left, Top: integer;
begin
Result:=TBitmap.Create;

with result do
   begin

   Width:=ARect.Right-ARect.Left;
   Height:=ARect.Bottom-ARect.Top;
   Left:= ARect.Left;
   Top:= ARect.Top;

   ScreenDC:=GetDC(0);
   try
      BitBlt(Canvas.Handle, 0,0,Width,Height,ScreenDC, Left, Top, SRCCOPY );
      result.SaveToFile(Way);
   finally
   ReleaseDC(0, ScreenDC);
   end;
   end;
end;

Функция поиска картинки в картинке:

Код:

function SearchBitmap(bmMain, bmSub:TBitMap; var R:TRect):boolean;
type TIntArray = array [word] of integer;
     PIntArray = ^TIntArray;
var p0, p1, p2:PIntArray;
    x, y:integer;
    x1, y1, w, w0, w1, k : integer;
    b : boolean;
begin
   result := true;
   FillChar(R, sizeOf(R), 0);

   bmMain.PixelFormat:=pf32bit;
   bmSub.PixelFormat:=pf32bit;

   w  := bmMain.width;
   w0 := bmMain.Width*sizeOf(integer);
   w1 := bmSub.Width*sizeOf(integer);

   p0 := bmMain.ScanLine[0];
   p1 := bmSub.ScanLine[0];
   for y := 0 to bmMain.Height - bmSub.Height do begin
      for x := 0 to bmMain.Width - bmSub.Width do begin

         b := true;

         p2 := p1; k := 0;
         for y1 := 0 to bmSub.Height-1 do begin
            for x1 := 0 to bmSub.Width - 1 do begin
                if p0[k+x+x1] <> p2[x1] then begin
                   b := false;
                   break;
                end;
            end;
            if not b then break;
            integer(p2) := integer(p2) - w1;
            k := k - w;
         end;

         if b then begin
            R := Rect(x, y, x+bmSub.Width, y+bmSub.Height);
            exit;
         end;
      end;
      integer(p0) := integer(p0) - w0;
   end;
   result := false;
end;

Изображения
Тип файла: bmp part.bmp (11.6 Кб, 2 просмотров)
Тип файла: bmp part_2.bmp (456 байт, 1 просмотров)
yan11 вне форума   Ответить с цитированием
Старый 15.08.2016, 15:54   #2
yan11
Пользователь
 
Регистрация: 15.08.2016
Сообщений: 14
Репутация: 10
По умолчанию

Посмотрел я по-байтово файлы которые сохраняет программа и фотошоп.

Программа


Код:

Offset      0  1  2  3  4  5  6  7   8  9 10 11 12 13 14 15
00000000   42 4D 36 2E 00 00 00 00  00 00 36 00 00 00 28 00   BM6.......6...(.
00000016   00 00 40 00 00 00 2E 00  00 00 01 00 20 00 00 00   ..@......... ...
00000032   00 00 00 2E 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000048   00 00 00 00 00 00 1A 72  6A FF 17 71 68 FF 14 6F   .......rj&#255;.qh&#255;.o
00000064   66 FF 11 6D 64 FF 0D 6C  62 FF 0C 6C 63 FF 0F 70   f&#255;.md&#255;.lb&#255;.lc&#255;.p
00000080   66 FF 0E 71 67 FF 0D 71  67 FF 0C 72 67 FF 0A 73   f&#255;.qg&#255;.qg&#255;.rg&#255;.s
00000096   67 FF 09 72 67 FF 09 72  67 FF 0E 71 67 FF 16 6A   g&#255;.rg&#255;.rg&#255;.qg&#255;.j
00000112   62 FF 17 62 5D FF 19 5F  5F FF 24 68 6E FF 32 72   b&#255;.b]&#255;.__&#255;$hn&#255;2r

Фотошоп



Код:

Offset      0  1  2  3  4  5  6  7   8  9 10 11 12 13 14 15
00000000   42 4D 38 2E 00 00 00 00  00 00 36 00 00 00 28 00   BM8.......6...(.
00000016   00 00 40 00 00 00 2E 00  00 00 01 00 20 00 00 00   ..@......... ...
00000032   00 00 02 2E 00 00 12 0B  00 00 12 0B 00 00 00 00   ................
00000048   00 00 00 00 00 00 1A 72  6A 00 17 71 68 00 14 6F   .......rj..qh..o
00000064   66 00 11 6D 64 00 0D 6C  62 00 0C 6C 63 00 0F 70   f..md..lb..lc..p
00000080   66 00 0E 71 67 00 0D 71  67 00 0C 72 67 00 0A 73   f..qg..qg..rg..s
00000096   67 00 09 72 67 00 09 72  67 00 0E 71 67 00 16 6A   g..rg..rg..qg..j
00000112   62 00 17 62 5D 00 19 5F  5F 00 24 68 6E 00 32 72   b..b]..__.$hn.2r


Есть какой-то более простой способ решения кроме как перезаписывать биты?

Последний раз редактировалось yan11; 15.08.2016 в 16:38.
yan11 вне форума   Ответить с цитированием
Старый 15.08.2016, 16:04   #3
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 12,383
Репутация: 2542

icq: 512-7шесть5
skype: alexp.frl
По умолчанию

Использовать не bmp, а какой-то другой формат (png, jpeg) + библиотеку для него (если Дельфи не умеет)

у bmp много вариантов формата https://en.wikipedia.org/wiki/BMP_file_format
Alex11223 вне форума   Ответить с цитированием
Старый 15.08.2016, 18:46   #4
Pavia
Лис
Участник клуба
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 963
Репутация: 1125
По умолчанию

Компилятор Delphi или freepascal?
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia на форуме   Ответить с цитированием
Старый 15.08.2016, 18:54   #5
Pavia
Лис
Участник клуба
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 963
Репутация: 1125
По умолчанию

Самое простое это убрать альфу. При присвоении. pf24bit, Delphi за вас биты перепишет. А потом pf32bit чтобы вернуть размерность,.
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 15.08.2016 в 18:56.
Pavia на форуме   Ответить с цитированием
Старый 15.08.2016, 19:09   #6
Pavia
Лис
Участник клуба
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 963
Репутация: 1125
По умолчанию

При сравнении использовать маски тоже простое решение.
Код:

   if (p0[k+x+x1] and $ffffff) <> (p2[x1] and $ffffff) then begin

__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia на форуме   Ответить с цитированием
Старый 15.08.2016, 21:32   #7
yan11
Пользователь
 
Регистрация: 15.08.2016
Сообщений: 14
Репутация: 10
По умолчанию

Методом тыка удалось решить проблему, вместо этого

Код:

BitBlt(Canvas.Handle, 0,0,Width,Height,ScreenDC, Left, Top, SRCCOPY );

сделал вот так

Код:

SetStretchBltMode(Canvas.Handle, HALFTONE);
StretchBlt(Canvas.Handle, 0, 0, Width, Height, ScreenDC, Left, Top, Width, Height, SRCCOPY);

Теперь картинка сохранённая программой, в HEX редакторе выглядит вот так вот:
Код:

Offset      0  1  2  3  4  5  6  7   8  9 10 11 12 13 14 15

00000000   42 4D 36 2E 00 00 00 00  00 00 36 00 00 00 28 00   BM6.......6...(.
00000016   00 00 40 00 00 00 2E 00  00 00 01 00 20 00 00 00   ..@......... ...
00000032   00 00 00 2E 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000048   00 00 00 00 00 00 7F 65  5A 00 80 66 5A 00 80 67   ......eZ.€fZ.€g
00000064   5B 00 81 67 5B 00 82 68  5C 00 82 68 5C 00 83 69   [.g[.‚h\.‚h\.ƒi
00000080   5D 00 84 6A 5D 00 85 6A  5E 00 85 6B 5E 00 86 6B   ].„j].…j^.…k^.†k
00000096   5F 00 87 6C 60 00 82 68  5D 00 8B 81 7F 00 D2 DE   _.‡l`.‚h].‹.&#210;&#222;
00000112   EE 00 D2 DE EE 00 D2 DE  EE 00 D2 DE EE 00 D3 DE   &#238;.&#210;&#222;&#238;.&#210;&#222;&#238;.&#210;&#222;&#238;.&#211;&#222;
00000128   EE 00 D3 DE EE 00 D3 DE  EE 00 D3 DE EE 00 D3 DE   &#238;.&#211;&#222;&#238;.&#211;&#222;&#238;.&#211;&#222;&#238;.&#211;&#222;
00000144   EE 00 D3 DE EE 00 D3 DE  EE 00 D3 DE EE 00 CB D6   &#238;.&#211;&#222;&#238;.&#211;&#222;&#238;.&#211;&#222;&#238;.&#203;&#214;
00000160   E5 00 BF C9 D8 00 D1 DD  EE 00 D2 DD EE 00 D2 DD   &#229;.&#191;&#201;&#216;.&#209;&#221;&#238;.&#210;&#221;&#238;.&#210;&#221;

yan11 вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение двух bmp картинок одинакового размера Artiomtb Помощь студентам 2 15.09.2012 08:50
Сравнение двух Bitmap Nikk[UA] Мультимедиа в Delphi 2 09.05.2012 17:39
Разработать программу для обработки растровых изображений, хранящихся в файлах формата BMP (BitMaP). yeskin Фриланс 5 19.12.2010 16:06
Как в Image.Picture.Bitmap загрузить и отмаштабировать bmp jpg pnp картинки? XerSon Общие вопросы Delphi 33 27.11.2010 17:32
Сравнение попиксельно зоны рабочего стола с указанным *.bmp Travolta Общие вопросы .NET 1 02.12.2008 14:01




11:18.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru