AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Zwei übereinander liegende Bilddateien trennen !!!
Thema durchsuchen
Ansicht
Themen-Optionen

Zwei übereinander liegende Bilddateien trennen !!!

Offene Frage von "hanvas"
Ein Thema von 33Olli33 · begonnen am 26. Feb 2016 · letzter Beitrag vom 26. Feb 2016
Antwort Antwort
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.165 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: Zwei übereinander liegende Bilddateien trennen !!!

  Alt 26. Feb 2016, 18:32
Sorry, da bin ich Nerd. Was bedeutet BMP zum zippen? Habe die beiden Bilder als .bmp-Datei gespeichert.
Und wie gehts getzt weiter?
Rechte Maustaste in den Ordner,

Datei/neu/Zip-komprimierter Ordner

Beide Bilder per Drag and Drop in den Zipordner rein ziehen und den Zip-File hier hochladen...
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#2

AW: Zwei übereinander liegende Bilddateien trennen !!!

  Alt 26. Feb 2016, 19:48
Interessante Aufgabe.

Deine Bilder sind allerdings nicht wirklich identisch überlagert, sondern sind in den Ausmaßen unterschiedlich (auch sind die Pixel leicht verschoben).

Zum Testen daher anliegend Dein Originalbild und ein Neues Bild, bestehend aus dem Originalbild mit einem QR-Code hinterlegt (aus meiner Terminverwaltung einfach einen Termin-QR-Code erstellt), leicht transparent.

Mit der nachfolgenden Funktion kann man den QR-Code da raus extrahieren:

Delphi-Quellcode:
type
  TRGBALine = array[word] of TRGBQuad;
  PRGBALine = ^TRGBALine;
  
  tBuff3Char = array [0..2] of AnsiChar;
  TBufTripleCharArray = array [0..32768] of TBuff3Char;
  pBufTripleCharArray = ^TBufTripleCharArray; // Pointer auf TRGBTripleArray


function GetNewPicFromDifferences (OrgPic, NewPic, BDif: TBitmap): Boolean;
var
  x, z, Y: Integer; RGBAOrg, RGBANew, RGBADif: pRGBALine;
  LineOrg, LineNew, LineDif : pBufTripleCharArray;
begin
  Result := FALSE;

  if OrgPic.PixelFormat = pf32Bit then begin

    RGBAOrg := OrgPic.Scanline[OrgPic.Height-1];
    RGBANew := NewPic.Scanline[OrgPic.Height-1];
    RGBADif := BDif.Scanline[OrgPic.Height-1];

    z := OrgPic.Width * OrgPic.Height;

    for x := 0 to z-1 do begin
      if Integer (RGBAOrg^[x]) <> Integer (RGBANew^[x]) then begin
        Result := True;
        RGBADif^[x].rgbBlue := 0;
        RGBADif^[x].rgbred := 0;
        RGBADif^[x].rgbgreen := 0;
        RGBADif^[x].rgbReserved := 255;
      end;
    end;
  end;

  if OrgPic.PixelFormat = pf24Bit then begin
    for y := 0 to OrgPic.Height - 1 do begin
      LineOrg := OrgPic.ScanLine[y];
      LineNew := NewPic.ScanLine[y];
      LineDif := BDif.ScanLine[y];

      for x := 0 to OrgPic.Width - 1 do begin
        if LineOrg[x] <> LineNew[x] then begin
          result:= True;
          //LineDif[x] := LineNew[x];

          LineDif[x][0] := AnsiChar (0);
          LineDif[x][1] := AnsiChar (0);
          LineDif[x][2] := AnsiChar (0);
        end;
      end;
    end;
  end;
end;
Wobei ich die 32-Bit-Variante nicht getestet habe.

Die Funktion setzt voraus, dass alle Bitmaps die gleiche Größe und das gleiche Pixelformat haben, musst Du also vorher abprüfen. In Orgpic muss das Originalbild geladen werden, in NewPic das, welches das Originalbild plus den überlagerten QR-code hat. In BDif erhältst Du den extrahierten QR-Code. Mein iPhone konnte den extrahierten QR-Code einlesen und richtig auswerten.

Aber die Funktion funktioniert nur, wenn Original-Bild und neues Bild sich wirklich nur durch den hinterlegten QR-Code unterscheiden. Wenn im neuen Bild alle Pixel verschoben sind (was bei Deinem Demo-Bild der Fall ist), funktioniert die Variante hier nicht.
Angehängte Dateien
Dateityp: zip Pics.zip (2,38 MB, 18x aufgerufen)
  Mit Zitat antworten Zitat
33Olli33

Registriert seit: 26. Feb 2016
12 Beiträge
 
#3

AW: Zwei übereinander liegende Bilddateien trennen !!!

  Alt 26. Feb 2016, 19:52
Bitte um Entschuldigung, es war Stromausfall.
  Mit Zitat antworten Zitat
33Olli33

Registriert seit: 26. Feb 2016
12 Beiträge
 
#4

AW: Zwei übereinander liegende Bilddateien trennen !!!

  Alt 26. Feb 2016, 19:54
Habe auch ein Iphone5. Mit welchem App hast Du das auslesen können? Meine können das nicht lesen.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#5

AW: Zwei übereinander liegende Bilddateien trennen !!!

  Alt 26. Feb 2016, 20:02
App nennt sich einfach QR von tapmedia
  Mit Zitat antworten Zitat
33Olli33

Registriert seit: 26. Feb 2016
12 Beiträge
 
#6

AW: Zwei übereinander liegende Bilddateien trennen !!!

  Alt 26. Feb 2016, 20:11
Oder kannst Du mir einen Bildschirmdruck von der ausgelesenen Datei hier reinstellen bitte?
Das würde mir wirklich weiterhelfen.
  Mit Zitat antworten Zitat
33Olli33

Registriert seit: 26. Feb 2016
12 Beiträge
 
#7

AW: Zwei übereinander liegende Bilddateien trennen !!!

  Alt 26. Feb 2016, 20:55
Hatte jetzt nochmal beide Fotos in eine RAR-Datei gepackt.
Angehängte Dateien
Dateityp: rar Schlawynski sucht die Brilliant Twins GC409RV.rar (1,47 MB, 24x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#8

AW: Zwei übereinander liegende Bilddateien trennen !!!

  Alt 26. Feb 2016, 22:12
Hatte jetzt nochmal beide Fotos in eine RAR-Datei gepackt.
Jetzt sind die Bilder zwar gleich groß und das Bild ist von der Positionierung der Pixel auch gleich, allerdings weichen die Werte für die einzelnen Pixel auch da voneinander ab, wo kein QR-Code hinterlegt ist. Das kann z.B. durch eine JPG-Komprimierung entstanden sein.

Zum Beispiel hat das erste Pixel einmal 224,225,193 und im anderen Bild 231,231,180.

Selbst wenn man jetzt eine Toleranz-Option einbaut

Delphi-Quellcode:
  w1 := (Byte (LineOrg[x][0]) + Byte (LineOrg[x][1]) + Byte (LineOrg[x][2])) Div 3;
  w2 := (Byte (LineNew[x][0]) + Byte (LineNew[x][1]) + Byte (LineNew[x][2])) Div 3;
  dif := Abs (w2-w1);

  if (dif > Tolerance) then begin
kommt man leider nur zu unbefriedigenden Ergebnissen, siehe Screenshot (hier mit Wert "5").
Angehängte Grafiken
Dateityp: jpg Result2.jpg (253,0 KB, 34x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#9

AW: Zwei übereinander liegende Bilddateien trennen !!!

  Alt 26. Feb 2016, 21:32
Oder kannst Du mir einen Bildschirmdruck von der ausgelesenen Datei hier reinstellen bitte?
Das würde mir wirklich weiterhelfen.
Klar, anliegend die Ergebnis-Datei (in Zip gepackt, damit nicht so groß).
Angehängte Dateien
Dateityp: zip Result.zip (10,3 KB, 28x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.785 Beiträge
 
Delphi 12 Athens
 
#10

AW: Zwei übereinander liegende Bilddateien trennen !!!

  Alt 26. Feb 2016, 21:37
Geht auch mit geringfügig weniger Zeilen:
Delphi-Quellcode:
function GetNewPicFromDifferences (OrgPic, NewPic, BDif: TBitmap): Boolean;
begin
  BDif.Assign(OrgPic);
  result := BitBlt(BDif.Canvas.Handle, 0, 0, BDif.Width, BDif.Height, NewPic.Canvas.Handle, 0, 0, SRCINVERT);
  if result then begin
    BDif.Mask(clBlack);
  end;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:34 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