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

📄 define_types.pas

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


procedure DICOM2AnzHdr (var lBHdr: AHdr; lAnonymize: boolean; var lFilename: string; var lDICOMdata: DicomData);
var lInc,lLen: integer;
   lFilenameWOPath: string;
begin
  ClearHdr(lBHdr);
if not lAnonymize then begin
  //next: put PatientID into patient_ID array
  lLen := length(lDicomData.PatientID);
  if lLen > 10 then lLen := 10; //10=size of patient_ID array
  if lLen > 0 then
     for lInc := 1 to lLen do
      lBHdr.patient_id[lInc] := lDicomData.PatientID[lInc];
  //next: put filename into aux_file array
  lFilenameWOPath := extractfilename(lFilename);
  lLen := length(lFilenameWOPath);
  if lLen > 24 then lLen := 24; //24=size of aux_file
  if lLen > 0 then
     for lInc := 1 to lLen do
       lBHdr.aux_file[lInc] := lFilenameWOPath[lInc];
  //next: put PatientName into Descrip array
  lLen := length(lDicomData.PatientName);
  if lLen > 80 then lLen := 80; //80=size of descrip array
  if lLen > 0 then
     for lInc := 1 to lLen do
      lBHdr.descrip[lInc] := lDicomData.PatientName[lInc];
  //next: put StudyDate into exp_date array
  lLen := length(lDicomData.StudyDate);
  if lLen > 10 then lLen := 10; //10=size of exp_date array
  if lLen > 0 then
     for lInc := 1 to lLen do
      lBHdr.exp_date[lInc] := lDicomData.StudyDate[lInc];
  //next: put AcqTime into exp_time array
  lLen := length(lDicomData.AcqTime);
  if lLen > 10 then lLen := 10; //10=size of exp_time array
  if lLen > 0 then
     for lInc := 1 to lLen do
      lBHdr.exp_time[lInc] := lDicomData.AcqTime[lInc];
  //next: put Modality into generated array
  lLen := length(lDicomData.modality);
  if lLen > 10 then lLen := 10; //10=size of generated array
  if lLen > 0 then
     for lInc := 1 to lLen do
      lBHdr.generated[lInc] := lDicomData.modality[lInc];

end; //Not anonymized
  //next: fill in binary data

  lBHdr.Dim[4] := 1;//132
  //NO! Offset stripped by converter!lBHdr.vox_offset := lDicomdata.ImageStart;
  lBHdr.Originator[1] := 0;
  lBHdr.Originator[2] := 0;
  lBHdr.Originator[3] := 0;
  lBHdr.Originator[1] := lDICOMdata.XYZori[1];
  lBHdr.Originator[2] := lDICOMdata.XYZori[2];
  lBHdr.Originator[3] := lDICOMdata.XYZori[3];
  lBHdr.Dim[1] := lDICOMdata.XYZdim[1];
  lBHdr.Dim[2] := lDICOMdata.XYZdim[2];
  lBHdr.Dim[3] := lDICOMdata.XYZdim[3];
  lBHdr.Dim[4] := lDICOMdata.XYZdim[4];
  //lSlicesTot := lDICOMdata.XYZdim[3];
  lBHdr.pixdim[2]:= lDICOMdata.XYZmm[1];
  lBHdr.pixdim[3]:= lDICOMdata.XYZmm[2];
  lBHdr.pixdim[4]:= lDICOMdata.XYZmm[3];
  if lDICOMdata.IntenScale <> 0 then
     lBHdr.roi_scale := lDICOMdata.IntenScale
  else
      lBHdr.roi_scale := 1;
  if not specialsingle(lDICOMdata.IntenIntercept) then
     lBHdr.zero_intercept := lDICOMdata.IntenIntercept //1406
  else lBHdr.zero_intercept := 0;
  lBHdr.bitpix := 8; //1360
  lBHdr.datatype := 2; //1360
  if lDicomData.Allocbits_per_pixel <> 8 then begin
     if lDicomData.Allocbits_per_pixel = 32 then begin
        lBHdr.bitpix := 32;
        if lDicomData.Float then
           lBHdr.datatype := 16
        else
            lBHdr.datatype := 8;
     end else if lDicomData.Allocbits_per_pixel = 64 then begin
        lBHdr.bitpix := 64;
        lBHdr.datatype := 64;;
     end else begin //16bits per pixel
         lBHdr.bitpix := 16;
         lBHdr.datatype := 4;
     end;
  end;
end;

procedure swap4(var s : LongInt);
type
  swaptype = packed record
    case byte of
      0:(Word1,Word2 : word); //word is 16 bit
      1:(Long:LongInt);
  end;
  swaptypep = ^swaptype;
var
  inguy:swaptypep;
  outguy:swaptype;
begin
  inguy := @s; //assign address of s to inguy
  outguy.Word1 := swap(inguy^.Word2);
  outguy.Word2 := swap(inguy^.Word1);
  s:=outguy.Long;
end;

procedure Xswap4r ( var s:single);
type
  swaptype = packed record
    case byte of
      0:(Word1,Word2 : word); //word is 16 bit
      //1:(float:single);
  end;
  swaptypep = ^swaptype;
var
  inguy:swaptypep;
  outguy:swaptype;
begin
  inguy := @s; //assign address of s to inguy
  outguy.Word1 := swap(inguy^.Word2);
  outguy.Word2 := swap(inguy^.Word1);
  inguy.Word1 := outguy.Word1;
  inguy.Word2 := outguy.Word2;
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]:= 1.0;                        (* 36 + 32   *)
         vox_offset:= 0.0;
{roi scale = 1}
         //roi_scale:= 1;//0.00392157{1.1};
         zero_intercept:= 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 := 16;//vc16; {8bits per pixel, e.g. unsigned char 136}
         DataType := 4;//vc4;{2=unsigned char, 4=16bit int 136}
         //vox_offset := 0;
         Originator[1] := 0;
         Originator[2] := 0;
         Originator[3] := 0;
         Dim[1] := 256;
         Dim[2] := 256;
         Dim[3] := 1;//1341
         Dim[4] := 1; {n vols}
         glMin := 0;
         glMax := 255; {critical!}
         roi_scale := 1.0;//0.00392157{1.1};
    end;

end;

procedure SwapBytes (var lAHdr: AHdr);
var
   lInc: integer;
begin
    with lAHdr do begin
         swap4(hdrsz);
         {for lInc := 1 to 10 do
             Data_Type[lInc] := chr(0);  for chars: no need to swap 1 byte
         for lInc := 1 to 18 do
             db_name[lInc] := chr(0);}
         swap4(extents);                            (* 32 + 4    *)
         session_error := swap(session_error);                (* 36 + 2    *)
         {regular:=chr(0);                           (* 38 + 1    *)
         hkey_un0:=chr(0);}                          (* 39 + 1    *)
         for lInc := 0 to 7 do
             dim[lInc] := swap(dim[lInc]);                       (* 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:= swap(unused1);                      (* 24 + 2    *)
         datatype:= swap(datatype);                     (* 30 + 2    *)
         bitpix := swap(bitpix);                       (* 32 + 2    *)
         dim_un0:= swap(dim_un0);                      (* 34 + 2    *)
         for lInc := 1 to 4 do
             Xswap4r(pixdim[linc]);                        (* 36 + 32   *)
         Xswap4r(vox_offset);
{roi scale = 1}
         Xswap4r(roi_scale);
         Xswap4r(zero_intercept);                         (* 76 + 4    *)
         Xswap4r(funused2);                         (* 80 + 4    *)
         Xswap4r(cal_max);                          (* 84 + 4    *)
         Xswap4r(cal_min);                          (* 88 + 4    *)
         swap4(compressed);                         (* 92 + 4    *)
         swap4(verified);                           (* 96 + 4    *)
         swap4(glmax);
         swap4(glmin);                       (* 100 + 8   *)
         {for lInc := 1 to 80 do
             gAHdr.descrip[lInc] := chr(0);{80 spaces}
         {for lInc := 1 to 24 do
             gAHdr.aux_file[lInc] := chr(0);{24 spaces}
         orient:= chr(0);                            (* 104 + 1   *)
         (*originator: array [1..10] of char;                   (* 105 + 10  *)
         for lInc := 1 to 5 do
             originator[lInc] := swap(originator[lInc]);                    (* 105 + 10  *)
         swap4(views);                              (* 168 + 4   *)
         swap4(vols_added);                         (* 172 + 4   *)
         swap4(start_field);                        (* 176 + 4   *)
         swap4(field_skip);                         (* 180 + 4   *)
         swap4(omax);
         swap4(omin);                          (* 184 + 8   *)
         swap4(smax);
         swap4(smin);                          (* 192 + 8   *)
    end; {with}
end;

end.

⌨️ 快捷键说明

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