![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как сравнить содержимое двух TImage? [D7, XP]
pavel_guzhanov © (2010-03-07 17:22:00)На форме имеются два Timage. В них загружены изображения (например .bmp). Размеры Timage одинаковы. Как проверить, являются ли изображения одинаковыми?
Омлет (2010-03-12 09:23:00) [1]Если известно, что 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.
Leonid Troyanovsky (2010-03-09 08:06:00) [2]
> 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-08 21:14:00) [3]var
SenderName: string;
Image1, Image2: TImage;
begin
Image1 := Sender as TImage;
SenderName := Image1.Name;
...Мабл-ванго с именем..
Image2 := FindComponent(RName) as TImage;
pavel_guzhanov (2010-03-08 21:08:00) [4]
> Игорь Шевченко © (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:01:00) [5]
> мне надо определить Timage по имени, т.к надо сравнить содержимое
> того, который передается как Sender, и еще одного из находящихся
> на форме, определяемого по имени...
Ну и ? Имена у них отличаются, связь между именами двух TImage в твоей программе я не знаю, в приведенном коде двумя TImage не пахнет,
чем помочь-то ?
antonn (2010-03-08 19:55:00) [6]в Timage случаем не jpeg загружен?
pavel_guzhanov (2010-03-08 18:49:00) [7]мне надо определить Timage по имени, т.к надо сравнить содержимое того, который передается как Sender, и еще одного из находящихся на форме, определяемого по имени...
Игорь Шевченко (2010-03-08 18:39:00) [8]
> На выделенной строке получаю Access violation. Что я делаю
> не так?
with Sender as TImage do
Bitmap := Picture.Bitmap;
?
pavel_guzhanov (2010-03-08 18:31:00) [9]Делаю примерно вот так:
procedure TMainForm.OnClickImage(sender:TObject);
var BitMap:Graphics.TBitMap;
begin
Name:=TControl(Sender).Name;
BitMap:=TImage(FindComponent(Name)).Picture.Bitmap;
На выделенной строке получаю Access violation. Что я делаю не так?
Leonid Troyanovsky (2010-03-07 20:27:00) [10]
> antonn © (07.03.10 19:31) [8]
А говорю не только автору.
--
Regards, LVT.
antonn (2010-03-07 19:31:00) [11]
> Не нужно.
нужно или нет решать автору, я говорю что "можно"
Jeer (2010-03-07 19:14:00) [12]Лично мне, так ка-а-тся, достаточно проверить один единственный случайный бит (там и там), чтобы понять, что изображения "отличаются".
Leonid Troyanovsky (2010-03-07 18:53:00) [13]
> antonn © (07.03.10 18:29) [5]
> если размеры одинаковы, то можно снять хеш с памяти
Не нужно.
Для двух уж точно.
--
Regards, LVT.
antonn (2010-03-07 18:29:00) [14]если размеры одинаковы, то можно снять хеш с памяти
pavel_guzhanov (2010-03-07 18:16:00) [15]Спасибо, буду разбираться.
Игорь Шевченко (2010-03-07 17:52:00) [16]
> С точностью до бита... Изображения маленького размера, 200-
> 300 байт. Но хотелось бы не выгружать их в файл.
Тогда через Scanline будет удобно
pavel_guzhanov (2010-03-07 17:50:00) [17]С точностью до бита... Изображения маленького размера, 200-300 байт. Но хотелось бы не выгружать их в файл.
Может быть можно как-то сравнить по имени файла, из которого изображение загружено в Timage? Или как-то "просканировать" содержимое TImage?
Игорь Шевченко (2010-03-07 17:32:00) [18]критерии одинаковости не озвучены. Если с точностью до бита - выгрузить в файлы и сравнить файлы побайтно, если можно игнорировать незначительную разницу в цвете, то привести к черно-белому изображению с нормализацией (например), сравнить побитно два черно-белых изображения, и т.п.