1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
| procedure RGBQuadToHSV(rgb: PRGBQuad; var H,S,V: Integer); var Delta, Min: Integer; begin with rgb^ do begin Min := MinIntValue([rgbRed, rgbGreen, rgbBlue]); V := MaxIntValue([rgbRed, rgbGreen, rgbBlue]); end; Delta := V - Min; if V = 0 then S := 0 else S := MulDiv(Delta, 255, V); if S = 0 then H := 0 else begin with rgb^ do if rgbRed = V then H := MulDiv(rgbGreen - rgbBlue, 60, Delta) else if rgbGreen = V then H := 120 + MulDiv(rgbBlue-rgbRed, 60, Delta) else if rgbBlue = V then H := 240 + MulDiv(rgbRed-rgbGreen, 60, Delta); if H < 0 then H := H + 360; end; end;
procedure TSL(Bmp: TBitmap); var x, h, s, v: Integer; p: PInteger; begin Bmp.PixelFormat:=pf32bit; p:=Bmp.ScanLine[Bmp.Height-1]; for x:=1 to Bmp.Width*Bmp.Height do begin RGBQuadToHSV(PRGBQuad(p), h, s, v); if (s<50) or (v<50) then begin if v>127 then p^:=$00FFFFFF else p^:=$00000000; end else case h of 0..30: p^:=$00FF0000; 31..90: p^:=$00FFFF00; 91..150: p^:=$0000FF00; 151..210: p^:=$0000FFFF; 211..270: p^:=$000000FF; 271..330: p^:=$00FF00FF; 331..360: p^:=$00FF0000; end; Inc(p); end; end; |