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

📄 lsjpeg.pas

📁 用Delphi做的读取医学图片的控件及代码
💻 PAS
📖 第 1 页 / 共 3 页
字号:
                 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 + -