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

📄 aicfwddct.pas

📁 很好的源代码
💻 PAS
字号:
unit AICFwdDCT;
{ Advanced Image Coding (AIC)
  ===========================
  Forward Discrete Cosine Transform.
  Parts of the code in this unit are based on the IJG JPEG reference software.
  See JPEG.txt for license details. }

interface

uses
  AICCommon;

procedure ForwardDCTAndQuantize(var B: TAICIntBlock; const Quant: TAICQuantTable);
{ Performs an Forward Discrete Cosine Transform on the pixel values in B and
  quantizes these values with the given quantisation matrix }

implementation

procedure ForwardDCTAndQuantize(var B: TAICIntBlock; const Quant: TAICQuantTable);
var
  T0, T1, T2, T3, T4, T5, T6, T7, T10, T11, T12, T13: Double;
  Z1, Z2, Z3, Z4, Z5, Z11, Z13: Double;
  I: Integer;
  T: TAICFloatBlock;
begin
  // Rows
  I := 0;
  while I < 64 do begin
    T0 := B[I+0] + B[I+7];
    T7 := B[I+0] - B[I+7];
    T1 := B[I+1] + B[I+6];
    T6 := B[I+1] - B[I+6];
    T2 := B[I+2] + B[I+5];
    T5 := B[I+2] - B[I+5];
    T3 := B[I+3] + B[I+4];
    T4 := B[I+3] - B[I+4];

    T10 := T0 + T3;
    T13 := T0 - T3;
    T11 := T1 + T2;
    T12 := T1 - T2;

    T[I+0] := T10 + T11;
    T[I+4] := T10 - T11;

    Z1 := (T12 + T13) * 0.707106781;
    T[I+2] := T13 + Z1;
    T[I+6] := T13 - Z1;

    T10 := T4 + T5;
    T11 := T5 + T6;
    T12 := T6 + T7;

    Z5 := (T10 - T12) * 0.382683433;
    Z2 := (0.541196100 * T10) + Z5;
    Z4 := (1.306562965 * T12) + Z5;
    Z3 := T11 * 0.707106781;

    Z11 := T7 + Z3;
    Z13 := T7 - Z3;

    T[I+5] := Z13 + Z2;
    T[I+3] := Z13 - Z2;
    T[I+1] := Z11 + Z4;
    T[I+7] := Z11 - Z4;

    Inc(I,8);
  end;

  // Columns
  for I := 0 to 7 do begin
    T0 := T[0*8+I] + T[7*8+I];
    T7 := T[0*8+I] - T[7*8+I];
    T1 := T[1*8+I] + T[6*8+I];
    T6 := T[1*8+I] - T[6*8+I];
    T2 := T[2*8+I] + T[5*8+I];
    T5 := T[2*8+I] - T[5*8+I];
    T3 := T[3*8+I] + T[4*8+I];
    T4 := T[3*8+I] - T[4*8+I];

    T10 := T0 + T3;
    T13 := T0 - T3;
    T11 := T1 + T2;
    T12 := T1 - T2;

    B[0*8+I] := Trunc((T10 + T11) * Quant[0*8+I] + 16384.5) - 16384;
    B[4*8+I] := Trunc((T10 - T11) * Quant[4*8+I] + 16384.5) - 16384;

    Z1 := (T12 + T13) * 0.707106781;
    B[2*8+I] := Trunc((T13 + Z1) * Quant[2*8+I] + 16384.5) - 16384;
    B[6*8+I] := Trunc((T13 - Z1) * Quant[6*8+I] + 16384.5) - 16384;

    T10 := T4 + T5;
    T11 := T5 + T6;
    T12 := T6 + T7;

    Z5 := (T10 - T12) * 0.382683433;
    Z2 := (0.541196100 * T10) + Z5;
    Z4 := (1.306562965 * T12) + Z5;
    Z3 := T11 * 0.707106781;

    Z11 := T7 + Z3;
    Z13 := T7 - Z3;

    B[5*8+I] := Trunc((Z13 + Z2) * Quant[5*8+I] + 16384.5) - 16384;
    B[3*8+I] := Trunc((Z13 - Z2) * Quant[3*8+I] + 16384.5) - 16384;
    B[1*8+I] := Trunc((Z11 + Z4) * Quant[1*8+I] + 16384.5) - 16384;
    B[7*8+I] := Trunc((Z11 - Z4) * Quant[7*8+I] + 16384.5) - 16384;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -