⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aicfwdcolorconversion.pas

📁 很好的源代码
💻 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 + -