Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.26;
Скачать: CL | DM;

Вниз

Функция Colorize для иконок.   Найти похожие ветки 

 
Tahion2   (2004-07-04 11:07) [0]

Мне нужно сделать функцию 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;


 
X-Disa   (2004-07-04 12:42) [1]

А почему бы не сконвертить иконку в битмап, пропустить через эту процедурку, и сконвертить обратно в иконку?


 
Tahion2   (2004-07-04 13:09) [2]

Теряется Альфа-канал. В этом и вся проблема. Нужно, чтоб ф-ция работала для иконок XP стиля.

P.S. Забыл вставить иллюстрацию к вопросу:
http://www.Rudnik.com.ua/XpIcon.jpg


 
Tahion2   (2004-07-04 14:53) [3]

есть еще варианты?



Страницы: 1 вся ветка

Текущий архив: 2004.09.26;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.037 c
3-1093929190
Andrey V.
2004-08-31 09:13
2004.09.26
Вопрос о DbGrid


8-1088624004
Gorilka
2004-06-30 23:33
2004.09.26
Из *.mid в *.mp3 или *.cda


14-1094564583
blackman
2004-09-07 17:43
2004.09.26
Загадка


14-1094378919
Voland
2004-09-05 14:08
2004.09.26
как отключить explorer в винХР


1-1094054066
bloodman
2004-09-01 19:54
2004.09.26
Есть ли функция для удаления 1 элемента из динамического масива?