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

📄 lsjpeg.pas

📁 在delphi7 下开发医学图象浏览器,对医学图象进行编辑,分析的
💻 PAS
📖 第 1 页 / 共 3 页
字号:
          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 + -