// Getestet mit D4 unter XP

// Bei Bildmanipulationen (speziell bei RGB-Werten) muss meist das Ergebnis
// einer Berechnung in den Grenzen eines Bytes bleiben, sprich: Was kleiner
// als Null ist, muss Null werden und was größer als 255 ist, muss 255 werden.
// Eine Lösung wäre beispielsweise:
function SetByte(i: integer): byte; 
begin 
  if i > 255 then result := 255 
  else if i < 0 then result := 0 
  else result := i; 
end;
// Die folgende Lösung ist etwa 1,2 mal schneller, was bei einem Bild mit mehreren
// tausend Pixeln und jeweils drei RGB-Werten schon zur Zeitersparnis beitragen
// kann. 
 
function SetByteX(i: integer): byte; 
asm 
  CMP  EAX, 255 
  JG   @MAX 
  CMP  EAX, 0 
  JGE  @OK 
  MOV  EAX, 0 
  JMP  @OK 
@MAX: 
  MOV  EAX,255 
@OK: 
  MOV  @RESULT, AL 
end; 
 
// Beispielaufruf 
 
procedure TForm1.Button2Click(Sender: TObject); 
var 
  b, c: byte; 
  i: integer; 
begin 
  c := 100; 
  i := 120; 
  b := SetByteX(c - i); 
  showmessage(inttostr(b)); 
end; 
// Wer will, kann die Addition auch mit in den Assemblerteil verlagern.
 
function SetByteX2(a, b: integer): byte; 
asm 
  ADD  EAX, b 
  CMP  EAX, 255 
  JG   @MAX 
  CMP  EAX, 0 
  JGE  @OK 
  MOV  EAX, 0 
  JMP  @OK 
@MAX: 
  MOV  EAX,255 
@OK: 
  MOV  @RESULT, AL 
end; 
 
// Beispielaufruf 
 
procedure TForm1.Button3Click(Sender: TObject); 
var 
  b, c: byte; 
  i: integer; 
begin 
  c := 100; 
  i := -120; 
  b := SetByteX2(c, i); 
  showmessage(inttostr(b)); 
end;



 

Zugriffe seit 6.9.2001 auf Delphi-Ecke