![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Функция Colorize для иконок. [D4, WinXP]
Tahion2 © (2004-07-04 11:07:00)Мне нужно сделать функцию Colorize для иконок. Т.е. отображение иконки в оттенках определенного цвета.
Такую функцию я нашел, но она предназначена для колоризации TBitmap. Я хочу доработать ее, чтоб она работала с иконкаками.
Для этого, думаю, отделить у иконки альфа канал, колоризировать RGB канал и потом наложить его назад на альфа канал.
Собственно, как это сделать?
Код процедуры колоризации:
procedure ModColors(Bitmap: TBitmap; Color: TColor);
function GetR(const Color: TColor): Byte;
//извлечение красного
begin
Result := Lo(Color);
end;
function GetG(const Color: TColor): Byte;
//извлечение зелёного
begin
Result := Lo(Color shr 8);
end;
function GetB(const Color: TColor): Byte;
//извлечение синего
begin
Result := Lo((Color shr 8) shr 8);
end;
function BLimit(B: Integer): Byte;
begin
if B < 0 then
Result := 0
else if B > 255 then
Result := 255
else
Result := B;
end;
type
TRGB = record
B, G, R: Byte;
end;
pRGB = ^TRGB;
var
r1, g1, b1: Byte;
x, y: Integer;
Dest: pRGB;
A: Double;
begin
Bitmap.PixelFormat := pf24Bit;
r1 := Round(255 / 100 * GetR(Color));
g1 := Round(255 / 100 * GetG(Color));
b1 := Round(255 / 100 * GetB(Color));
for y := 0 to Bitmap.Height - 1 do
begin
Dest := Bitmap.ScanLine[y];
for x := 0 to Bitmap.Width - 1 do
begin
with Dest^ do
begin
A := (r + b + g) / 300;
with Dest^ do
begin
R := BLimit(Round(r1 * A));
G := BLimit(Round(g1 * A));
B := BLimit(Round(b1 * A));
end;
end;
Inc(Dest);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var Bitmap:TBitmap;
begin
Bitmap:=TBitmap.Create;
Bitmap.LoadFromFile('D:\2.bmp');
Image1.Picture.Bitmap:=Bitmap;
if ColorDialog1.Execute then
ModColors(Bitmap, ColorDialog1.Color);
Image2.Picture.Bitmap:=Bitmap;
Bitmap.SaveToFile('D:\2.bmp');
end;
Tahion2 (2004-07-04 14:53:00) [1]есть еще варианты?
Tahion2 (2004-07-04 13:09:00) [2]Теряется Альфа-канал. В этом и вся проблема. Нужно, чтоб ф-ция работала для иконок XP стиля.
P.S. Забыл вставить иллюстрацию к вопросу:
http://www.Rudnik.com.ua/XpIcon.jpg
X-Disa (2004-07-04 12:42:00) [3]А почему бы не сконвертить иконку в битмап, пропустить через эту процедурку, и сконвертить обратно в иконку?