📄 aicfwddct.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 + -