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

Вниз

Сравнить 2 изображения   Найти похожие ветки 

 
kitsumvi ©   (2006-10-28 14:54) [0]

Как проверить на идентичность два изображения (TBitMap)?


 
Ketmar ©   (2006-10-28 15:00) [1]

сравнить каждый байтик. или пиксель.


 
TIF ©   (2006-10-28 15:15) [2]

самый тупой способ - сравнить размеры изображений. Правда не всегда при совпадении объёмсов совпадают сами изображения :-О


 
kitsumvi ©   (2006-10-28 15:32) [3]

Идея понятна -). А вот как реализовать? Записывать изображения в файл и сравнивать? Не хотелось бы. Да и прямое сравнение не особо привлекает хотелось бы ограничится контрольной суммой (хотя по времени одинаково). Да и не нашел я ее в Дельфи.Прошу подсказать какими классами или функциями можно воспользоваться.


 
Ketmar ©   (2006-10-28 15:34) [4]

Graphics.TBitmap. у него есть все необходимые свойства. в чатсности -- Width, Height, PixelFormat, ScanLine[].


 
kami ©   (2006-10-28 23:22) [5]

(с) Магнитоныч   (20.04.05 22:42)
Для растров с bpp > 8


function BitmapsEqual(Bmp1, Bmp2: TBitmap): Boolean;
var H, H2, LineLength, y: Integer;
  DS: TDIBSection;

function EqualLine(Line: Integer): Boolean;
begin
  Result := CompareMem(@Bmp1.ScanLine[Line]^,
                       @Bmp2.ScanLine[Line]^, LineLength)
end;

begin
Result := False;
{ Сравнение базовых параметров }
if (Bmp1.PixelFormat <> Bmp2.PixelFormat) or
   (Bmp1.Width <> Bmp2.Width) or (Bmp1.Height <> Bmp2.Height) or
   (Bmp1.Width < 1) or (Bmp1.Height < 1)
then Exit;

if GetObject(Bmp1.Handle, SizeOf(DS), @DS) > 0
  then LineLength := DS.dsBm.bmWidthBytes
  else Exit; //error

H := Bmp1.Height - 1;
if H = 0 then
  Result := EqualLine(0)
else begin
  Result := True;
  H2 := ((H+1) div 2) - 1;

  { Сравниваем строки. Цикл проходит строки одновременно сверху
    и снизу, сходясь в центре: так больше вероятность
    скорейшего обнаружения отличающихся пикселей. }
  for y := 0 to H2 do
    if (not EqualLine(y)) or (not EqualLine(H-y)) then
    begin
      Result := False;
      Exit;
    end;

  { Если высота не кратна двум, сравниваем средние строки,
    которые пропустили в цикле. Это сделано, чтобы дважны
    не вызавать CompareMem для одной строки. }
  if (H mod 2) = 0 then
    Result := EqualLine(H2 + 1);
end;
end;


 
kitsumvi ©   (2006-10-30 09:02) [6]

Большое спасибо помогавшим. Особенно kami с Магнитонычем.

С уважением KitsumVI.



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

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

Наверх




Память: 0.48 MB
Время: 0.049 c
2-1161599893
Megabyte
2006-10-23 14:38
2006.11.12
Компоненты работы с почтой


15-1161763445
Иксик
2006-10-25 12:04
2006.11.12
Кто-нибудь ставил icq с Internet Explorer 7.0?


15-1161774885
ProgRAMmer Dimonych
2006-10-25 15:14
2006.11.12
Развод - Не развод


2-1161928283
ГореПрограммер
2006-10-27 09:51
2006.11.12
Выбор папки


1-1159543009
McFalu
2006-09-29 19:16
2006.11.12
Работа с CreateDIBSection