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