Ir para conteúdo
Fórum Script Brasil
  • 0

Comparar 2 Imagens Jpeg


Tetzner

Pergunta

11 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...