📄 lsjpeg.pas
字号:
end; //SOSss predictor
end; //for lIncY
end {RestartSegmentSz = 0} else begin {restartsegment}
if SOSss > 3 then
showmessage('Unusual 16-bit lossless JPEG with restart segments. Please contact the author:'+inttostr(SOSss));
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 := lImgRA[lInc-SOFxdim];
for lInc := lInc to (lSegmentEnd-1) do begin
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 + -