-
Как мне достать значения цветов (красного, зеленого и синего) из цвета?
-
var
r,g,b: byte;
color: TColor;
begin
r := byte(color);
g := byte(color shr 8);
b := byte(color shr 16);
end;
-
function GetRValue(color: tcolor): byte; и т.д.
-
Спосибо
-
дежавю? :)
-
type
TColor4b = record r,g,b,a :byte;
...
var color: TColor; r: byte; ...
begin ... r := TColor4b (color).r; ...
end;
-
> [3] lubass © (22.10.07 20:38)
варианты [1] и [2] - идеентичны. Но я бы предпочел первый, поскольку нет лишнего вызова процедур.
-
> @!!ex © (23.10.07 11:40) [6]
А чем тебе мой вариант не нравится, там бообще обращение напрямую к значению без shr.
Правка: TColor4b = record r,g,b,a :byte; end;
-
> А чем тебе мой вариант не нравится, там бообще обращение > напрямую к значению без shr.
без shr написано, или без shr откомпилируется?
-
> antonn © (23.10.07 13:42) [8] > > > А чем тебе мой вариант не нравится, там бообще обращение > > > напрямую к значению без shr. > > без shr написано, или без shr откомпилируется?
Именно без shr откомпилируется.
-
> [7] rts111 © (23.10.07 12:37)
Ну хотя бы потому, что придется приведение типов использовать при переходе TColor<->TColor4b. а так... конечно лучший вариант. С ним лично я и работаю. Только не с WinAPI, а с OpenGL, там так удобнее.
-
> [7] rts111 © (23.10.07 12:37) > А чем тебе мой вариант не нравится, там бообще обращение > напрямую к значению без shr.
procedure SwapChanels(BMP: TBitmap);
type
ADWORD = array [0..0] of DWORD;
var
i, j: Integer;
Pix: DWORD;
Line: ^ADWORD;
begin
for i := 0 to BMP.Height-1 do begin
Line := BMP.ScanLine[i];
for j := 0 to BMP.Width-1 do begin
Pix := Line[j];
TRGBQuad(Line[j]).rgbBlue := TRGBQuad(Pix).rgbRed; TRGBQuad(Line[j]).rgbGreen := TRGBQuad(Pix).rgbGreen;
TRGBQuad(Line[j]).rgbRed := TRGBQuad(Pix).rgbBlue;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
type
ADWORD = array [0..0] of DWORD;
var
i, T: Integer;
begin
Image1.Picture.Bitmap := TBitmap.Create;
Image1.Picture.Bitmap.LoadFromFile('C:\1.bmp');
Image1.Picture.Bitmap.PixelFormat := pf32bit;
T := GetTickCount;
for i := 0 to 98 do
SwapChanels(Image1.Picture.Bitmap);
ShowMessage(IntToStr(GetTickCount-T));
end;
-
> homm © (23.10.07 19:19) [11]
procedure SwapChanels(BMP: TBitmap); type ADWORD = array [0..0] of DWORD; var i, j: Integer; //Pix: DWORD; Line: ^ADWORD; Temp: byte; begin for i := 0 to BMP.Height-1 do begin Line := BMP.ScanLine[i]; for j := 0 to BMP.Width-1 do with TRGBQuad(Line[j]) do begin Temp := rgbRed; // 1 mSec!!! :) rgbRed := rgbBlue; rgbBlue := Temp; end; end; end;
-
операции битового сдвига выполняюца за один такт процессора и этим все сказано.
-
> [12] rts111 © (23.10.07 23:24)
В таком варианте действительно пошустрее работает. procedure SwapChanels(BMP: TBitmap);
type
ADWORD = array [0..0] of DWORD;
var
i, j: Integer;
Pix: DWORD;
Line: ^ADWORD;
Temp: byte;
begin
for i := 0 to BMP.Height-1 do begin
Line := BMP.ScanLine[i];
for j := 0 to BMP.Width-1 do begin
Pix := Line[j];
with TRGBQuad(Line[j]) do begin Temp := rgbRed;
rgbRed := rgbBlue;
rgbBlue := Temp;
rgbGreen := rgbGreen;
end;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
type
ADWORD = array [0..0] of DWORD;
var
i, T: Integer;
begin
Image1.Picture.Bitmap := TBitmap.Create;
Image1.Picture.Bitmap.LoadFromFile('C:\1.bmp');
Image1.Picture.Bitmap.PixelFormat := pf32bit;
T := GetTickCount;
for i := 0 to 99 do
SwapChanels(Image1.Picture.Bitmap);
ShowMessage(IntToStr(GetTickCount-T));
end; Но твоего юмора насчет одной миллисекундны я не вкурил.
-
> homm © (24.10.07 05:52) [14]
А зачем ты rgbGreen := rgbGreen;
-
> Но твоего юмора насчет одной миллисекундны я не вкурил.
Да, глупо. Так я хотел сказать что такой способ быстрее.
-
> [15] rts111 © (24.10.07 07:44) > А зачем ты rgbGreen := rgbGreen;
А за тем, что-бы убрать оптимизацию алгоритма под задачу, и абстрагироватся от задачи как можно больше. В принципе можешь и так написать: Temp := rgbRed;
rgbRed := rgbGreen;
rgbGreen := rgbBlue;
rgbBlue := Temp; Но я думаю это еше более замедлит твой вариант.
-
> homm © (24.10.07 11:28) [17]
> Но я думаю это еше более замедлит твой вариант.
Я не понял, при чем тут ЕЩЕ БОЛЬШЕ замедлит, ведь мой вариант быстрее? Или у тебя на ПК не быстрее?
-
> homm © (24.10.07 11:28) [17]
А от задачи, никак невозможно абстрагироваться. Хочешь я приведу пример? ( только вечером, сейчас некогда )
|