Delphi에서 TColor에서 R, G, B 바이트 값 추출하기

2024-07-27

Delphi에서 TColor에서 R, G, B 바이트 값 추출하기

비트 연산 사용

TColor 값은 32비트 값으로, 각각 8비트씩 R, G, B, 알파 채널을 나타냅니다. 비트 연산을 사용하여 각 채널의 값을 추출할 수 있습니다.

var
  Color: TColor;
  R, G, B: Byte;

begin
  Color := clRed;

  // R 값 추출
  R := (Color shr 24) and $FF;

  // G 값 추출
  G := (Color shr 16) and $FF;

  // B 값 추출
  B := (Color shr 8) and $FF;
end;

TColorToRGB 함수 사용

Delphi에는 TColor 값을 R, G, B 값으로 변환하는 TColorToRGB 함수가 제공됩니다.

var
  Color: TColor;
  R, G, B: Byte;

begin
  Color := clRed;

  TColorToRGB(Color, R, G, B);
end;

TRgbColor 구조체 사용

Delphi에는 R, G, B 값을 나타내는 TRgbColor 구조체가 제공됩니다. TColor 값을 TRgbColor 구조체로 변환하여 각 채널의 값에 접근할 수 있습니다.

var
  Color: TColor;
  RgbColor: TRgbColor;

begin
  Color := clRed;

  RgbColor := TColorToRgbColor(Color);

  R := RgbColor.R;
  G := RgbColor.G;
  B := RgbColor.B;
end;

GetRValue, GetGValue, GetBValue 함수 사용

Delphi에는 GetRValue, GetGValue, GetBValue 함수가 제공되어 TColor 값에서 각 채널의 값을 직접 추출할 수 있습니다.

var
  Color: TColor;
  R, G, B: Byte;

begin
  Color := clRed;

  R := GetRValue(Color);
  G := GetGValue(Color);
  B := GetBValue(Color);
end;

위 방법 중 원하는 방법을 선택하여 사용하면 됩니다. 각 방법은 장단점이 있으며, 특정 상황에 따라 적합한 방법이 다를 수 있습니다.




예제 코드

program ExtractRGB;

uses
  System.SysUtils;

var
  Color: TColor;
  R, G, B: Byte;

begin
  // 비트 연산 사용
  Color := clRed;

  // R 값 추출
  R := (Color shr 24) and $FF;

  // G 값 추출
  G := (Color shr 16) and $FF;

  // B 값 추출
  B := (Color shr 8) and $FF;

  Writeln('R: ', R);
  Writeln('G: ', G);
  Writeln('B: ', B);

  // TColorToRGB 함수 사용
  Color := clGreen;

  TColorToRGB(Color, R, G, B);

  Writeln('R: ', R);
  Writeln('G: ', G);
  Writeln('B: ', B);

  // TRgbColor 구조체 사용
  Color := clBlue;

  RgbColor := TColorToRgbColor(Color);

  R := RgbColor.R;
  G := RgbColor.G;
  B := RgbColor.B;

  Writeln('R: ', R);
  Writeln('G: ', G);
  Writeln('B: ', B);

  // GetRValue, GetGValue, GetBValue 함수 사용
  Color := clYellow;

  R := GetRValue(Color);
  G := GetGValue(Color);
  B := GetBValue(Color);

  Writeln('R: ', R);
  Writeln('G: ', G);
  Writeln('B: ', B);
end.

이 코드를 실행하면 다음과 같은 결과가 출력됩니다.

R: 255
G: 0
B: 0

R: 0
G: 255
B: 0

R: 0
G: 0
B: 255

R: 255
G: 255
B: 0



대체 방법

확장 메서드 사용

Delphi 확장 메서드를 사용하여 TColor 값에 R, G, B 값을 추출하는 메서드를 추가할 수 있습니다.

unit Unit1;

interface

uses
  Winapi.Windows,
  System.SysUtils;

type
  TColorEx = class(TColor)
  public
    function GetR: Byte;
    function GetG: Byte;
    function GetB: Byte;
  end;

implementation

function TColorEx.GetR: Byte;
begin
  Result := (Self shr 24) and $FF;
end;

function TColorEx.GetG: Byte;
begin
  Result := (Self shr 16) and $FF;
end;

function TColorEx.GetB: Byte;
begin
  Result := (Self shr 8) and $FF;
end;

end.

위 코드를 사용하면 다음과 같이 TColor 값의 R, G, B 값을 추출할 수 있습니다.

var
  Color: TColorEx;

begin
  Color := clRed;

  Writeln('R: ', Color.GetR);
  Writeln('G: ', Color.GetG);
  Writeln('B: ', Color.GetB);
end;

레코드 사용

R, G, B 값을 저장할 레코드를 만들고 TColor 값을 변환하여 사용할 수 있습니다.

type
  TRgb = record
    R: Byte;
    G: Byte;
    B: Byte;
  end;

var
  Color: TColor;
  Rgb: TRgb;

begin
  Color := clRed;

  Rgb := TColorToRgb(Color);

  Writeln('R: ', Rgb.R);
  Writeln('G: ', Rgb.G);
  Writeln('B: ', Rgb.B);
end;

API 함수 사용

Windows API 함수를 사용하여 TColor 값을 RGB 값으로 변환할 수 있습니다.

var
  Color: TColor;
  Rgb: TRgb;

begin
  Color := clRed;

  Rgb := RGB(GetRValue(Color), GetGValue(Color), GetBValue(Color));

  Writeln('R: ', Rgb.R);
  Writeln('G: ', Rgb.G);
  Writeln('B: ', Rgb.B);
end;

delphi

delphi