Avatar billede emingos Nybegynder
12. juni 2004 - 20:28 Der er 12 kommentarer og
1 løsning

sammenligne to billeder?

jeg har en function til at tage screenshots og skære billederne  ud, er der så en måde man kan tjekke om 2 billeder er ens? evt læse pixels eller så noget..

har ledt lidt på nettet men uden held

skal bruge det til en timer der skal aktivere en function når et bestemt stykke grafik bliver vist på skærmen
Avatar billede Slettet bruger
12. juni 2004 - 20:34 #1
Avatar billede emingos Nybegynder
12. juni 2004 - 20:44 #2
cool læser lige lidt på det og vender tilbage :O)
Avatar billede stefmeister Nybegynder
13. juni 2004 - 14:21 #3
procedure TForm1.Button1Click(Sender: TObject);
var
  b1, b2: TBitmap;
  c1, c2: PByte;
  x, y, i,
  different: Integer; // Counter for different pixels
begin
  b1 := Image1.Picture.Bitmap;
  b2 := Image2.Picture.Bitmap;
  Assert(b1.PixelFormat = b2.PixelFormat); // they have to be equal
  different := 0;
  for y := 0 to b1.Height - 1 do
  begin
    c1 := b1.Scanline[y];
    c2 := b2.Scanline[y];
    for x := 0 to b1.Width - 1 do
      for i := 0 to BytesPerPixel - 1 do // 1, to 4, dep. on pixelformat
      begin
        Inc(different, Integer(c1^ <> c2^));
        Inc(c1);
        Inc(c2);
      end;
  end;
end;


Den skriver at der ikke er noget der hedder BytesPerPixel, hvordan skal det løses? Kan man bare plotte et tilfældigt tal ind?
Avatar billede Slettet bruger
13. juni 2004 - 14:40 #4
Prøv at indsætte 4 i stedet for BytesPerPixel.
Avatar billede Slettet bruger
13. juni 2004 - 14:50 #5
Ellers virker det her måske :o):

procedure TForm1.Button1Click(Sender: TObject);
var
  b1, b2: TBitmap;
  c1, c2: PByte;
  x, y,
  different: Integer; // Counter for different pixels
begin
  b1 := Image1.Picture.Bitmap;
  b2 := Image2.Picture.Bitmap;
  Assert(b1.PixelFormat = b2.PixelFormat); // they have to be equal
  different := 0;
  for y := 0 to b1.Height - 1 do
  begin
    c1 := b1.Scanline[y];
    c2 := b2.Scanline[y];
    for x := 0 to b1.Width - 1 do
      if RGB(c1[x].rgbtRed,c1[x].rgbtGreen,c1[x].rgbtBlue) <> RGB(c2[x].rgbtRed,c2[x].rgbtGreen,c2[x].rgbtBlue) then
        Inc(different);
  end;
 
  if different = 0 then
    ShowMessage('Billederne er ens');
end;
(ikke testet)
Avatar billede emingos Nybegynder
13. juni 2004 - 17:50 #6
den skriver: array type required
ved
if RGB(c1[x].rgbtRed,c1[x].rgbtGreen,c1[x].rgbtBlue) <> RGB(c2[x].rgbtRed,c2[x].rgbtGreen,c2[x].rgbtBlue) then
Avatar billede ziron Nybegynder
13. juni 2004 - 17:52 #7
Synes denne er noget lettere :

FUNCTION AreEqual(CONST Image1, Image2:  TBitmap):  BOOLEAN;
    VAR
      m1:  TMemoryStream;
      m2:  TMemoryStream;
  BEGIN
    RESULT := FALSE;

    m1 := TMemoryStream.Create;
    TRY
      Image1.SaveToStream(m1);

      m2 := TMemoryStream.Create;
      TRY
        Image2.SaveToStream(m2);

        IF  m1.Size = m2.Size
        THEN RESULT := CompareMem(m1.Memory, m2.Memory, m1.Size)
      FINALLY
        m2.Free
      END
    FINALLY
      m1.Free
    END
  END;
Avatar billede emingos Nybegynder
13. juni 2004 - 17:59 #8
har lige fået denne kode til at virke

procedure TForm1.Button1Click(Sender: TObject);
var
  b1, b2: TBitmap;
  c1, c2: PByte;
  x, y, i,
  different: Integer; // Counter for different pixels
begin
  b1 := Image1.Picture.Bitmap;
  b2 := Image2.Picture.Bitmap;
  Assert(b1.PixelFormat = b2.PixelFormat); // they have to be equal
  different := 0;
  for y := 0 to b1.Height - 1 do
  begin
    c1 := b1.Scanline[y];
    c2 := b2.Scanline[y];
    for x := 0 to b1.Width - 1 do
      for i := 0 to 4 - 1 do // 1, to 4, dep. on pixelformat
      begin
        Inc(different, Integer(c1^ <> c2^));
        Inc(c1);
        Inc(c2);
      end;
  end;
  if different = 0 then
      begin
      showmessage('billederne er ens...');
      end
      else
      begin
      showmessage('billederne er forskellige...')
      end;
end;
Avatar billede emingos Nybegynder
13. juni 2004 - 18:02 #9
jo men størrelse på et billed kan jeg ikke bruge.. da billederne er lige store.. både i højde osv og i kb
Avatar billede ziron Nybegynder
13. juni 2004 - 18:04 #10
det er ikke størrelsen på billede, men data'en i billede. Du kan jo prøve den, og så om du kan lide det. Det virker smukt...
Avatar billede emingos Nybegynder
13. juni 2004 - 18:19 #11
ok tester det lige.. det lød bare som størrelsen :O)
Avatar billede emingos Nybegynder
13. juni 2004 - 18:32 #12
kanont det virker også som om det kræver mindre og da jeg skal bruge dét i en timer gør det ikke noget det ikke æder hele brugerens cpu :O)
Avatar billede ziron Nybegynder
13. juni 2004 - 18:36 #13
Ja den bruger ikke meget, har selv haft brugt det i et program af samme stand som du skriver du skal lave. Og der virker det uden problemer...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester