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
| type
TPixelsLine = array[0..1535] of TColor; // 1536 px, largeur du buffer de travail
pPixelsLine = ^TPixelsLine;
var
PixelsLine: pPixelsLine;
dst: TBitmap;
function ColorBGR(LargeurMax, idx: integer): TColor;
var
aByte: byte;
Section, NbreSections: integer;
LargeurSection: integer;
begin
NbreSections := 6; // la valeur à changer (1 à 8)
LargeurSection := LargeurMax div NbreSections;
Section := idx * NbreSections div LargeurMax;
Section := Section + 1; // pour comparer le timing avec wiwaxia -- utile si NbreSec = 6
aByte := (idx * 255 div LargeurSection)-(255 * Section);// 1 à 8 dégradés ok
case (Section) of // -B- -G- -R- /!\ /!\ /!\
0: Result := RGBtoColor(0, 0, aByte); // noir à rouge : bien pour commencer
1: Result := RGBtoColor(0, aByte, 255); // rouge à jaune
2: Result := RGBtoColor(0, 255, 255-aByte); // jaune à vert
3: Result := RGBtoColor(aByte, 255, 0); // vert à cyan
4: Result := RGBtoColor(255, 255-aByte, 0); // cyan à bleu
5: Result := RGBtoColor(255, 0, aByte); // bleu à magenta
//5: Result := RGBtoColor(255-aByte, 0, 0); // bleu à noir
6: Result := RGBtoColor(255-aByte, 0, 255); // magenta à rouge
//6: Result := RGBtoColor(255-aByte, 0, 255-aByte); // magenta à noir
//6: Result := RGBtoColor(255, aByte, 255); // magenta à blanc
//6: Result := RGBtoColor(aByte, 0, aByte); // noir à magenta
7: Result := RGBtoColor(255, aByte, 255); // magenta à blanc pour jouer
//7: Result := RGBtoColor(255-aByte, 255-aByte, 255-aByte); // blanc à noir pour jouer
else Result := clBlack;
end;
end;
procedure ComputeGradientWithScanline(bmp: TBitmap);
var
r,g,b: byte;
h,w: integer;
begin
with bmp do begin
GetMem(PixelsLine, Width*SizeOf(TColor));
BeginUpdate();
for h := 0 to Height-1 do begin
PixelsLine := pPixelsLine(RawImage.GetLineStart(h));
for w := 0 to Width-1 do
PixelsLine^[w] := ColorBGR(Width, w); // 26 millisec (55 pour wiwaxia)
end;
EndUpdate();
end;
end; |
Partager