Thema: Delphi Rundungs problem?

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.196 Beiträge
 
Delphi 12 Athens
 
#8

AW: Rundungs problem?

  Alt 1. Jun 2017, 19:06
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 1. Jun 2017 um 19:18 Uhr)
  Mit Zitat antworten Zitat