AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bitblt: Differenz zweier Bitmaps speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Bitblt: Differenz zweier Bitmaps speichern

Ein Thema von smallsmoker · begonnen am 2. Feb 2008 · letzter Beitrag vom 26. Feb 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von smallsmoker
smallsmoker

Registriert seit: 12. Nov 2007
Ort: Duisburg
283 Beiträge
 
#1

Bitblt: Differenz zweier Bitmaps speichern

  Alt 2. Feb 2008, 21:57
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
Angehängte Dateien
Dateityp: zip screenshot_496.zip (1,7 KB, 21x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Bitblt: Differenz zweier Bitmaps speichern

  Alt 3. Feb 2008, 01:29
Hallo

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.
Angehängte Dateien
Dateityp: zip scrnshot_379.zip (256,4 KB, 38x aufgerufen)
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Benutzerbild von smallsmoker
smallsmoker

Registriert seit: 12. Nov 2007
Ort: Duisburg
283 Beiträge
 
#3

Re: Bitblt: Differenz zweier Bitmaps speichern

  Alt 4. Feb 2008, 21:48
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
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 ?
Miniaturansicht angehängter Grafiken
image2_171.jpg  
Angehängte Dateien
Dateityp: rar ergebniss-bild_bmp__285.rar (620,3 KB, 13x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Bitblt: Differenz zweier Bitmaps speichern

  Alt 5. Feb 2008, 01:02
Willst du dort, wo Unterschiede sind, eine bestimme Farbe haben? Wie soll das Endergebnis denn aussehen? Warum nicht so wie bla.bmp?
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Bitblt: Differenz zweier Bitmaps speichern

  Alt 5. Feb 2008, 02:14
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 ). 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).
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Bitblt: Differenz zweier Bitmaps speichern

  Alt 5. Feb 2008, 02:21
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 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
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Benutzerbild von smallsmoker
smallsmoker

Registriert seit: 12. Nov 2007
Ort: Duisburg
283 Beiträge
 
#7

Re: Bitblt: Differenz zweier Bitmaps speichern

  Alt 5. Feb 2008, 16:51
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 ?
  Mit Zitat antworten Zitat
Horst_

Registriert seit: 22. Jul 2004
Ort: Münster Osnabrück
116 Beiträge
 
#8

Re: Bitblt: Differenz zweier Bitmaps speichern

  Alt 5. Feb 2008, 18:55
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
Angehängte Dateien
Dateityp: zip bilddiff_142.zip (41,8 KB, 16x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von smallsmoker
smallsmoker

Registriert seit: 12. Nov 2007
Ort: Duisburg
283 Beiträge
 
#9

Re: Bitblt: Differenz zweier Bitmaps speichern

  Alt 5. Feb 2008, 20:45
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 ! )
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Bitblt: Differenz zweier Bitmaps speichern

  Alt 6. Feb 2008, 04:00
Okay, ich verstehe jetzt erst, was du machen willst (dank NamenLozers Glaskugel ).

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.
Angehängte Dateien
Dateityp: zip copy_2_of_scrnshot_454.zip (263,8 KB, 22x aufgerufen)
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz