Och, so viel ist das auch nicht, da kann man docg problemlos alle Varianten vorberechnen und dann nur noch aus der Liste picken.
Delphi-Quellcode:
type
PColorArray = ^TColorArray;
TColorArray = array[0..255] of Integer;
TAlphaArray = array[0..255] of TColorArray;
var
AlphaArray: TAlphaArray;
ColorArray: PColorArray;
for IntI := (bm.bmWidth * bm.bmHeight) - 1 downto 0 do begin
if pBits.rgbReserved <> 0 then begin
ColorArray := @AlphaArray[pBits.rgbReserved]
pBits.rgbBlue := ColorArray[pBits.rgbBlue];
pBits.rgbGreen := ColorArray[pBits.rgbGreen];
pBits.rgbRed := ColorArray[pBits.rgbRed];
end;
Inc(pBits);
end;
Wie das vorberechnet wird, ist dann egal. (Float, Int8 oder Int16)
Zitat:
Danke das habe ich ja gemacht.
Nee?
Einmal alle Werte mit deiner Variante berechnen, dann nochmal mit 8 und/oder 16
und sie nebeneinander stellen.
Delphi-Quellcode:
for rgbReserved := 0 to 255 do
for rgbBlue := 0 to 255 do
begin
AlphaCoef1 := 255 div rgbReserved; // auch mal zum Spaß die extemen Rundungsfehler
rgbBlue1 := (rgbBlue * AlphaCoef1);
AlphaCoef8 := (255 shl 8) div rgbReserved;
rgbBlue8 := ((rgbBlue * AlphaCoef8) shr 8);
AlphaCoef16 := (255 shl 16) div rgbReserved;
rgbBlue16 := ((rgbBlue * AlphaCoef16) shr 16);
AlphaCoefF := (rgbReserved / 255);
rgbBlueF := Trunc(rgbBlue / AlphaCoefF); // Trunc statt Round, damit es vergleichbar ist, da DIV/SHR auch abrundet
//rgbBlueF := Trunc(rgbBlue / (rgbReserved / 255)); // frei nach den mathematischen Regeln auflösen
//rgbBlueF := Trunc(rgbBlue / rgbReserved * 255);
//rgbBlueF := Trunc(rgbBlue * 255 / rgbReserved);
rgbBlueD := (rgbBlue * 255) div rgbReserved;
AddToMemo(rgbReserved, rgbBlue, rgbBlue1, rgbBlue8, rgbBlue16, rgbBlueF, rgbBlueD);
end;