Jump to content
Fórum Script Brasil
  • 0

Comparar 2 Imagens Jpeg


Tetzner

Question

11 answers to this question

Recommended Posts

  • 0

Fonte ActiveDelphi ... OBS este codigo com um pouco de imaginação pode ser a base de um jogo da memoria.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  jpeg, ExtCtrls, StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.BitBtn1Click(Sender: TObject);
var
   Img1, Img2: TStream;
   I: integer;
   Dif: boolean;
   Ch1, Ch2: char;
begin 
   // cria dois stream´s
   Img1 := TMemoryStream.Create;
   Img2 := TMemoryStream.Create;

   // copia o conteúdo dos bitmaps para os stream´s
   Image1.Picture.Bitmap.SaveToStream(Img1);
   Image2.Picture.Bitmap.SaveToStream(Img2);

   // verifica se são diferentes no tamanho e depois no conteúdo
   Dif := (Img1.Size <> Img2.Size);
   I := 0;
   Img1.Position := 0;
   Img2.Position := 0;

   //se você quiser comparar já pelo tamanho da imagem coloca um if q nem passa pelo looping //verificando o conteudo da imagem..
   // if not dif then

   while not Dif and (I < Img1.Size) do
      begin
         Img1.Read(Ch1, 1);
         Img2.Read(Ch2, 1);

         if Ch1 <> Ch2 then begin
            // verifica se existe diferenca na mesma posiçao, isso significa q as imagens já são diferentes
            Dif := (Ch1 <> Ch2);
            break;
            //sai da repeticao
         end;

      Inc(I);
   end;

   // libera os strem´s da memória
   Img1.Free;
   Img2.Free;

   // exibe mensagens de acordo com o resultado
   if Dif then
      Showmessage('As imagens são diferentes.')
   else
      Showmessage('As imagens são iguais.');

end;

end.

Link to comment
Share on other sites

  • 0

Então ...

2 problemas

imagens de tamanhos diferentes, podem sim ser iguais ... basta uma variação na LUZ e pronto ( a olho nú você nem percebe )

por isso que estabelece-se um % de semelhança, tipo 95% igual

outro é que eu tenho dois Jpges ( que são menores ) em vez de Bmps

Link to comment
Share on other sites

  • 0
se voce percebeu no codigo voce pode testar tanto o tamanho, como o conteudo ( variação de luz , etc ), e o componente TImage aceita JPG. É so fazer o teste.

Cara eu tentei ontem carregar no Timage o .jpeg Load from file

dai eu usei o TImage.Picture.Bitmap

mas retorna sempre uma imagem nula ( sempre dá igual ).

se eu tenho 1 Timage, carrego com .jpeg

como faço para trabalhar no bitmap dele ?

Link to comment
Share on other sites

  • 0

Testei com Jpeg, Bmp, Gif, Png ... funciona perfeitamente.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  jpeg, ExtCtrls, StdCtrls, Buttons, ExtDlgs;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    OpenPictureDialog1: TOpenPictureDialog;
    BitBtn3: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}


// COMPARAR AS FIGURAS
procedure TForm1.BitBtn1Click(Sender: TObject);
var
   Img1, Img2: TStream;
   I: integer;
   Dif: boolean;
   Ch1, Ch2: char;
begin
   // cria dois stream´s
   Img1 := TMemoryStream.Create;
   Img2 := TMemoryStream.Create;

   // copia o conteúdo dos bitmaps para os stream´s
   Image1.Picture.Bitmap.SaveToStream(Img1);
   Image2.Picture.Bitmap.SaveToStream(Img2);

   // verifica se são diferentes no tamanho e depois no conteúdo
   Dif := (Img1.Size <> Img2.Size);
   I := 0;
   Img1.Position := 0;
   Img2.Position := 0;

   //se você quiser comparar já pelo tamanho da imagem coloca um if q nem passa pelo looping //verificando o conteudo da imagem..
   // if not dif then

   while not Dif and (I < Img1.Size) do
      begin
         Img1.Read(Ch1, 1);
         Img2.Read(Ch2, 1);

         if Ch1 <> Ch2 then begin
            // verifica se existe diferenca na mesma posiçao, isso significa q as imagens já são diferentes
            Dif := (Ch1 <> Ch2);
            break;
            //sai da repeticao
         end;

      Inc(I);
   end;

   // libera os strem´s da memória
   Img1.Free;
   Img2.Free;

   // exibe mensagens de acordo com o resultado
   if Dif then
      Showmessage('As imagens são diferentes.')
   else
      Showmessage('As imagens são iguais.');

end;


// CARREGAR FIGURA 1
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
   IF OpenPictureDialog1.Execute then
      Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;

// CARREGAR FIGURA 2
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
   IF OpenPictureDialog1.Execute then
      Image2.Picture.LoadFromFile(OpenPictureDialog1.FileName);

end;

end.

Link to comment
Share on other sites

  • 0
imagens de tamanhos diferentes, podem sim ser iguais ... basta uma variação na LUZ e pronto ( a olho nú você nem percebe )

por isso que estabelece-se um % de semelhança, tipo 95% igual

outro é que eu tenho dois Jpges ( que são menores ) em vez de Bmps

Eu acho que estes itens podem ser problema sim.

Uma pequena variação na tonalidade de uma cor, através de comparação pura, pode resultar em uma interpretação errada.

neste link tem um exemplo que não é muito diferente do que aquele que o Jhonas propôs (comparar os bytes do arquivo - char), mas que "consegue" lhe mostrar quantos pontos coincidem e não coincidem nas duas imagens.

Ele, não vai resolver o problema, mas pode dar uma métrica de que uma comparação de imagens não é algo tão simples como parece exposto até aqui.

a cor azul em hexa-decimal $FF0000, com uma pequena nuance (este azul) $FF100F, tem valores bem diferentes:

$FF0000 -> separando em bytes -> FF=255; 00=0; 00=0

$FF100F -> separando em bytes -> FF=255; 10=16; 0F=15

então uma comparação simples não resolveria.

Abraços

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.5k
×
×
  • Create New...