Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bitblt: Differenz zweier Bitmaps speichern (https://www.delphipraxis.net/107822-bitblt-differenz-zweier-bitmaps-speichern.html)

smallsmoker 2. Feb 2008 20:57


Bitblt: Differenz zweier Bitmaps speichern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe versucht den code aus diesem beispiel zu benutzen:Link, leider habe ich es nicht hinbekommen.
Es wäre sehr nett wenn jemand mal über meinen quelltext drübergucken könnte um mir den fehler den ich gemacht hab mitzuteilen.

Mein programm soll folgende aufgabe erfüllen:
1. Es soll einen screenshot machen und diesen als datei abspeichern.
dieses bild soll in der variable scrshot1:dc gespeichert sein.

2.Es soll einen weiteren screenshot machen und diesen in der variable scrshot2:dc speichern.
Es soll jetzt die beiden bilder vergleichen und das differenz bild als datei abspeichern.

Mein programm habe ich angehängt
mfg smallsmoker

Dani 3. Feb 2008 00:29

Re: Bitblt: Differenz zweier Bitmaps speichern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo :hi:

Meinst du mit Differenzbild, dass identische Pixel sich zu Schwarz mischen sollen? Wenn ja, dann dürfte das in Anhang in etwa sein, was du suchst...

Edit: Screenshot Methode hatte einen Fehler.

smallsmoker 4. Feb 2008 20:48

Re: Bitblt: Differenz zweier Bitmaps speichern
 
Liste der Anhänge anzeigen (Anzahl: 2)
Danke für die Antwort das ist genau das was ich gesucht habe :)
nur wie kann ich jetzt mit einem 2. Programm dieses "Differenzbild" auf das alte bild legen ?
Ich habe es mit png versucht und habe schwarz transpararent gemacht das hatt leider nicht geklappt ...
es wäre sehr nett wenn du mir noch einmal helfen könntest :oops:
mfg smallsmoker
€: ich habe die bilder jetzt so zusammen gefügt (habe sie vorhar als jpg gespeichert)
Delphi-Quellcode:
var DiffBMP,Image1:timage;
    peg1,peg2:tjpegimage;
begin
diffbmp := timage.Create(nil);
Image1 := timage.Create(nil);
peg1 := tjpegimage.Create;
peg2 := tjpegimage.Create;
peg1.LoadFromFile('image.jpg');
peg2.LoadFromFile('image2.jpg');
diffbmp.Picture.Bitmap.Assign(peg1);
image1.Picture.Bitmap.Assign(peg2);
DiffBMP.Canvas.CopyMode := cmSrcInvert;
DiffBMP.Canvas.Draw(0, 0, Image1.Picture.Graphic);
diffbmp.Picture.Graphic.SaveToFile('bla.bmp');
end;
aber das ergebnis sieht nich so toll aus ... siehe anhang was mache ich falsch ?

Dani 5. Feb 2008 00:02

Re: Bitblt: Differenz zweier Bitmaps speichern
 
Willst du dort, wo Unterschiede sind, eine bestimme Farbe haben? Wie soll das Endergebnis denn aussehen? Warum nicht so wie bla.bmp?

Namenloser 5. Feb 2008 01:14

Re: Bitblt: Differenz zweier Bitmaps speichern
 
Glaskugel: Du willst übers Internet Screenshots verschicken, die du mit PNG komprimierst. Um eine höhere Kompression zu erreichen willst du, dass ungeänderte Flächen schwarz (bzw einfarbig) sind :?:

Wenn ja, dann müsste der XOR-Operator das sein, was du suchst (es sei denn ich hab da jetzt nen Denkfehler, was um diese Uhrzeit ja durchaus mal vorkommen kann :mrgreen:). Ich weiß nicht, ob die Winapi dafür einen Modus anbietet, aber zur Not könntest du es ja mit Scanline machen (das hört sich schwieriger an als es ist).

Dani 5. Feb 2008 01:21

Re: Bitblt: Differenz zweier Bitmaps speichern
 
Jo, Canvas.CopyMode = cmSrcInvert sollte das gewünschte Ergebnis liefern... für den Fall, dass du stattdessen veränderte Bereiche farbig markieren willst, hier noch ein Code-Beispiel (mir ist langweilig)

Zitat:

Zitat von Delphi-Hilfe
cmSrcInvert Kombiniert unter Verwendung des booleschen Operators XOR das Bild auf der Zeichenfläche und das Quell-Bitmap.

Delphi-Quellcode:
function TfrmScreenShot.CreateDiffBitmap(BMP1, BMP2: TBitmap; DiffColor: TColor): TBitmap;
type
  TRGBQuads = array[0..0] of Longword;
  PRGBQuads = ^TRGBQuads;
  TColorConverter = packed record
  case Byte of
      0: (B: Byte;
          G: Byte;
          R: Byte;
          Reserved: Byte);
      1: (Color: TColor);
  end;
var
  Src1Line, Src2Line, ResultLine: PRGBQuads;
  MinLines, MinColumns, MaxLines, MaxColumns: Integer;
  LineIdx, ColumnIdx: Integer;
  SubstColor: Longword;
  Converter: TColorConverter;
begin
  //TColor ist BGR, wir brauchen RGB -> umrechnen.
  Converter.Color := DiffColor;
  SubstColor := RGB(Converter.R, Converter.G, Converter.B);

  //Scanline will DIBs, also machen wir zur Sicherheit mal DIBs draus.
  BMP1.HandleType := bmDIB;
  BMP1.HandleType := bmDIB;
  BMP1.PixelFormat := pf32bit; //Rechnen mit Wortlänge geht scheller.
  BMP2.PixelFormat := pf32bit;

  MaxLines := Max(BMP1.Height, BMP2.Height);
  MaxColumns := Max(BMP1.Width, BMP2.Width);
  MinLines := Min(BMP1.Height, BMP2.Height);
  MinColumns := Min(BMP1.Width, BMP2.Width);

  Result := TBitmap.Create;
  try
    Result.PixelFormat := pf32bit;
    Result.HandleType := bmDIB;
    Result.Width := MaxColumns;
    Result.Height := MaxLines;

    //Gleiche Pixel übernehmen, unterschiedliche durch SubstColor ersetzen.
    for LineIdx := 0 to MinLines - 1 do begin
      Src1Line := BMP1.ScanLine[LineIdx];
      Src2Line := BMP2.ScanLine[LineIdx];
      ResultLine := Result.ScanLine[LineIdx];
      for ColumnIdx := 0 to MinColumns - 1 do begin
        if Src1Line[ColumnIdx] = Src2Line[ColumnIdx] then begin
          ResultLine[ColumnIdx] := Src1Line[ColumnIdx];
        end else begin
          ResultLine[ColumnIdx] := SubstColor;
        end;
      end;
    end;
  except
    Result.Free;
    raise;
  end;
end;
Edit: Speicherleck behoben

smallsmoker 5. Feb 2008 15:51

Re: Bitblt: Differenz zweier Bitmaps speichern
 
ich bin mir nicht sicher aber sollte da nicht statt
Delphi-Quellcode:
        if Src1Line[ColumnIdx] = Src2Line[ColumnIdx] then begin
          ResultLine[ColumnIdx] := Src1Line[ColumnIdx];
        end else begin
          ResultLine[ColumnIdx] := SubstColor;
Delphi-Quellcode:
        if Src1Line[ColumnIdx] = Src2Line[ColumnIdx] then begin
         ResultLine[ColumnIdx] := SubstColor;
        end else begin
          ResultLine[ColumnIdx] := Src2Line[ColumnIdx];
hin ?

Ja ich benutze ja auch schon in der oben benutzten prozedur den xor operant aber komischerweise klappt es nicht ..
Vielen Danke für die antworten ich versuch es weiter mit bitblt umzusetzen :)

€: Ich kann jetzt inerhalb des programmes das machen was ich will (wie oben beschrieben) nur ich kann nich das differenzbild alleine speichern, sondern nur nachdem es mit dem
1. screenshot zusammengefügt wurde ?
Gibt es denn keine möglichkeit dieses differenzbild so abzuspeichern ?

Horst_ 5. Feb 2008 17:55

Re: Bitblt: Differenz zweier Bitmaps speichern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe mal etwas ähnliches gepinselt, was aber nicht mitels PNG komprimiert sondern RunLenghtEncode mit anschliessender zib Komprimierung.
http://www.delphi-forum.de/viewtopic.php?t=55660

Das Beispiel kopiert die linke Seite auf der Daten ausgeben werden und anschliessend wird dies auf der rechten Seite ausgegeben.
Leider nur 25 halbseiten-Bilder pro Sekunde komprimieren, aber 100 dekomprimieren.

Gruß Horst

smallsmoker 5. Feb 2008 19:45

Re: Bitblt: Differenz zweier Bitmaps speichern
 
So erstmal danke für die ganze hilfe :)
habs mit Dani's code hinbekommen
nur habe ich noch ne frage wenn ich dieses differenzbild hab, ich hab zb als "differenzfarbe" clfuchsia genommen und diese dann im png als transparent color angegeben um mit einem 2 programm per altesbild.picture.bitmap.draw(0,0,png) das neue wieder herzustellen aber jetzt werden im diff-bild alle pixel mit clfuchsia transparant gemacht, is ja auch klar aber gibt es keine "transparente" farbe die ich da nehmen könnte ?
mfg smallsmoker

(und wieso geht das nich mit bitblt ! :wall: )

Dani 6. Feb 2008 03:00

Re: Bitblt: Differenz zweier Bitmaps speichern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Okay, ich verstehe jetzt erst, was du machen willst (dank NamenLozers Glaskugel :mrgreen:).

Du hast:

-Einen Screenshot A
-Einen Screenshot B
-Programm A, das Screenshot A kennt
-Programm B, das Screenshot A und B kennt

Du willst:

1. Programm B berechnet Differenzbild (XOR) aus A und B.
2. Programm B sendet Differenzbild an Programm A.
3 Programm A berechnet aus Screenshot A und dem Differenzbild Screenshot B und zeigt Screenshot B an (einfach nochmal XOR).

Zitat:

(und wieso geht das nich mit bitblt !)
Canvas.CopyRect benutzt auch blos StretchBlt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:03 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz