📄 lsjpeg.pas
字号:
lImgRA[lInc] := lPredicted + DecodePixelDifference(1);
if lInc + 1 = lLineStart then
begin //newline
lPredicted := lImgRA[lInc + 1 - SOFxdim];
lLineStart := lLineStart + SOFxDim;
end
else
lPredicted := lImgRA[lInc - lPredA];
end;
if (lSegmentEnd + 1) < lItems then
begin
dec(lRawPos);
repeat
while (lRawRA[lRawPos] <> 255) do
inc(lRawPos);
inc(lRawPos);
until (lRawRA[lRawPos] >= $D0) and (lRawRA[lRawPos] <= $D7);
lCurrentBitPos := 0; //read in a new byte
inc(lRawPos); //abbax
end;
lSegmentEnd := lSegmentEnd + lRestartSegmentSz;
until (lRestartSegmentSz < 1) or ((lSegmentEnd - 2) > lItems);
end; //restartsegments
(**)
end
else if SOFnf = 3 then
begin //>8bit data; 8 bit follows
//LOSSLESS JPEG: 7 possible predictors - we will handle all of them
lPredB := 0;
lPredC := 0;
case SOSss of //predictors 1,2,3 examine single previous pixel, here we set the relative location
2: lPredA := SOFxDim - 3; //Rb directly above
3: lPredA := SOFxDim; //Rc UpperLeft:above and to the left
5:
begin
lPredA := 0;
lPredB := SOFxDim - 3; //Rb directly above
lPredC := SOFxDim; //Rc UpperLeft:above and to the left
end;
6:
begin
lPredB := 0;
lPredA := SOFxDim - 3; //Rb directly above
lPredC := SOFxDim; //Rc UpperLeft:above and to the left
end;
else
lPredA := 0; //Ra: directly to left
end; //case SOSss: predictor offset
lPredictedG := lPredicted;
lPredictedB := lPredicted;
lOffset := 0;
lInc := lOffset;
for lIncX := 1 to (SOFxdim div 3) do
begin //write first line
//DecodePixelDifference=RED
lImgRAz[lInc] := lPredicted + DecodePixelDifference(1);
lPredicted := lImgRAz[lInc];
inc(lInc); //writenext voxel
//DecodePixelDifference=GREEN
lImgRAz[lInc] := lPredictedG + DecodePixelDifference(2);
lPredictedG := lImgRAz[lInc];
inc(lInc); //writenext voxel
//DecodePixelDifference=BLUE
lImgRAz[lInc] := lPredictedB + DecodePixelDifference(3);
lPredictedB := lImgRAz[lInc];
inc(lInc); //writenext voxel
end; //first line: use prev voxel prediction;
if lRestartSegmentSz = 0 then
lSegmentEnd := lItems
else
lSegmentEnd := lRestartSegmentSz;
repeat
if lSegmentEnd > lItems then
lSegmentEnd := lItems;
lLineStart := (((lInc div SOFxDim) + 1) * SOFxDim) + lOffset {-1};
if lInc > (SOFxDim + 1) then
begin
lPredicted := 1 shl (SOFPrecision - 1 - SOSpttrans);
lPredictedG := lPredicted;
lPredictedB := lPredicted;
end
else
begin
lPredicted := lImgRAz[lInc - SOFxdim + lOffset];
lPredictedG := lImgRAz[1 + lInc - SOFxdim + lOffset];
lPredictedB := lImgRAz[2 + lInc - SOFxdim + lOffset];
end;
if SOSss = 4 then
begin //predictor = 4
//this is a 24-bit image, so for 512-pixel wid image, SOFxdim will be (3*512=) 1536
while lInc < (lSegmentEnd - 1) do
begin
lImgRAz[lInc] := lPredicted + DecodePixelDifference(1); //RED
inc(lInc);
lImgRAz[lInc] := lPredictedG + DecodePixelDifference(2); //GREEN
inc(lInc);
lImgRAz[lInc] := lPredictedB + DecodePixelDifference(3); //BLUE
inc(lInc);
if lInc = lLineStart then
begin //newline
lPredicted := lImgRAz[lInc - SOFxdim];
lPredictedG := lImgRAz[lInc - SOFxdim + 1];
lPredictedB := lImgRAz[lInc - SOFxdim + 2];
lLineStart := lLineStart + (SOFxDim);
end
else
begin
lPredicted := lImgRAz[lInc - 3] + lImgRAz[lInc - 3 - (SOFxDim - 3)] - lImgRAz[lInc - 3 - SOFxDim];
lPredictedG := lImgRAz[lInc - 2] + lImgRAz[lInc - 2 - (SOFxDim - 3)] - lImgRAz[lInc - 2 - SOFxDim];
lPredictedB := lImgRAz[lInc - 1] + lImgRAz[lInc - 1 - (SOFxDim - 3)] - lImgRAz[lInc - 1 - SOFxDim];
end;
end;
//xxx
end
else if (SOSss = 5) or (SOSss = 6) then
begin //predictor = 5 or 6
//this is a 24-bit image, so for 512-pixel wid image, SOFxdim will be (3*512=) 1536
while lInc < (lSegmentEnd - 1) do
begin
lImgRAz[lInc] := lPredicted + DecodePixelDifference(1); //RED
inc(lInc);
lImgRAz[lInc] := lPredictedG + DecodePixelDifference(2); //GREEN
inc(lInc);
lImgRAz[lInc] := lPredictedB + DecodePixelDifference(3); //BLUE
inc(lInc);
if lInc = lLineStart then
begin //newline
lPredicted := lImgRAz[lInc - SOFxdim];
lPredictedG := lImgRAz[lInc - SOFxdim + 1];
lPredictedB := lImgRAz[lInc - SOFxdim + 2];
lLineStart := lLineStart + (SOFxDim);
end
else
begin
lPredicted := lImgRAz[lInc - 3 - lPredA] + ((lImgRAz[lInc - 3 - lPredB] - lImgRAz[lInc - 3 - lPredC]) shr
1);
lPredictedG := lImgRAz[lInc - 2 - lPredA] + ((lImgRAz[lInc - 2 - lPredB] - lImgRAz[lInc - 2 - lPredC]) shr
1);
lPredictedB := lImgRAz[lInc - 1 - lPredA] + ((lImgRAz[lInc - 1 - lPredB] - lImgRAz[lInc - 1 - lPredC]) shr
1);
end;
end;
end
else if SOSss = 7 then
begin //predictor = 7
while lInc < (lSegmentEnd - 1) do
begin
lImgRAz[lInc] := lPredicted + DecodePixelDifference(1); //RED
inc(lInc);
lImgRAz[lInc] := lPredictedG + DecodePixelDifference(2); //GREEN
inc(lInc);
lImgRAz[lInc] := lPredictedB + DecodePixelDifference(3); //BLUE
inc(lInc);
if lInc = lLineStart then
begin //newline
lPredicted := lImgRAz[lInc - SOFxdim];
lPredictedG := lImgRAz[lInc - SOFxdim + 1];
lPredictedB := lImgRAz[lInc - SOFxdim + 2];
lLineStart := lLineStart + (SOFxDim);
end
else
begin
lPredicted := (lImgRAz[lInc - 3] + lImgRAz[lInc - 3 - (SOFxDim - 3)]) shr 1;
lPredictedG := (lImgRAz[lInc - 2] + lImgRAz[lInc - 2 - (SOFxDim - 3)]) shr 1;
lPredictedB := (lImgRAz[lInc - 1] + lImgRAz[lInc - 1 - (SOFxDim - 3)]) shr 1;
end;
end;
end
else
begin //predictor in range 1,2,3
//this is a 24-bit image, so for 512-pixel wid image, SOFxdim will be (3*512=) 1536
while lInc < (lSegmentEnd - 1) do
begin
lImgRAz[lInc] := lPredicted + DecodePixelDifference(1); //RED
inc(lInc);
lImgRAz[lInc] := lPredictedG + DecodePixelDifference(2); //GREEN
inc(lInc);
lImgRAz[lInc] := lPredictedB + DecodePixelDifference(3); //BLUE
inc(lInc);
if lInc = lLineStart then
begin //newline
lPredicted := lImgRAz[lInc - SOFxdim];
lPredictedG := lImgRAz[lInc - SOFxdim + 1];
lPredictedB := lImgRAz[lInc - SOFxdim + 2];
lLineStart := lLineStart + (SOFxDim);
end
else
begin
lPredicted := lImgRAz[lInc - 3 - lPredA];
lPredictedG := lImgRAz[lInc - 2 - lPredA];
lPredictedB := lImgRAz[lInc - 1 - lPredA];
end;
end;
end; //predictor <> 7
until (lRestartSegmentSz < 1) or ((lSegmentEnd - 2) > lItems);
// end; //8<>15data type
end
else
begin //previously 12/16/24bit data, 8 bit follows
lInc := 0;
//LOSSLESS JPEG: 7 possible predictors - we will handle all of them
lPredB := 0;
lPredC := 0;
case SOSss of //predictors 1,2,3 examine single previous pixel, here we set the relative location
2: lPredA := SOFxDim - 1; //Rb directly above
3: lPredA := SOFxDim; //Rc UpperLeft:above and to the left
5:
begin
lPredA := 0;
lPredB := SOFxDim - 1; //Rb directly above
lPredC := SOFxDim; //Rc UpperLeft:above and to the left
end;
6:
begin
lPredB := 0;
lPredA := SOFxDim - 1; //Rb directly above
lPredC := SOFxDim; //Rc UpperLeft:above and to the left
end;
else
lPredA := 0; //Ra: directly to left
end; //case SOSss: predictor offset
//lOffset := -1;
for lIncX := 1 to SOFxdim do
begin //write first line
lImgRAz[lInc] := lPredicted + DecodePixelDifference(1);
inc(lInc); //writenext voxel
lPredicted := lImgRAz[lInc - 1];
end; //first line: use prev voxel prediction;
if lRestartSegmentSz = 0 then
lSegmentEnd := lItems
else
lSegmentEnd := lRestartSegmentSz;
repeat
if lSegmentEnd > lItems then
lSegmentEnd := lItems;
lLineStart := (((lInc div SOFxDim) + 1) * SOFxDim) {-1};
if lInc > (SOFxDim + 1) then
lPredicted := 1 shl (SOFPrecision - 1 - SOSpttrans)
else
lPredicted := lImgRAz[lInc - SOFxdim];
if SOSss = 4 then
begin //predictor 4 : ABOVE+LEFT-(UPPERLEFT)
for lInc := lInc to (lSegmentEnd - 1) do
begin
lImgRAz[lInc] := lPredicted + DecodePixelDifference(1);
if lInc + 1 = lLineStart then
begin //newline
lPredicted := lImgRAz[lInc + 1 - SOFxdim];
lLineStart := lLineStart + SOFxDim;
end
else
lPredicted := lImgRAz[lInc] + lImgRAz[lInc - (SOFxDim - 1)] - lImgRAz[lInc - SOFxDim];
end;
end
else if (SOSss = 5) or (SOSss = 6) then
begin //predictor 5,6 : comparisons
for lInc := lInc to (lSegmentEnd - 1) do
begin
lImgRAz[lInc] := lPredicted + DecodePixelDifference(1);
if lInc + 1 = lLineStart then
begin //newline
lPredicted := lImgRAz[lInc + 1 - SOFxdim];
lLineStart := lLineStart + SOFxDim;
end
else
lPredicted := lImgRAz[lInc - lPredA] + ((lImgRAz[lInc - lPredB] - lImgRAz[lInc - lPredC]) shr 1);
end;
end
else if SOSss = 7 then
begin //predictor 7: average above and left
for lInc := lInc to (lSegmentEnd - 1) do
begin
lImgRAz[lInc] := lPredicted + DecodePixelDifference(1);
if lInc + 1 = lLineStart then
begin //newline
lPredicted := lImgRAz[lInc + 1 - SOFxdim];
lLineStart := lLineStart + SOFxDim;
end
else
lPredA := lImgRAz[lInc];
lPredB := lImgRAz[lInc - SOFxDim + 1]; //correct
lPredicted := (lPredA + lPredB) shr 1;
end;
end
else
begin //predictor <> 7 : assume SOSss=1: previous
for lInc := lInc to (lSegmentEnd - 1) do
begin
lImgRAz[lInc] := lPredicted + DecodePixelDifference(1);
if lInc + 1 = lLineStart then
begin //newline
lPredicted := lImgRAz[lInc + 1 - SOFxdim];
lLineStart := lLineStart + SOFxDim;
end
else
lPredicted := lImgRAz[lInc - lPredA];
end;
end; //predictor <> 7
if (lSegmentEnd + 1) < lItems then
begin
dec(lRawPos);
{showmessage('x'+inttostr(lRawPos)+' '+inttostr(lRawRA[lRawPos])+':'+
inttostr(lRawRA[lRawPos+1])+':'+inttostr(lRawRA[lRawPos+2])+':'+
inttostr(lRawRA[lRawPos+3])+':');}
repeat
while (lRawRA[lRawPos] <> 255) do
inc(lRawPos);
inc(lRawPos);
//showmessage(inttostr(lRawRA[lRawPos]));
until (lRawRA[lRawPos] >= $D0) and (lRawRA[lRawPos] <= $D7);
//lCurrentByteVal := 0; //not FF
lCurrentBitPos := 0; //read in a new byte
//showmessage('x');
inc(lRawPos); //abbax
//lCurrentBitPos := 9; //read in a new byte
end;
lSegmentEnd := lSegmentEnd + lRestartSegmentSz;
until (lRestartSegmentSz < 1) or ((lSegmentEnd - 2) > lItems);
end; //8<>15data type
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -