Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обратная функцыя к RGB() существует? [Delphi, Windows]


Страницы:   1 2

lubass ©   (2007-10-22 20:25:00) 

Как мне достать значения цветов (красного, зеленого и синего) из цвета?


homm   (2007-10-23 19:19:00) [21]

> [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];
      //Line[j] := GetBValue(Pix) + (GetGValue(Pix) shl 8) + (GetRValue(Pix) shl 16);    // 1200 mSec
      //Line[j] := byte(Pix shr 16) + (byte(Pix shr 8) shl 8) + (byte(Pix) shl 16);    // 300 mSec
      //Line[j] :=  TRGBQuad(Pix).rgbRed + (TRGBQuad(Pix).rgbGreen shl 8) + (TRGBQuad(Pix).rgbBlue shl 16);  //650 mSec
      TRGBQuad(Line[j]).rgbBlue := TRGBQuad(Pix).rgbRed;        // 610 mSec
      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;


@!!ex   (2007-10-23 18:03:00) [22]

> [7] rts111 ©   (23.10.07 12:37)

Ну хотя бы потому, что придется приведение типов использовать при переходе TColor<->TColor4b.
а так... конечно лучший вариант. С ним лично я и работаю. Только не с WinAPI, а с OpenGL, там так удобнее.


rts111   (2007-10-23 14:35:00) [23]


> antonn ©   (23.10.07 13:42) [8]
>
> > А чем тебе мой вариант не нравится, там бообще обращение
>
> > напрямую к значению без shr.
>
> без shr написано, или без shr откомпилируется?


Именно без shr откомпилируется.


antonn   (2007-10-23 13:42:00) [24]


> А чем тебе мой вариант не нравится, там бообще обращение
> напрямую к значению без shr.

без shr написано, или без shr откомпилируется?


rts111   (2007-10-23 12:37:00) [25]


> @!!ex ©   (23.10.07 11:40) [6]


А чем тебе мой вариант не нравится, там бообще обращение напрямую к значению без shr.

Правка:
TColor4b = record
r,g,b,a :byte;
end;


@!!ex   (2007-10-23 11:40:00) [26]

> [3] lubass ©   (22.10.07 20:38)

варианты [1] и [2] - идеентичны. Но я бы предпочел первый, поскольку нет лишнего вызова процедур.


rts111   (2007-10-22 23:21:00) [27]

type

TColor4b = record
 r,g,b,a :byte;

...

var
color: TColor;
r: byte;
...

begin

...
r := TColor4b (color).r;
...

end;


antonn   (2007-10-22 20:40:00) [28]

дежавю? :)


lubass   (2007-10-22 20:38:00) [29]

Спосибо


homm   (2007-10-22 20:32:00) [30]

var
 r,g,b: byte;
 color: TColor;
begin
 r := byte(color);
 g := byte(color shr 8);
 b := byte(color shr 16);
end;


Pa5ha   (2007-10-22 20:32:00) [31]

function GetRValue(color: tcolor): byte;
и т.д.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо