![]() |
Bitblt: Differenz zweier Bitmaps speichern
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe versucht den code aus diesem beispiel zu benutzen:
![]() 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 |
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. |
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:
aber das ergebnis sieht nich so toll aus ... siehe anhang was mache ich falsch ?
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; |
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?
|
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). |
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:
Delphi-Quellcode:
Edit: Speicherleck behoben
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; |
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:
hin ?
if Src1Line[ColumnIdx] = Src2Line[ColumnIdx] then begin
ResultLine[ColumnIdx] := SubstColor; end else begin ResultLine[ColumnIdx] := Src2Line[ColumnIdx]; 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 ? |
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. ![]() 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 |
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: ) |
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:03 Uhr. |
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