Tetzner Postado Outubro 9, 2007 Denunciar Share Postado Outubro 9, 2007 Ola,Alguém poderia me ajudar, estou tentando comparar 2 imagens .jpeg para descobrir se são iguais.mesmo que não sejam 100% idênticas, mas tenham por exemplo 95% de semelhança, teria de dizer que são iguais. :unsure: Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Outubro 9, 2007 Denunciar Share Postado Outubro 9, 2007 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Tetzner Postado Outubro 9, 2007 Autor Denunciar Share Postado Outubro 9, 2007 Então ...2 problemasimagens 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% igualoutro é que eu tenho dois Jpges ( que são menores ) em vez de Bmps Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Outubro 9, 2007 Denunciar Share Postado Outubro 9, 2007 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Tetzner Postado Outubro 9, 2007 Autor Denunciar Share Postado Outubro 9, 2007 hummmmmmmmmmmok verdade.cara, acho que com alguns ajustes e testes posso sim utilizar este código para a finalidade deseja.Muito obrigado.uma última questão:o caractere lido "ch1" em: Img1.Read(Ch1, 1);é um byte ou bit ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Outubro 9, 2007 Denunciar Share Postado Outubro 9, 2007 As variaveis Ch1, Ch2: char; os valores que uma variavel tipo char pode assumir são ordenados de acordo com o conjunto estendido de caracteres ANSI, este tipo ocupa 1 byte. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Tetzner Postado Outubro 11, 2007 Autor Denunciar Share Postado Outubro 11, 2007 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 filedai eu usei o TImage.Picture.Bitmapmas retorna sempre uma imagem nula ( sempre dá igual ).se eu tenho 1 Timage, carrego com .jpegcomo faço para trabalhar no bitmap dele ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Outubro 11, 2007 Denunciar Share Postado Outubro 11, 2007 Testei aqui sem problemas para carregar a imagemprocedure TForm1.BitBtn1Click(Sender: TObject); begin if OpenPictureDialog1.Execute then Image1.Picture.LoadFromFile(OpenPictureDialog1.filename); end; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Tetzner Postado Outubro 11, 2007 Autor Denunciar Share Postado Outubro 11, 2007 Testou carregando com .jpege depois tentou acessar / comparar com o codigo acima o Tbitmap ?se sim, carrega duas imagens diferentes e testase funcionar, por favor posta o codigo completo do .pas aki valeu!! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Outubro 11, 2007 Denunciar Share Postado Outubro 11, 2007 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Tetzner Postado Outubro 11, 2007 Autor Denunciar Share Postado Outubro 11, 2007 :D vou testar em casa vlw!! :) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Outubro 11, 2007 Denunciar Share Postado Outubro 11, 2007 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% igualoutro é que eu tenho dois Jpges ( que são menores ) em vez de BmpsEu 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=15então uma comparação simples não resolveria.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Tetzner
Ola,
Alguém poderia me ajudar, estou tentando comparar 2 imagens .jpeg para descobrir se são iguais.
mesmo que não sejam 100% idênticas, mas tenham por exemplo 95% de semelhança, teria de dizer que são iguais.
:unsure:
Link para o comentário
Compartilhar em outros sites
11 respostass a esta questão
Posts Recomendados
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.