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

📄 analyze.pas

📁 在delphi7 下开发医学图象浏览器,对医学图象进行编辑,分析的
💻 PAS
📖 第 1 页 / 共 2 页
字号:


function ParseFileName (lFilewExt:String): string;
var
   lLen,lInc: integer;
   lName: String;
begin
	lName := '';
     lLen := length(lFilewExt);
	lInc := lLen+1;
     if  lLen > 0 then
	   repeat
              dec(lInc);
        until (lFileWExt[lInc] = '.') or (lInc = 1);
     if lInc > 1 then
        for lLen := 1 to (lInc - 1) do
            lName := lName + lFileWExt[lLen]
     else
         lName := lFilewExt; //no extension
        ParseFileName := lName;
end;
function FSize (lFName: String): longint;
var SearchRec: TSearchRec;
begin
  FSize := 0;
  if not FileExists(lFName) then exit;
  FindFirst(lFName, faAnyFile, SearchRec);
  FSize := SearchRec.size;
  FindClose(SearchRec);
end;

function OpenAnalyze (var lHdrOK,lImgOK  : boolean; var lDynStr,lFileName: string; var lDicomData: DicomData): boolean;
var
  F: file;
  lFSz: LongInt;
  lHdrSz : Longint;
  gAHdr : AHdr;
begin
     result := false;
     lImgOK := false;
     lHdrOK:= false;
     lDynStr := '';
     lDICOMdata.RunLengthEncoding := false;
     lDICOMdata.JPEGlosslessCpt := false;
     lDICOMdata.JPEGlossyCpt := false;
     lDICOMdata.PlanarConfig:= 1; //only used in RGB values
     lDICOMdata.GenesisCpt := false;
     lDICOMdata.GenesisPackHdr := 0;
     lDICOMdata.SamplesPerPixel := 1;
     lDICOMdata.WindowCenter := 0;
     lDICOMdata.WindowWidth := 0;
     lDICOMdata.monochrome := 2; {most common}
     lDICOMdata.XYZmm[1] := 1;
     lDICOMdata.XYZmm[2] := 1;
     lDICOMdata.XYZmm[3] := 1;
     lDICOMdata.XYZdim[1] := 1;
     lDICOMdata.XYZdim[2] := 1;
     lDICOMdata.XYZdim[3] := 1;
     lDICOMdata.ImageStart := 0;
     lDICOMdata.Little_Endian := 1;
     if not FileExists(lFileName) then exit;
     lFSz := FSize(lFileName);
     if (lFSz) <> sizeof(gAHdr) then begin
        {CloseFile(F);}
        ShowMessage('This header file is the wrong size to be in Analyze format.'+
        ' Required: '+inttostr(sizeof(gAHdr))+'  Selected:'+inttostr(lFSz));
        exit;
     end;
     AssignFile(F, lFileName);
     FileMode := 0;  { Set file access to read only }
     Reset(F, 1);
     {$I+}
     if ioresult <> 0 then
        ShowMessage('Potential error in reading Analyze header.'+inttostr(IOResult));
     BlockRead(F, gAHdr{Buffer^}, lFSz);
     CloseFile(F);
     if (IOResult <> 0) then exit;
     FileMode := 2;
      lHdrSz := gAHdr.HdrSz;
      Swap4(lHdrSz);
      if gAHdr.HdrSz = sizeof(gAHdr) then begin
         lDicomData.little_endian := 1;
      end else if SizeOf(gAHdr) = lHdrSz then begin
         lDicomData.little_endian := 0;
             SwapBytes (gAHdr);
      end else begin
              ShowMessage('This software can not read this header file.'+
               'The header file is not in Analyze format.');
              CloseFile(F);
              exit;
      end;
      result := true;
      lImgOK := true;
      lHdrOK := true;
      lDICOMdata.XYZdim[1]  :=gAHdr.Dim[1];
      lDICOMdata.XYZdim[2] := gAHdr.Dim[2];
      lDICOMdata.XYZdim[3] := gAHdr.Dim[3];
      lDicomData.IntenScale := gAHdr.roi_scale;
      lDICOMdata.XYZmm[1] := gAHdr.pixdim[2];
      lDICOMdata.XYZmm[2] := gAHdr.pixdim[3];
      lDICOMdata.XYZmm[3] := gAHdr.pixdim[4];{}
      lDynStr := 'Analyze format'+kCR+'XYZ dim:' +inttostr(lDicomData.XYZdim[1])+'/'
      +inttostr(lDicomData.XYZdim[2])+'/'+inttostr(lDicomData.XYZdim[3])
      +kCR+'XYZ mm:'+floattostrf(lDicomData.XYZmm[1],ffFixed,8,2)+'/'
       +floattostrf(lDicomData.XYZmm[2],ffFixed,8,2)+'/'+floattostrf(lDicomData.XYZmm[3],ffFixed,8,2)+
       kCR+'Bits per pixel: '+ inttostr(gAHdr.bitpix);
      lDicomData.Allocbits_per_pixel := gAHdr.bitpix;
      lDicomData.Storedbits_per_pixel := gAHdr.bitpix;
      if gAHdr.bitpix = 24 then begin
               lDicomData.Allocbits_per_pixel := 8;
               lDicomData.Storedbits_per_pixel := 8;
               lDicomData.SamplesPerPixel := 3;
               lDicomData.PlanarConfig := 0;
      end else if gAHdr.bitpix = 32  then begin
         lImgOK := false;
         showmessage('This software can not read 32-bit Analyze images.');
         //would need a buffer for 32-bit images... changes to displayimage near 12: begin
         if gAHdr.Datatype >= 16 then begin
            lDICOMdata.Float := true;
            lDynStr := lDynStr+kCR+'Floating point data';
         end;
         lDicomData.Allocbits_per_pixel := 32;
         lDicomData.Storedbits_per_pixel := 32;
      end else if gAHdr.bitpix = 64  then begin
         lImgOK := false;
         showmessage('This software can not read 64-bit Analyze images.');
      end;

      lDICOMdata.ImageStart := round(gAHdr.vox_offset);
      lFileName :=ExtractFilePath(lFileName)+ParseFileName(ExtractFileName(lFileName))+'.img';
      (*if not fileexists(lFilename) then begin
         lImgOK := false;
         Showmessage('Unable to find the Analyze image named '+lFilename);
          exit;
      end;*)
end;

procedure ClearHdr (var lHdr: AHdr);
var lInc: byte;
begin
    with lHdr do begin
         {set to 0}
         HdrSz := sizeof(AHdr);
         for lInc := 1 to 10 do
             Data_Type[lInc] := chr(0);
         for lInc := 1 to 18 do
             db_name[lInc] := chr(0);
         extents:=0;                            (* 32 + 4    *)
         session_error:= 0;                (* 36 + 2    *)
         regular:='r'{chr(0)};                           (* 38 + 1    *)
         hkey_un0:=chr(0);
         dim[0] := 4;                          (* 39 + 1    *)
         for lInc := 1 to 7 do
             dim[lInc] := 0;                       (* 0 + 16    *)
         for lInc := 1 to 4 do
             vox_units[lInc] := chr(0);                      (* 16 + 4    *)
         for lInc := 1 to 4 do
             cal_units[lInc] := chr(0);                      (* 20 + 4    *)
         unused1:=0;                      (* 24 + 2    *)
         datatype:=0 ;                     (* 30 + 2    *)
         bitpix:=0;                       (* 32 + 2    *)
         dim_un0:=0;                      (* 34 + 2    *)
         for lInc := 1 to 4 do
             pixdim[linc]:= 2.0;                        (* 36 + 32   *)
         vox_offset:= 0.0;
         roi_scale:= 0.00392157{1.1};
         funused1:= 0.0;                         (* 76 + 4    *)
         funused2:= 0.0;                         (* 80 + 4    *)
         cal_max:= 0.0;                          (* 84 + 4    *)
         cal_min:= 0.0;                          (* 88 + 4    *)
         compressed:=0;                         (* 92 + 4    *)
         verified:= 0;                           (* 96 + 4    *)
         glmax:= 0;
         glmin:= 0;                       (* 100 + 8   *)
         for lInc := 1 to 80 do
             lHdr.descrip[lInc] := chr(0);{80 spaces}
         for lInc := 1 to 24 do
             lHdr.aux_file[lInc] := chr(0);{80 spaces}
         orient:= chr(0);                            (* 104 + 1   *)
         (*originator: array [1..10] of char;                   (* 105 + 10  *)
         for lInc := 1 to 5 do
             originator[lInc] := 0;                    (* 105 + 10  *)
         for lInc := 1 to 10 do
             generated[lInc] := chr(0);                     (* 115 + 10  *)
         for lInc := 1 to 10 do
             scannum[lInc] := chr(0);
         for lInc := 1 to 10 do
             patient_id[lInc] := chr(0);                    (* 135 + 10  *)
         for lInc := 1 to 10 do
             exp_date[lInc] := chr(0);                    (* 135 + 10  *)
         for lInc := 1 to 10 do
             exp_time[lInc] := chr(0);                    (* 135 + 10  *)
         for lInc := 1 to 3 do
             hist_un0[lInc] := chr(0);                    (* 135 + 10  *)
         views:=0;                              (* 168 + 4   *)
         vols_added:=0;                         (* 172 + 4   *)
         start_field:=0;                        (* 176 + 4   *)
         field_skip:=0;                         (* 180 + 4   *)
         omax:= 0;
         omin:= 0;                          (* 184 + 8   *)
         smax:= 0;
         smin:=0;                          (* 192 + 8   *)
{below are standard settings which are not 0}
         bitpix := 8; {8bits per pixel, e.g. unsigned char}
         DataType := 2;{unsigned char}
         vox_offset := 0;
         Originator[1] := 0;
         Originator[2] := 0;
         Originator[3] := 0;
         Dim[1] := 91;
         Dim[2] := 109;
         Dim[3] := 91;
         Dim[4] := 1; {n vols}
         glMin := 0;
         glMax := 255; {critical!}
         roi_scale := 0.00392157{1.1};
    end;
end;
function SaveAnalyzeHdr (lHdrName: string; lDicomData: DicomData): boolean;
var
lF: file;
lStr : string;
lHdr: AHdr;
 lSwapBytes: boolean;
begin
 lStr := ExtractFilePath(lHdrName)+ParseFileName(ExtractFileName(lHdrName))+'.hdr';
     {if (sizeof(AHdr)> DiskFree(lStr)) then begin
        ShowMessage('There is not enough free space on the destination disk to save the header. '+lStr);
        result := false;
        exit;
     end;  }
     Result := true;
     ClearHdr (lHdr);
     if lDicomData.little_endian = 1 then
        lSwapBytes := false
     else
         lSwapBytes := true;
     lHdr.Dim[1] := lDICOMdata.XYZdim[1];
     lHdr.Dim[2] := lDICOMdata.XYZdim[2];
     lHdr.Dim[3] := lDICOMdata.XYZdim[3];
     lHdr.pixdim[2] := lDICOMdata.XYZmm[1];
     lHdr.pixdim[3] := lDICOMdata.XYZmm[2];
     lHdr.pixdim[4] := lDICOMdata.XYZmm[3];{}
     lHdr.bitpix := lDicomData.Allocbits_per_pixel;
     lHdr.bitpix := lDicomData.Storedbits_per_pixel;
     lHdr.vox_offset := lDICOMdata.ImageStart;
     lHdr.roi_scale := lDicomData.IntenScale;
     case lHdr.bitpix of
         1: lHdr.datatype := 1; {binary}
         8: lHdr.datatype := 2; {8bit int}
         16: lHdr.datatype := 4; {16bit int}
         32: lHdr.datatype := 8; {32 bit long}
         else begin
             showmessage('Unable to save Analyze header '+lHdrName+chr(13)+
               'Use MRIcro to convert this image (ezDICOM can only convert files with 8/16/32 bits per voxel.');
             result := false;
             exit;
         end;
         //4: gAHdr.datatype := 16;{float=32bits}
         //5: gAHdr.datatype := 64; {float=64bits}
     end;

     if lSwapBytes then
        SwapBytes (lHdr);{swap to sun format}
     FileMode := 2; //read/write
     AssignFile(lF,lStr); {WIN}
     Rewrite(lF,sizeof(AHdr));
     BlockWrite(lF,lHdr, 1  {, NumWritten});
     CloseFile(lF);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -