Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

как сравнить содержимое двух TImage?   Найти похожие ветки 

 
pavel_guzhanov ©   (2010-03-07 17:22) [0]

На форме имеются два Timage. В них загружены изображения (например .bmp). Размеры Timage одинаковы. Как проверить, являются ли изображения одинаковыми?


 
Игорь Шевченко ©   (2010-03-07 17:32) [1]

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


 
pavel_guzhanov ©   (2010-03-07 17:50) [2]

С точностью до бита... Изображения маленького размера, 200-300 байт. Но хотелось бы не выгружать их в файл.

Может быть можно как-то сравнить по имени файла, из которого изображение загружено в Timage? Или как-то "просканировать" содержимое TImage?


 
Игорь Шевченко ©   (2010-03-07 17:52) [3]


> С точностью до бита... Изображения маленького размера, 200-
> 300 байт. Но хотелось бы не выгружать их в файл.


Тогда через Scanline будет удобно


 
pavel_guzhanov ©   (2010-03-07 18:16) [4]

Спасибо, буду разбираться.


 
antonn ©   (2010-03-07 18:29) [5]

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


 
Leonid Troyanovsky ©   (2010-03-07 18:53) [6]


> antonn ©   (07.03.10 18:29) [5]

> если размеры одинаковы, то можно снять хеш с памяти

Не нужно.
Для двух уж точно.

--
Regards, LVT.


 
Jeer ©   (2010-03-07 19:14) [7]

Лично мне, так ка-а-тся, достаточно проверить один единственный случайный бит (там и там), чтобы понять, что изображения "отличаются".


 
antonn ©   (2010-03-07 19:31) [8]


> Не нужно.

нужно или нет решать автору, я говорю что "можно"


 
Leonid Troyanovsky ©   (2010-03-07 20:27) [9]


> antonn ©   (07.03.10 19:31) [8]

А говорю не только автору.

--
Regards, LVT.


 
pavel_guzhanov ©   (2010-03-08 18:31) [10]

Делаю примерно вот так:

procedure TMainForm.OnClickImage(sender:TObject);
var BitMap:Graphics.TBitMap;
begin
 Name:=TControl(Sender).Name;
 BitMap:=TImage(FindComponent(Name)).Picture.Bitmap;


На выделенной строке получаю Access violation. Что я делаю не так?


 
Игорь Шевченко ©   (2010-03-08 18:39) [11]


> На выделенной строке получаю Access violation. Что я делаю
> не так?


with Sender as TImage do
 Bitmap := Picture.Bitmap;

?


 
pavel_guzhanov ©   (2010-03-08 18:49) [12]

мне надо определить Timage по имени, т.к надо сравнить содержимое того, который передается как Sender, и еще одного из находящихся на форме, определяемого по имени...


 
antonn ©   (2010-03-08 19:55) [13]

в Timage случаем не jpeg загружен?


 
Игорь Шевченко ©   (2010-03-08 21:01) [14]


> мне надо определить Timage по имени, т.к надо сравнить содержимое
> того, который передается как Sender, и еще одного из находящихся
> на форме, определяемого по имени...


Ну и ? Имена у них отличаются, связь между именами двух TImage в твоей программе я не знаю, в приведенном коде двумя TImage не пахнет,
чем помочь-то ?


 
pavel_guzhanov ©   (2010-03-08 21:08) [15]


> Игорь Шевченко ©   (08.03.10 21:01) [14]

Name:=TControl(Sender as TImage).Name;
 xa:=StrToInt(copy(name, 2, 2));
 ya:=StrToInt(copy(name, 4, 2));

 xaR:=xA;
 yaR:=ya+1;

 if length(IntToStr(xaR))<2 then
 NameR:="B0"+IntToStr(xaR)
 else
   NameR:="B"+IntToStr(xaR);
 if length(IntToStr(yaR))<2 then
   NameR:=NameR+"0"+IntToStr(yaR)
 else
   NameR:=NameR+IntToStr(yaR);
 BitMap:=TImage(FindComponent(Name)).Picture.Bitmap;
 BitMapR:=TImage(FindComponent(NameR)).Picture.Bitmap;

на выделенной строке получаю Access Violation


> antonn ©   (08.03.10 19:55) [13]



> pavel_guzhanov ©   (07.03.10 17:22)
>
> На форме имеются два Timage. В них загружены изображения
> (например .bmp)


 
Игорь Шевченко ©   (2010-03-08 21:14) [16]

var
 SenderName: string;
 Image1, Image2: TImage;
begin
 Image1 := Sender as TImage;
 SenderName := Image1.Name;
 ...Мабл-ванго с именем..
 Image2 := FindComponent(RName) as TImage;


 
Leonid Troyanovsky ©   (2010-03-09 08:06) [17]


> pavel_guzhanov ©   (08.03.10 18:31) [10]

> procedure TMainForm.OnClickImage(sender:TObject);
> var BitMap:Graphics.TBitMap;
> begin
>  Name:=TControl(Sender).Name;
>  BitMap:=TImage(FindComponent(Name)).Picture.Bitmap;
>
> На выделенной строке получаю Access violation. Что я делаю
> не так?

Про AV - не верю.
Или что-то ты не договариваешь.

А не так - Name:=TControl(Sender).Name; - портим имя формы.
Ну и Sender as TControl, если уж на то пошло.

--
Regards, LVT.


 
Омлет ©   (2010-03-12 09:23) [18]

Если известно, что bpp и палитры (если есть) у картинок одинаковы, то используй CompareMem. Что-то типа:

for y := 0 to B1.Height -1 do
begin
  P1:= B1.ScanLine[y];
  P2:= B2.ScanLine[y];
  if not CompareMem(p1, p2, w) then
  begin
    Result := False;
    Break;
  end;
end;


Давно как-то была тема http://delphimaster.net/view/8-1095095132
Пришли к выводу, что для правильного точного сравнения нужно сравнивать попиксельно цвета. Это если требуется универсальность. А, зачастую, CompareMem достаточно.

Быстрый CompareMem есть в Fastcode.



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.049 c
15-1264459453
Германн
2010-01-26 01:44
2010.08.27
"Скорость движения указателя"


2-1266055243
V
2010-02-13 13:00
2010.08.27
Объявление массива


15-1275036370
Anatoly Podgoretsky
2010-05-28 12:46
2010.08.27
С Днем пограничника


2-1268626597
NBAH1990
2010-03-15 07:16
2010.08.27
Как сделать исчезающую панель?


2-1269350538
Nik
2010-03-23 16:22
2010.08.27
DevExpress VerticalGrid cxMemo