Einzelnen Beitrag anzeigen

Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.533 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Zwei übereinander liegende Bilddateien trennen !!!

  Alt 26. Feb 2016, 20: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