So, danke erst mal für die Hinweise und die erste Umsetzung der Formel.
Habe daran noch ein wenig weiter gearbeitet, das sieht nun so aus:
Delphi-Quellcode:
alphaA := A/255;
alphaB := AO/255;
alphaC := alphaA + (1 - alphaA )* AlphaB;
R := round((1/alphaC) * (alphaA* (R/255) + (1-alphaA) * alphaB * (Ro/255) ) * 255);
G := round((1/alphaC) * (alphaA* (G/255) + (1-alphaA) * alphaB * (Go/255) ) * 255);
B := round((1/alphaC) * (alphaA* (B/255) + (1-alphaA) * alphaB * (Bo/255) ) * 255);
A := round (AlphaC * 255);
Funktioniert soweit, nur ist die Verrechnung der Farben anscheinend noch nicht ausreichend. Daher habe ich das hier noch mit meiner Ursprungslösung ergänzt:
Delphi-Quellcode:
alphaA := A/255;
alphaB := AO/255;
alphaC := alphaA + (1 - alphaA )* AlphaB;
B := (ao * (bo - b) shr 8 + b); // hier ergänzt
G := (ao * (go - g) shr 8 + g); //
r := (ao * (ro - r) shr 8 + r); //
R := round((1/alphaC) * (alphaA* (R/255) + (1-alphaA) * alphaB * (Ro/255) ) * 255);
G := round((1/alphaC) * (alphaA* (G/255) + (1-alphaA) * alphaB * (Go/255) ) * 255);
B := round((1/alphaC) * (alphaA* (B/255) + (1-alphaA) * alphaB * (Bo/255) ) * 255);
A := round (AlphaC * 255);
Mit dieser Ergänzung wird das Ergebnis exakt so angezeigt, wie Photoshop die Datei errechnet.
Anliegend mal ein Screenshot, wo eine PSP-Layer-Datei auf eine Ebene reduziert wurde und als PNG-Datei geladen (linke Seite).
Rechts daneben die Original-PSP-Datei, mit den geladenen Layern, wo das Ergebnis dann berechnet mit der o.g. Routine im Programm angezeigt wird (rechte Seite).