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

📄 aicinvdct.pas

📁 很好的源代码
💻 PAS
字号:
unit AICInvDCT;
{ Advanced Image Coding (AIC)
  ===========================
  Inverse 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 DequantizeAndInverseDCT(var B: TAICIntBlock; const Quant: TAICQuantTable);
{ Performs an Inverse Discrete Cosine Transform on the coefficients in B and
  dequantizes these values with the given quantisation matrix }

implementation

procedure DequantizeAndInverseDCT(var B: TAICIntBlock; const Quant: TAICQuantTable);
var
  T0, T1, T2, T3, T4, T5, T6, T7, T10, T11, T12, T13: Double;
  Z5, Z10, Z11, Z12, Z13, DC: Double;
  I: Integer;
  T: TAICFloatBlock;
begin
  // Columns
  for I := 0 to 7 do begin
    if (B[1*8+I] = 0) and (B[2*8+I] = 0) and (B[3*8+I] = 0) and (B[4*8+I] = 0) and
       (B[5*8+I] = 0) and (B[6*8+I] = 0) and (B[7*8+I] = 0) then begin
      DC := B[0*8+I] * Quant[0*8+I];
      T[0*8+I] := DC;
      T[1*8+I] := DC;
      T[2*8+I] := DC;
      T[3*8+I] := DC;
      T[4*8+I] := DC;
      T[5*8+I] := DC;
      T[6*8+I] := DC;
      T[7*8+I] := DC;
    end else begin
      T0 := B[0*8+I] * Quant[0*8+I];
      T1 := B[2*8+I] * Quant[2*8+I];
      T2 := B[4*8+I] * Quant[4*8+I];
      T3 := B[6*8+I] * Quant[6*8+I];

      T10 := T0 + T2;
      T11 := T0 - T2;

      T13 := T1 + T3;
      T12 := (T1 - T3) * 1.414213562 - T13;

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

      T4 := B[1*8+I] * Quant[1*8+I];
      T5 := B[3*8+I] * Quant[3*8+I];
      T6 := B[5*8+I] * Quant[5*8+I];
      T7 := B[7*8+I] * Quant[7*8+I];

      Z13 := T6 + T5;
      Z10 := T6 - T5;
      Z11 := T4 + T7;
      Z12 := T4 - T7;

      T7 := Z11 + Z13;
      T11 := (Z11 - Z13) * 1.414213562;

      Z5 := (Z10 + Z12) * 1.847759065;
      T10 := (1.082392200 * Z12) - Z5;
      T12 := (-2.613125930 * Z10) + Z5;

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

      T[0*8+I] := T0 + T7;
      T[7*8+I] := T0 - T7;
      T[1*8+I] := T1 + T6;
      T[6*8+I] := T1 - T6;
      T[2*8+I] := T2 + T5;
      T[5*8+I] := T2 - T5;
      T[4*8+I] := T3 + T4;
      T[3*8+I] := T3 - T4;
    end;
  end;

  // Columns
  I := 0;
  while I < 64 do begin
    T0 := T[I+0];
    T1 := T[I+2];
    T2 := T[I+4];
    T3 := T[I+6];

    T10 := T0 + T2;
    T11 := T0 - T2;

    T13 := T1 + T3;
    T12 := (T1 - T3) * 1.414213562 - T13;

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

    T4 := T[I+1];
    T5 := T[I+3];
    T6 := T[I+5];
    T7 := T[I+7];

    Z13 := T6 + T5;
    Z10 := T6 - T5;
    Z11 := T4 + T7;
    Z12 := T4 - T7;

    T7 := Z11 + Z13;
    T11 := (Z11 - Z13) * 1.414213562;

    Z5 := (Z10 + Z12) * 1.847759065;
    T10 := (1.082392200 * Z12) - Z5;
    T12 := (-2.613125930 * Z10) + Z5;

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

    B[I+0] := Trunc((T0 + T7) * 0.125);
    B[I+7] := Trunc((T0 - T7) * 0.125);
    B[I+1] := Trunc((T1 + T6) * 0.125);
    B[I+6] := Trunc((T1 - T6) * 0.125);
    B[I+2] := Trunc((T2 + T5) * 0.125);
    B[I+5] := Trunc((T2 - T5) * 0.125);
    B[I+4] := Trunc((T3 + T4) * 0.125);
    B[I+3] := Trunc((T3 - T4) * 0.125);

    Inc(I,8);
  end;
end;

end.

⌨️ 快捷键说明

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