📄 aicfwdcolorconversion.pas
字号:
unit AICFwdColorConversion;
{ Advanced Image Coding (AIC)
===========================
RGB to YCbCr color conversion.
Parts of the code in this unit are based on the IJG JPEG reference software.
See JPEG.txt for license details. }
interface
uses
AICCommon, Graphics;
procedure ConvertBitmapToGreyscaleChannel(const Bitmap: TBitmap;
var Channel: TAICChannel; const Width, Height: Integer);
{ Converts greyscale bitmap Bitmap to a luminance channel }
procedure ConvertBitmapToYCbCrChannels(const Bitmap: TBitmap;
var Channels: TAICChannels; const Width, Height: Integer);
{ Converts the true color RGB bitmap Bitmap to Y, Cb and Cr channels }
implementation
const
ScaleBits = 16;
OneHalf = 1 shl (ScaleBits - 1);
CbCrOffset = 128 shl ScaleBits;
RYOffset = 0 * 256;
GYOffset = 1 * 256;
BYOffset = 2 * 256;
RCbOffset = 3 * 256;
GCbOffset = 4 * 256;
BCbOffset = 5 * 256;
RCrOffset = BCbOffset;
GCrOffset = 6 * 256;
BCrOffset = 7 * 256;
TableSize = 8 * 256;
var
RGBYCbCrTab: array [0..TableSize - 1] of Integer;
function Fix(const Value: Double): Integer;
begin
Result := Trunc((Value * (1 shl ScaleBits)) + 0.5);
end;
procedure InitTables;
var
I: Integer;
begin
for I := 0 to 255 do begin
RGBYCbCrTab[I + RYOffset] := Fix(0.29900) * I;
RGBYCbCrTab[I + GYOffset] := Fix(0.58700) * I;
RGBYCbCrTab[I + BYOffset] := Fix(0.11400) * I + OneHalf;
RGBYCbCrTab[I + RCbOffset] := (-Fix(0.16874)) * I;
RGBYCbCrTab[I + GCbOffset] := (-Fix(0.33126)) * I;
RGBYCbCrTab[I + BCbOffset] := Fix(0.50000) * I + CbCrOffset + OneHalf - 1;
RGBYCbCrTab[I + GCrOffset] := (-Fix(0.41869)) * I;
RGBYCbCrTab[I + BCrOffset] := (-Fix(0.08131)) * I;
end;
end;
procedure ConvertBitmapToGreyscaleChannel(const Bitmap: TBitmap;
var Channel: TAICChannel; const Width, Height: Integer);
var
Y: Integer;
begin
for Y := 0 to Height - 1 do
Move(Bitmap.Scanline[Y]^,Channel[Y,0],Width);
end;
procedure ConvertBitmapToYCbCrChannels(const Bitmap: TBitmap;
var Channels: TAICChannels; const Width, Height: Integer);
{ Y = 0.299R + 0.587G + 0.114B
Cb = 0.564(B - Y) = -0.169R - 0.331G + 0.5B
Cr = 0.713(R - Y) = 0.5R - 0.419G - 0.081B }
var
X, Y, R, G, B: Integer;
BGR: PAICBGR;
begin
for Y := 0 to Height - 1 do begin
BGR := Bitmap.ScanLine[Y];
for X := 0 to Width - 1 do begin
R := BGR.R;
G := BGR.G;
B := BGR.B;
Channels[ctY,Y,X] := (RGBYCbCrTab[R + RYOffset] +
RGBYCbCrTab[G + GYOffset] +
RGBYCbCrTab[B + BYOffset]) shr ScaleBits;
Channels[ctCb,Y,X] := (RGBYCbCrTab[R + RCbOffset] +
RGBYCbCrTab[G + GCbOffset] +
RGBYCbCrTab[B + BCbOffset]) shr ScaleBits;
Channels[ctCr,Y,X] := (RGBYCbCrTab[R + RCrOffset] +
RGBYCbCrTab[G + GCrOffset] +
RGBYCbCrTab[B + BCrOffset]) shr ScaleBits;
Inc(BGR);
end;
end;
end;
initialization
InitTables;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -