Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Вниз

Функция 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 вся ветка

Форум: "Media";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.035 c
6-1090423280
AlexeyM
2004-07-21 19:21
2004.09.26
ras api


3-1093511772
Misha Uskov
2004-08-26 13:16
2004.09.26
Ресурсоемкая задача.


1-1094741585
kand
2004-09-09 18:53
2004.09.26
Как проверить, есть ли в определенной папке файл?


1-1093345645
MetalFan
2004-08-24 15:07
2004.09.26
как запретить копирование...


14-1094812557
savva
2004-09-10 14:35
2004.09.26
Нужна помощь от людей, планирующих поездку в Германию...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский