1552 lines
32 KiB
ObjectPascal
1552 lines
32 KiB
ObjectPascal
{
|
|
Created by BGRA Controls Team
|
|
Dibo, Circular, lainz (007) and contributors.
|
|
For detailed information see readme.txt
|
|
|
|
Site: https://sourceforge.net/p/bgra-controls/
|
|
Wiki: http://wiki.lazarus.freepascal.org/BGRAControls
|
|
Forum: http://forum.lazarus.freepascal.org/index.php/board,46.0.html
|
|
}
|
|
{******************************* CONTRIBUTOR(S) ******************************
|
|
- Edivando S. Santos Brasil | mailedivando@gmail.com
|
|
(Compatibility with delphi VCL 11/2018)
|
|
|
|
***************************** END CONTRIBUTOR(S) *****************************}
|
|
unit bcfilters;
|
|
|
|
{
|
|
// all pixels //
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels-1 downto 0 do
|
|
begin
|
|
p^.red := ;
|
|
p^.green := ;
|
|
p^.blue := ;
|
|
p^.alpha := ;
|
|
Inc(p);
|
|
end;
|
|
|
|
// scan line //
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
p^.red := ;
|
|
p^.green := ;
|
|
p^.blue := ;
|
|
p^.alpha := ;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
}
|
|
|
|
{$I bgracontrols.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, {$IFDEF FPC}LCLProc, LazUTF8,{$ELSE}Types, BGRAGraphics, GraphType, FPImage, {$ENDIF} Math, BGRABitmap, BGRABitmapTypes;
|
|
|
|
type
|
|
TBCSimpleFilter = (bcsNone, bcsGameBoyDithering, bcsBlackAndWhiteDithering, bcsInvert,
|
|
bcsGrayScale, bcsGrayScaleA,
|
|
bcsGrayScaleBGRA, bcsGameBoy, bcsNoise,
|
|
bcsNoiseA, bcsNoiseBW, bcsNoiseBWA, bcsTVScanLinesH, bcsTVScanLinesV,
|
|
bcsCheckeredL, bcsCheckeredR, bcsBlackAndWhite, bcsInstagram1,
|
|
bcsInstagram2, bcsInstagram3, bcsInstagram4, bcsInstagram5, bcsInstagram6,
|
|
bcsPhotoNoise, bcsPolaroid, bcsMovement, bcsRBG, bcsGRB, bcsGBR,
|
|
bcsBRG, bcsBGR, bcsRRG, bcsRGR, bcsGRR, bcsRRB, bcsRBR, bcsBRR,
|
|
bcsGGR, bcsGRG, bcsRGG, bcsGGB, bcsGBG, bcsBGG, bcsBBR, bcsBRB,
|
|
bcsRBB, bcsBBG, bcsBGB, bcsGBB, bcsRRR, bcsGGG, bcsBBB);
|
|
|
|
const
|
|
BCSimpleFilterStr: array [TBCSimpleFilter] of string =
|
|
('None', 'GameBoyDithering', 'BlackAndWhiteDithering', 'Invert', 'GrayScale',
|
|
'GrayScaleA', 'GrayScaleBGRA', 'GameBoy',
|
|
'Noise', 'NoiseA', 'NoiseBW', 'NoiseBWA', 'TVScanLinesH', 'TVScanLinesV',
|
|
'CheckeredL', 'CheckeredR', 'BlackAndWhite', 'Instagram1', 'Instagram2',
|
|
'Instagram3', 'Instagram4', 'Instagram5', 'Instagram6', 'PhotoNoise',
|
|
'Polaroid', 'Movement', 'RBG', 'GRB', 'GBR', 'BRG', 'BGR', 'RRG',
|
|
'RGR', 'GRR', 'RRB', 'RBR', 'BRR', 'GGR', 'GRG', 'RGG', 'GGB', 'GBG',
|
|
'BGG', 'BBR', 'BRB', 'RBB', 'BBG', 'BGB', 'GBB', 'RRR', 'GGG', 'BBB');
|
|
|
|
function StrToTBCSimpleFilter(const s: ansistring): TBCSimpleFilter;
|
|
procedure BCSimpleFilterStrList(s: TStrings);
|
|
|
|
procedure FilterRGB(Bitmap: TBGRABitmap; R, G, B: byte);
|
|
|
|
procedure RBG(Bitmap: TBGRABitmap);
|
|
procedure GRB(Bitmap: TBGRABitmap);
|
|
procedure GBR(Bitmap: TBGRABitmap);
|
|
procedure BRG(Bitmap: TBGRABitmap);
|
|
procedure BGR(Bitmap: TBGRABitmap);
|
|
procedure RRG(Bitmap: TBGRABitmap);
|
|
procedure RGR(Bitmap: TBGRABitmap);
|
|
procedure GRR(Bitmap: TBGRABitmap);
|
|
procedure RRB(Bitmap: TBGRABitmap);
|
|
procedure RBR(Bitmap: TBGRABitmap);
|
|
procedure BRR(Bitmap: TBGRABitmap);
|
|
procedure GGR(Bitmap: TBGRABitmap);
|
|
procedure GRG(Bitmap: TBGRABitmap);
|
|
procedure RGG(Bitmap: TBGRABitmap);
|
|
procedure GGB(Bitmap: TBGRABitmap);
|
|
procedure GBG(Bitmap: TBGRABitmap);
|
|
procedure BGG(Bitmap: TBGRABitmap);
|
|
procedure BBR(Bitmap: TBGRABitmap);
|
|
procedure BRB(Bitmap: TBGRABitmap);
|
|
procedure RBB(Bitmap: TBGRABitmap);
|
|
procedure BBG(Bitmap: TBGRABitmap);
|
|
procedure BGB(Bitmap: TBGRABitmap);
|
|
procedure GBB(Bitmap: TBGRABitmap);
|
|
procedure RRR(Bitmap: TBGRABitmap);
|
|
procedure GGG(Bitmap: TBGRABitmap);
|
|
procedure BBB(Bitmap: TBGRABitmap);
|
|
|
|
{ Invert colors, keep alpha }
|
|
procedure Invert(Bitmap: TBGRABitmap); overload;
|
|
{ Invert colors, advanced options }
|
|
procedure Invert(Bitmap: TBGRABitmap; touchR, touchG, touchB, touchA: boolean); overload;
|
|
|
|
{ GrayScale, keep alpha }
|
|
procedure GrayScale(Bitmap: TBGRABitmap); overload;
|
|
{ GrayScale, keep alpha, pallete }
|
|
procedure GrayScale(Bitmap: TBGRABitmap; pallete: byte); overload;
|
|
{ GrayScale, alpha 255}
|
|
procedure GrayScaleA(Bitmap: TBGRABitmap);
|
|
{ GrayScale, using BGRAToGrayScale }
|
|
procedure GrayScaleBGRA(Bitmap: TBGRABitmap);
|
|
|
|
{ like GameBoy}
|
|
procedure GameBoy(Bitmap: TBGRABitmap);
|
|
|
|
{ Dithering }
|
|
procedure GameBoyDithering(Bitmap: TBGRABitmap);
|
|
procedure BlackAndWhiteDithering(Bitmap: TBGRABitmap);
|
|
|
|
{ Noise random color, keep alpha }
|
|
procedure Noise(Bitmap: TBGRABitmap); overload;
|
|
{ Noise random color, advanced options }
|
|
procedure Noise(Bitmap: TBGRABitmap; touchR, touchG, touchB, touchA: boolean); overload;
|
|
{ Noise random color, random alpha }
|
|
procedure NoiseA(Bitmap: TBGRABitmap);
|
|
|
|
{ Noise random color, set max posible values }
|
|
procedure NoiseMax(Bitmap: TBGRABitmap; maxR, maxG, maxB, maxA: byte); overload;
|
|
{ Noise random color, set max posible values, advanced options }
|
|
procedure NoiseMax(Bitmap: TBGRABitmap; maxR, maxG, maxB, maxA: byte;
|
|
touchR, touchG, touchB, touchA: boolean); overload;
|
|
|
|
{ Noise black and white, keep alpha }
|
|
procedure NoiseBW(Bitmap: TBGRABitmap);
|
|
{ Noise black and white, random alpha }
|
|
procedure NoiseBWA(Bitmap: TBGRABitmap);
|
|
|
|
{ TV Lines Horizontal }
|
|
procedure TVScanLinesH(Bitmap: TBGRABitmap);
|
|
{ TV Lines Vertical }
|
|
procedure TVScanLinesV(Bitmap: TBGRABitmap);
|
|
{ Checkered Left aligned }
|
|
procedure CheckeredL(Bitmap: TBGRABitmap);
|
|
{ Checkered Right aligned }
|
|
procedure CheckeredR(Bitmap: TBGRABitmap);
|
|
|
|
{ Black and White, middle 128 }
|
|
procedure BlackAndWhite(Bitmap: TBGRABitmap); overload;
|
|
{ Black and White, custom middle }
|
|
procedure BlackAndWhite(Bitmap: TBGRABitmap; middle: byte); overload;
|
|
|
|
{ Instagram Filters }
|
|
// sepia
|
|
procedure Instagram1(Bitmap: TBGRABitmap);
|
|
// blue-green
|
|
procedure Instagram2(Bitmap: TBGRABitmap);
|
|
// purple
|
|
procedure Instagram3(Bitmap: TBGRABitmap);
|
|
// blue 3 channels
|
|
procedure Instagram4(Bitmap: TBGRABitmap);
|
|
// green 3 channels
|
|
procedure Instagram5(Bitmap: TBGRABitmap);
|
|
// red 3 channels
|
|
procedure Instagram6(Bitmap: TBGRABitmap);
|
|
// white rounded border
|
|
procedure Polaroid(Bitmap: TBGRABitmap);
|
|
// blured bw noise
|
|
procedure PhotoNoise(Bitmap: TBGRABitmap);
|
|
|
|
{ Pixel movement }
|
|
procedure Movement(Bitmap: TBGRABitmap; randXmin: NativeInt = -5;
|
|
randXmax: NativeInt = 5; randYmin: NativeInt = -5; randYmax: NativeInt = 5);
|
|
|
|
procedure Zoomy(Bitmap: TBGRABitmap; xMy, yMy: extended);
|
|
|
|
{ Filters that only need Bitmap as parameter }
|
|
procedure SimpleFilter(Bitmap: TBGRABitmap; Filter: TBCSimpleFilter);
|
|
|
|
implementation
|
|
|
|
function StrToTBCSimpleFilter(const s: ansistring): TBCSimpleFilter;
|
|
var
|
|
sf: TBCSimpleFilter;
|
|
ls: ansistring;
|
|
begin
|
|
sf := bcsNone;
|
|
Result := sf;
|
|
ls := {$IFDEF FPC}UTF8LowerCase{$ELSE}LowerCase{$ENDIF}(s);
|
|
for sf := low(TBCSimpleFilter) to high(TBCSimpleFilter) do
|
|
if ls = {$IFDEF FPC}UTF8LowerCase{$ELSE}LowerCase{$ENDIF}(BCSimpleFilterStr[sf]) then
|
|
begin
|
|
Result := sf;
|
|
break;
|
|
end;
|
|
end;
|
|
|
|
procedure BCSimpleFilterStrList(s: TStrings);
|
|
var
|
|
sf: TBCSimpleFilter;
|
|
begin
|
|
for sf := low(TBCSimpleFilter) to high(TBCSimpleFilter) do
|
|
s.Add(BCSimpleFilterStr[sf]);
|
|
end;
|
|
|
|
procedure Invert(Bitmap: TBGRABitmap);
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
p^.red := not p^.red;
|
|
p^.green := not p^.green;
|
|
p^.blue := not p^.blue;
|
|
//p^.alpha := not p^.alpha;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
procedure Invert(Bitmap: TBGRABitmap; touchR, touchG, touchB, touchA: boolean);
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
if touchR then
|
|
p^.red := not p^.red;
|
|
if touchG then
|
|
p^.green := not p^.green;
|
|
if touchB then
|
|
p^.blue := not p^.blue;
|
|
if touchA then
|
|
p^.alpha := not p^.alpha;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
procedure GrayScale(Bitmap: TBGRABitmap);
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
c: byte;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
c := (p^.red + p^.green + p^.blue) div 3;
|
|
p^.red := c;
|
|
p^.green := c;
|
|
p^.blue := c;
|
|
//p^.alpha := 255;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
procedure GrayScale(Bitmap: TBGRABitmap; pallete: byte);
|
|
var
|
|
i, j: integer;
|
|
p: PBGRAPixel;
|
|
c: byte;
|
|
gpallete: array of byte;
|
|
begin
|
|
if pallete = 0 then
|
|
pallete := 1
|
|
else if pallete = 255 then
|
|
begin
|
|
GrayScale(Bitmap);
|
|
exit;
|
|
end;
|
|
|
|
SetLength(gpallete, pallete);
|
|
|
|
for i := 0 to High(gpallete) do
|
|
begin
|
|
gpallete[i] := (255 * i) div 255;
|
|
end;
|
|
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
c := (p^.red + p^.green + p^.blue) div 3;
|
|
|
|
for j := 0 to High(gpallete) do
|
|
begin
|
|
if (c >= gpallete[j]) and (c <= gpallete[j + 1]) then
|
|
begin
|
|
c := gpallete[j];
|
|
break;
|
|
end;
|
|
end;
|
|
|
|
p^.red := c;
|
|
p^.green := c;
|
|
p^.blue := c;
|
|
//p^.alpha := 255;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
procedure GrayScaleA(Bitmap: TBGRABitmap);
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
c: byte;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
c := (p^.red + p^.green + p^.blue) div 3;
|
|
p^.red := c;
|
|
p^.green := c;
|
|
p^.blue := c;
|
|
p^.alpha := 255;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
procedure GrayScaleBGRA(Bitmap: TBGRABitmap);
|
|
begin
|
|
Bitmap.InplaceGrayscale;
|
|
{var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
p^ := BGRAToGrayscale(p^);
|
|
Inc(p);
|
|
end;}
|
|
end;
|
|
|
|
procedure GameBoy(Bitmap: TBGRABitmap);
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
c: integer;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
{c := (p^.red + p^.green + p^.blue) div 3;
|
|
case c of
|
|
0..63: p^ := BGRA(0,80,32,255);
|
|
64..127: p^ := BGRA(0,104,24,255);
|
|
128..191: p^ := BGRA(0,176,0,255);
|
|
192..255: p^ := BGRA(112,224,48,255);
|
|
end;}
|
|
|
|
c := p^.red + p^.green + p^.blue;
|
|
|
|
if c <= 382 then
|
|
begin
|
|
if c <= 191 then
|
|
p^ := BGRA(0, 80, 32, 255)
|
|
else
|
|
p^ := BGRA(0, 104, 24, 255);
|
|
end
|
|
else
|
|
begin
|
|
if c <= 573 then
|
|
p^ := BGRA(0, 176, 0, 255)
|
|
else
|
|
p^ := BGRA(112, 224, 48, 255);
|
|
end;
|
|
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
procedure GameBoyDithering(Bitmap: TBGRABitmap);
|
|
|
|
function find_closest_palette_color(cl: TBGRAPixel): TBGRAPixel;
|
|
var
|
|
c: integer;
|
|
begin
|
|
c := cl.red + cl.green + cl.blue;
|
|
|
|
if c <= 382 then
|
|
begin
|
|
if c <= 191 then
|
|
result := BGRA(0, 80, 32, 255)
|
|
else
|
|
result := BGRA(0, 104, 24, 255);
|
|
end
|
|
else
|
|
begin
|
|
if c <= 573 then
|
|
result := BGRA(0, 176, 0, 255)
|
|
else
|
|
result := BGRA(112, 224, 48, 255);
|
|
end;
|
|
end;
|
|
|
|
function multiply_divide(pixel,sum: TBGRAPixel;mult,divi: integer):TBGRAPixel;
|
|
begin
|
|
result.red := round(pixel.red + sum.red * mult / divi);
|
|
result.green := round(pixel.green + sum.green * mult / divi);
|
|
result.blue := round(pixel.blue + sum.blue * mult / divi);
|
|
end;
|
|
|
|
var
|
|
x, y: integer;
|
|
oldpixel, newpixel, quant_error: TBGRAPixel;
|
|
begin
|
|
for y := 0 to Bitmap.Height do
|
|
begin
|
|
for x := 0 to Bitmap.Width do
|
|
begin
|
|
oldpixel := Bitmap.GetPixel(x,y);
|
|
newpixel := find_closest_palette_color(oldpixel);
|
|
Bitmap.SetPixel(x,y,newpixel);
|
|
|
|
quant_error.red := oldpixel.red - newpixel.red;
|
|
quant_error.green := oldpixel.green - newpixel.green;
|
|
quant_error.blue := oldpixel.blue - newpixel.blue;
|
|
|
|
Bitmap.SetPixel(x + 1, y,multiply_divide(Bitmap.GetPixel(x + 1, y),quant_error,7,16));
|
|
Bitmap.SetPixel(x - 1, y + 1,multiply_divide(Bitmap.GetPixel(x - 1, y + 1),quant_error,3,16));
|
|
Bitmap.SetPixel(x, y + 1,multiply_divide(Bitmap.GetPixel(x, y + 1),quant_error,5,16));
|
|
Bitmap.SetPixel(x + 1, y + 1,multiply_divide(Bitmap.GetPixel(x + 1, y + 1),quant_error,1,16));
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure BlackAndWhiteDithering(Bitmap: TBGRABitmap);
|
|
function find_closest_palette_color(cl: TBGRAPixel): TBGRAPixel;
|
|
var
|
|
c: integer;
|
|
begin
|
|
c := cl.red + cl.green + cl.blue;
|
|
|
|
if c <= 127 then
|
|
result := BGRABlack
|
|
else
|
|
result := BGRAWhite;
|
|
end;
|
|
|
|
function multiply_divide(pixel,sum: TBGRAPixel;mult,divi: integer):TBGRAPixel;
|
|
begin
|
|
result.red := round(pixel.red + sum.red * mult / divi);
|
|
result.green := round(pixel.green + sum.green * mult / divi);
|
|
result.blue := round(pixel.blue + sum.blue * mult / divi);
|
|
end;
|
|
|
|
var
|
|
x, y: integer;
|
|
oldpixel, newpixel, quant_error: TBGRAPixel;
|
|
begin
|
|
for y := 0 to Bitmap.Height do
|
|
begin
|
|
for x := 0 to Bitmap.Width do
|
|
begin
|
|
oldpixel := Bitmap.GetPixel(x,y);
|
|
newpixel := find_closest_palette_color(oldpixel);
|
|
Bitmap.SetPixel(x,y,newpixel);
|
|
|
|
quant_error.red := oldpixel.red - newpixel.red;
|
|
quant_error.green := oldpixel.green - newpixel.green;
|
|
quant_error.blue := oldpixel.blue - newpixel.blue;
|
|
|
|
Bitmap.SetPixel(x + 1, y,multiply_divide(Bitmap.GetPixel(x + 1, y),quant_error,7,16));
|
|
Bitmap.SetPixel(x - 1, y + 1,multiply_divide(Bitmap.GetPixel(x - 1, y + 1),quant_error,3,16));
|
|
Bitmap.SetPixel(x, y + 1,multiply_divide(Bitmap.GetPixel(x, y + 1),quant_error,5,16));
|
|
Bitmap.SetPixel(x + 1, y + 1,multiply_divide(Bitmap.GetPixel(x + 1, y + 1),quant_error,1,16));
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure Noise(Bitmap: TBGRABitmap);
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
p^.red := Random(256);
|
|
p^.green := Random(256);
|
|
p^.blue := Random(256);
|
|
//p^.alpha := Random(256);
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
procedure Noise(Bitmap: TBGRABitmap; touchR, touchG, touchB, touchA: boolean);
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
if touchR then
|
|
p^.red := Random(256);
|
|
if touchG then
|
|
p^.green := Random(256);
|
|
if touchB then
|
|
p^.blue := Random(256);
|
|
if touchA then
|
|
p^.alpha := Random(256);
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
procedure NoiseA(Bitmap: TBGRABitmap);
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
p^.red := Random(256);
|
|
p^.green := Random(256);
|
|
p^.blue := Random(256);
|
|
p^.alpha := Random(256);
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
procedure NoiseBW(Bitmap: TBGRABitmap);
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
c: byte;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
c := Random(2);
|
|
p^.red := c + 255;
|
|
p^.green := c + 255;
|
|
p^.blue := c + 255;
|
|
//p^.alpha := Random(256);
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
procedure NoiseBWA(Bitmap: TBGRABitmap);
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
c: byte;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
c := Random(2);
|
|
p^.red := c + 255;
|
|
p^.green := c + 255;
|
|
p^.blue := c + 255;
|
|
p^.alpha := Random(256);
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
procedure TVScanLinesH(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
if Odd(y) then
|
|
begin
|
|
p^.red := 0;
|
|
p^.green := 0;
|
|
p^.blue := 0;
|
|
//p^.alpha := 255;
|
|
end;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure TVScanLinesV(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
if Odd(x) then
|
|
begin
|
|
p^.red := 0;
|
|
p^.green := 0;
|
|
p^.blue := 0;
|
|
//p^.alpha := 255;
|
|
end;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure CheckeredL(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
if Odd(y) and Odd(x) or not Odd(y) and not Odd(x) then
|
|
begin
|
|
p^.red := 0;
|
|
p^.green := 0;
|
|
p^.blue := 0;
|
|
p^.alpha := 255;
|
|
end;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure CheckeredR(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
if not Odd(y) and Odd(x) or Odd(y) and not Odd(x) then
|
|
begin
|
|
p^.red := 0;
|
|
p^.green := 0;
|
|
p^.blue := 0;
|
|
p^.alpha := 255;
|
|
end;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure BlackAndWhite(Bitmap: TBGRABitmap);
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
c: byte;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
c := (p^.red + p^.green + p^.blue) div 3;
|
|
if c >= 128 then
|
|
c := 255
|
|
else
|
|
c := 0;
|
|
p^.red := c;
|
|
p^.green := c;
|
|
p^.blue := c;
|
|
if p^.alpha > 0 then
|
|
p^.alpha := 255;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
procedure BlackAndWhite(Bitmap: TBGRABitmap; middle: byte);
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
c: byte;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
c := (p^.red + p^.green + p^.blue) div 3;
|
|
if c >= middle then
|
|
c := 255
|
|
else
|
|
c := 0;
|
|
p^.red := c;
|
|
p^.green := c;
|
|
p^.blue := c;
|
|
if p^.alpha > 0 then
|
|
p^.alpha := 255;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
procedure Movement(Bitmap: TBGRABitmap; randXmin: NativeInt = -5;
|
|
randXmax: NativeInt = 5; randYmin: NativeInt = -5; randYmax: NativeInt = 5);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
p^ := Bitmap.GetPixel(x + RandomRange(randXmin, randXmax), y +
|
|
RandomRange(randYmin, randYmax));
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure Zoomy(Bitmap: TBGRABitmap; xMy, yMy: extended);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
p^{.red} := Bitmap.GetPixel(x * xMy, y * yMy);
|
|
{p^.green := 0;
|
|
p^.blue := 0;
|
|
p^.alpha := 255;}
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure SimpleFilter(Bitmap: TBGRABitmap; Filter: TBCSimpleFilter);
|
|
begin
|
|
case Filter of
|
|
bcsGameBoyDithering: GameBoyDithering(Bitmap);
|
|
bcsBlackAndWhiteDithering: BlackAndWhiteDithering(Bitmap);
|
|
bcsInvert: Invert(Bitmap);
|
|
bcsGrayScale: GrayScale(Bitmap);
|
|
bcsGrayScaleA: GrayScaleA(Bitmap);
|
|
bcsGrayScaleBGRA: GrayScaleBGRA(Bitmap);
|
|
bcsGameBoy: GameBoy(Bitmap);
|
|
bcsNoise: Noise(Bitmap);
|
|
bcsNoiseA: NoiseA(Bitmap);
|
|
bcsNoiseBW: NoiseBW(Bitmap);
|
|
bcsNoiseBWA: NoiseBWA(Bitmap);
|
|
bcsTVScanLinesH: TVScanLinesH(Bitmap);
|
|
bcsTVScanLinesV: TVScanLinesV(Bitmap);
|
|
bcsCheckeredL: CheckeredL(Bitmap);
|
|
bcsCheckeredR: CheckeredR(Bitmap);
|
|
bcsBlackAndWhite: BlackAndWhite(Bitmap);
|
|
bcsInstagram1: Instagram1(Bitmap);
|
|
bcsInstagram2: Instagram2(Bitmap);
|
|
bcsInstagram3: Instagram3(Bitmap);
|
|
bcsInstagram4: Instagram4(Bitmap);
|
|
bcsInstagram5: Instagram5(Bitmap);
|
|
bcsInstagram6: Instagram6(Bitmap);
|
|
bcsPhotoNoise: PhotoNoise(Bitmap);
|
|
bcsPolaroid: Polaroid(Bitmap);
|
|
bcsMovement: Movement(Bitmap);
|
|
bcsRBG: RBG(Bitmap);
|
|
bcsGRB: GRB(Bitmap);
|
|
bcsGBR: GBR(Bitmap);
|
|
bcsBRG: BRG(Bitmap);
|
|
bcsBGR: BGR(Bitmap);
|
|
bcsRRG: RRG(Bitmap);
|
|
bcsRGR: RGR(Bitmap);
|
|
bcsGRR: GRR(Bitmap);
|
|
bcsRRB: RRB(Bitmap);
|
|
bcsRBR: RBR(Bitmap);
|
|
bcsBRR: BRR(Bitmap);
|
|
bcsGGR: GGR(Bitmap);
|
|
bcsGRG: GRG(Bitmap);
|
|
bcsRGG: RGG(Bitmap);
|
|
bcsGGB: GGB(Bitmap);
|
|
bcsGBG: GBG(Bitmap);
|
|
bcsBGG: BGG(Bitmap);
|
|
bcsBBR: BBR(Bitmap);
|
|
bcsBRB: BRB(Bitmap);
|
|
bcsRBB: RBB(Bitmap);
|
|
bcsBBG: BBG(Bitmap);
|
|
bcsBGB: BGB(Bitmap);
|
|
bcsGBB: GBB(Bitmap);
|
|
bcsRRR: RRR(Bitmap);
|
|
bcsGGG: GGG(Bitmap);
|
|
bcsBBB: BBB(Bitmap);
|
|
end;
|
|
end;
|
|
|
|
procedure NoiseMax(Bitmap: TBGRABitmap; maxR, maxG, maxB, maxA: byte);
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
p^.red := Random(maxR + 1);
|
|
p^.green := Random(maxG + 1);
|
|
p^.blue := Random(maxB + 1);
|
|
p^.alpha := Random(maxA + 1);
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
procedure NoiseMax(Bitmap: TBGRABitmap; maxR, maxG, maxB, maxA: byte;
|
|
touchR, touchG, touchB, touchA: boolean);
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
if touchR then
|
|
p^.red := Random(maxR + 1);
|
|
if touchG then
|
|
p^.green := Random(maxG + 1);
|
|
if touchB then
|
|
p^.blue := Random(maxB + 1);
|
|
if touchA then
|
|
p^.alpha := Random(maxA + 1);
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
// 1
|
|
procedure Instagram1(Bitmap: TBGRABitmap);
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
p^.red := round(p^.red * 0.75);
|
|
p^.green := round(p^.red * 0.50);
|
|
p^.blue := round(p^.red * 0.25);
|
|
//p^.alpha := ;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
// 2
|
|
procedure Instagram2(Bitmap: TBGRABitmap);
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
p^.red := round(p^.red * 0.75);
|
|
p^.green := round(p^.green * 0.50);
|
|
p^.blue := round(p^.blue * 0.25);
|
|
//p^.alpha := ;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
// 3
|
|
procedure Instagram3(Bitmap: TBGRABitmap);
|
|
var
|
|
i: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
p := Bitmap.Data;
|
|
|
|
for i := Bitmap.NBPixels - 1 downto 0 do
|
|
begin
|
|
p^.red := p^.red;
|
|
p^.green := round(p^.green * 0.50);
|
|
p^.blue := round(p^.blue * 0.50);
|
|
//p^.alpha := ;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
|
|
// 4
|
|
procedure Instagram4(Bitmap: TBGRABitmap);
|
|
begin
|
|
BBB(Bitmap);
|
|
end;
|
|
|
|
// 5
|
|
procedure Instagram5(Bitmap: TBGRABitmap);
|
|
begin
|
|
GGG(Bitmap);
|
|
end;
|
|
|
|
// 6
|
|
procedure Instagram6(Bitmap: TBGRABitmap);
|
|
begin
|
|
RRR(Bitmap);
|
|
end;
|
|
|
|
procedure Polaroid(Bitmap: TBGRABitmap);
|
|
var
|
|
tmp: TBGRABitmap;
|
|
begin
|
|
tmp := TBGRABitmap.Create(Bitmap.Width, Bitmap.Height, BGRAWhite);
|
|
tmp.EraseRoundRectAntialias(
|
|
Round(Bitmap.Width * 0.05),
|
|
Round(Bitmap.Height * 0.05),
|
|
Bitmap.Width - Round(Bitmap.Width * 0.05),
|
|
Bitmap.Height - Round(Bitmap.Height * 0.05),
|
|
Round(Bitmap.Width * 0.05),
|
|
Round(Bitmap.Height * 0.05),
|
|
255, []);
|
|
Bitmap.BlendImage(0, 0, tmp, boLinearBlend);
|
|
tmp.Free;
|
|
end;
|
|
|
|
procedure PhotoNoise(Bitmap: TBGRABitmap);
|
|
var
|
|
tmp: TBGRABitmap;
|
|
begin
|
|
tmp := TBGRABitmap.Create(Bitmap.Width, Bitmap.Height);
|
|
NoiseBWA(tmp);
|
|
BGRAReplace(tmp, tmp.FilterBlurRadial(1, rbFast));
|
|
Bitmap.BlendImageOver(0, 0, tmp, boLinearBlend, 25);
|
|
tmp.Free;
|
|
end;
|
|
|
|
{Change colors}
|
|
|
|
procedure FilterRGB(Bitmap: TBGRABitmap; R, G, B: byte);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
p^.red := round(p^.red * (R / 100));
|
|
p^.green := round(p^.green * (G / 100));
|
|
p^.blue := round(p^.blue * (B / 100));
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure RBG(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
r, g, b: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
r := p^.red;
|
|
g := p^.green;
|
|
b := p^.blue;
|
|
p^.red := r;
|
|
p^.green := b;
|
|
p^.blue := g;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure GRB(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
r, g, b: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
r := p^.red;
|
|
g := p^.green;
|
|
b := p^.blue;
|
|
p^.red := g;
|
|
p^.green := r;
|
|
p^.blue := b;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure GBR(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
r, g, b: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
r := p^.red;
|
|
g := p^.green;
|
|
b := p^.blue;
|
|
p^.red := g;
|
|
p^.green := b;
|
|
p^.blue := r;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure BRG(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
r, g, b: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
r := p^.red;
|
|
g := p^.green;
|
|
b := p^.blue;
|
|
p^.red := b;
|
|
p^.green := r;
|
|
p^.blue := g;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure BGR(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
r, g, b: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
r := p^.red;
|
|
g := p^.green;
|
|
b := p^.blue;
|
|
p^.red := b;
|
|
p^.green := g;
|
|
p^.blue := r;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure RRG(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
r, g: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
r := p^.red;
|
|
g := p^.green;
|
|
p^.red := r;
|
|
p^.green := r;
|
|
p^.blue := g;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure RGR(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
r, g: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
r := p^.red;
|
|
g := p^.green;
|
|
p^.red := r;
|
|
p^.green := g;
|
|
p^.blue := r;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure GRR(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
r, g: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
r := p^.red;
|
|
g := p^.green;
|
|
p^.red := g;
|
|
p^.green := r;
|
|
p^.blue := r;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure RRB(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
r, b: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
r := p^.red;
|
|
b := p^.blue;
|
|
p^.red := r;
|
|
p^.green := r;
|
|
p^.blue := b;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure RBR(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
r, b: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
r := p^.red;
|
|
b := p^.blue;
|
|
p^.red := r;
|
|
p^.green := b;
|
|
p^.blue := r;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure BRR(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
r, b: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
r := p^.red;
|
|
b := p^.blue;
|
|
p^.red := b;
|
|
p^.green := r;
|
|
p^.blue := r;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure GGR(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
r, g: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
r := p^.red;
|
|
g := p^.green;
|
|
p^.red := g;
|
|
p^.green := g;
|
|
p^.blue := r;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure GRG(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
r, g: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
r := p^.red;
|
|
g := p^.green;
|
|
p^.red := g;
|
|
p^.green := r;
|
|
p^.blue := g;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure RGG(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
r, g: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
r := p^.red;
|
|
g := p^.green;
|
|
p^.red := r;
|
|
p^.green := g;
|
|
p^.blue := g;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure GGB(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
g, b: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
g := p^.green;
|
|
b := p^.blue;
|
|
p^.red := g;
|
|
p^.green := g;
|
|
p^.blue := b;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure GBG(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
g, b: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
g := p^.green;
|
|
b := p^.blue;
|
|
p^.red := g;
|
|
p^.green := b;
|
|
p^.blue := g;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure BGG(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
g, b: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
g := p^.green;
|
|
b := p^.blue;
|
|
p^.red := b;
|
|
p^.green := g;
|
|
p^.blue := g;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure BBR(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
r, b: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
r := p^.red;
|
|
b := p^.blue;
|
|
p^.red := b;
|
|
p^.green := b;
|
|
p^.blue := r;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure BRB(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
r, b: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
r := p^.red;
|
|
b := p^.blue;
|
|
p^.red := b;
|
|
p^.green := r;
|
|
p^.blue := b;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure RBB(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
r, b: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
r := p^.red;
|
|
b := p^.blue;
|
|
p^.red := r;
|
|
p^.green := b;
|
|
p^.blue := b;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure BBG(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
g, b: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
g := p^.green;
|
|
b := p^.blue;
|
|
p^.red := b;
|
|
p^.green := b;
|
|
p^.blue := g;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure BGB(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
g, b: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
g := p^.green;
|
|
b := p^.blue;
|
|
p^.red := b;
|
|
p^.green := g;
|
|
p^.blue := b;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure GBB(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
g, b: byte;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
g := p^.green;
|
|
b := p^.blue;
|
|
p^.red := g;
|
|
p^.green := b;
|
|
p^.blue := b;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure RRR(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
p^.green := p^.red;
|
|
p^.blue := p^.red;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure GGG(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
p^.red := p^.green;
|
|
p^.blue := p^.green;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
procedure BBB(Bitmap: TBGRABitmap);
|
|
var
|
|
x, y: integer;
|
|
p: PBGRAPixel;
|
|
begin
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
begin
|
|
p := Bitmap.Scanline[y];
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
begin
|
|
p^.red := p^.blue;
|
|
p^.green := p^.blue;
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Bitmap.InvalidateBitmap;
|
|
end;
|
|
|
|
end.
|