-
Нужна функция окрашивающая битмап в определенный цвет с настраиваемой интенсивностью от 0 до 255. Находил доки, но так и не понял как делать.
-
ап
-
TCanvas.FillRect а перед этим задать Brush.Color. А вот как именно - зависит от расшифровки фразы "определенный цвет с настраиваемой интенсивностью от 0 до 255." Один из вариантов: Color := RGB(100, 0, 0)
-
> MBo © (17.09.12 08:39) [2]
он про то, чтобы битмап сделать аналогичным grayscale, но вместо белого там будет другой цвет. Ну и с градацией такого преобразования
-
> antonn © (17.09.12 12:14) [3] > > > > MBo © (17.09.12 08:39) [2] > > он про то, чтобы битмап сделать аналогичным grayscale, но > вместо белого там будет другой цвет. Ну и с градацией такого > преобразования
В точку. :)
-
чет никто не пишет :) procedure bitmap_colorize(_B_in:Tbitmap; per:integer; color:Tcolor);
const
MaxPixelCountA = MaxInt div SizeOf(TRGBQuad);
type
PRGBAArray = ^TRGBAArray;
TRGBAArray = array[0..MaxPixelCountA-1] of TRGBQuad;
var x, y: Integer; _r,_b,_g:integer;
w_in,h_in,w_out,h_out,tmp: Integer;
RowIn:PRGBAArray;
_d:double;
r,g,b:byte;
begin
w_in:=_B_in.Width;
h_in:=_B_in.Height;
r:=GetRValue(color);
g:=GetGValue(color);
b:=GetBValue(color);
for y:=0 to _B_in.Height-1 do begin
RowIn:= _B_in.ScanLine[y];
for x:=0 to _B_in.Width-1 do begin
_d:=per/100;
_r:= round( (RowIn[x].rgbRed*r/255)*(_d) + (RowIn[x].rgbRed)*(1-_d) );
if _r>255 then _r:=255 else if _r<0 then _r:=0;
_g:= round( (RowIn[x].rgbGreen*g/255)*(_d) + (RowIn[x].rgbGreen)*(1-_d) );
if _g>255 then _g:=255 else if _g<0 then _g:=0;
_b:= round( (RowIn[x].rgbBlue*b/255)*(_d) + (RowIn[x].rgbBlue)*(1-_d) );
if _b>255 then _b:=255 else if _b<0 then _b:=0;
RowIn[x].rgbRed:=_r;
RowIn[x].rgbGreen:=_g;
RowIn[x].rgbBlue:=_b;
end; end;
end;
-
> antonn © (04.10.12 23:25) [5] > > чет никто не пишет :)
Чего ждал? :)
-
> antonn © (04.10.12 23:25) [5]
Самое место для табличной оптимизации.
-
> Джобер (08.10.12 22:10) [7] > > > antonn © (04.10.12 23:25) [5] > > Самое место для табличной оптимизации. >
А что там оптимизировать таблицами?
-
> что там оптимизировать таблицами?Как-то так: procedure bitmap_colorize(_B_in:Tbitmap; per:integer; color:Tcolor);
const
MaxPixelCountA = MaxInt div SizeOf(TRGBQuad);
type
PRGBAArray = ^TRGBAArray;
TRGBAArray = array[0..MaxPixelCountA-1] of TRGBQuad;
function GetY(x: integer; comp: extended): byte;
begin
x := round(x*comp);
if x > 255 then Result := 255
else if x < 0 then Result := 0
else Result := x;
end;
var x, y: Integer;
RowIn: PRGBAArray;
r, g, b: extended;
tr, tg, tb: array[byte] of byte;
begin
r := (GetRValue(color)/255 - 1) * per/100 + 1;
g := (GetGValue(color)/255 - 1) * per/100 + 1;
b := (GetBValue(color)/255 - 1) * per/100 + 1;
for x := low(byte) to high(byte) do
begin
tr[x] := GetY(x, r);
tg[x] := GetY(x, g);
tb[x] := GetY(x, b);
end;
for y:=0 to _B_in.Height-1 do begin
RowIn:= _B_in.ScanLine[y];
for x:=0 to _B_in.Width-1 do begin
with RowIn[x] do begin
rgbBlue := tb[rgbBlue];
rgbGreen := tg[rgbGreen];
rgbRed := tr[rgbRed];
end;
end;
end;
end;
|