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.